최근 TIL을 많이 쓰지 못했다.
어느순간부터 양질의 내용을 정리해야한다는 강박이 생겼던 것 같다.
그래도 공부는 꾸준히 하고있다. 🙂↕️
저번주부터 Spring, JPA 학습을 시작했는데, 양이 너무 방대해서 깜짝 놀랐다.
하나하나 세세하게 공부하다가는 프로젝트를 시작도 못 할 것 같아서, 일단은 숲을 그려보는 느낌으로 훑어보았다.
아직은 좀 얕게 공부한 편이라 기술 블로그처럼 제대로 정리하기는 무리라고 판단했다.
물론 기록에 의의를 두고 대충 쓸 수도 있다. 하지만 누군가가 읽을 수도 있는건데 기왕 쓰는거 제대로 된 정보를 전달하고싶달까.
아무튼, 제대로 정리 하려면 시간이 2시간 가까이 걸려서 부담스럽고, 그렇다고 대충 작성하는 것은 성격에 맞지 않는다.
그래서 지식 공유를 목적으로하는 글은 좀 더 공부하면서 내용이 어느정도 구조화되면 TIL과 별개로 작성할 생각이다.
TIL은 TIL 답게 하루동안 배운 것들을 회고하는 느낌으로 간략하게 작성하려 한다.
이전에는 TIL을 작성하는 목적을 명확하게 정립하지 못했는데,
이제부터 TIL은 꾸준함을 보여주는 것을 목적으로 작성해나갈 생각이다.
24. 12. 16 기록
JpaRepository<T, ID>
JpaRepository<T, ID>는 JPA를 사용하는 저장소 인터페이스다.
T는 엔티티 클래스의 타입을, ID는 엔티티의 기본 키 타입을 나타낸다.
Spring Data JPA는 JpaRepository 인터페이스를 구현한 클래스를 자동으로 생성한다.
기본적으로 SimpleJpaRepository 클래스를 구현체로 사용한다.
인터페이스 및 클래스 정리⬇️
[All Superinterfaces (상위 인터페이스)] | |
CrudRepository<T, ID> | 기본적인 CRUD (Create, Read, Update, Delete) 기능 제공 |
ListCrudRepository<T, ID> | 리스트 형식으로 CRUD 작업을 할 수 있는 기능을 제공 |
ListPagingAndSortingRepository<T, ID> | 페이지네이션 및 정렬 기능을 포함한 리스트 기반 CRUD 작업을 할 수 있는 기능 제공 |
PagingAndSortingRepository<T, ID> | 페이지네이션과 정렬 기능을 제공 |
QueryByExampleExecutor<T> | Example 객체를 사용하여 쿼리를 실행하는 기능 제공 |
Repository<T, ID> | 저장소의 기본 인터페이스 |
[All Known Implementing Classes(구현 클래스)] | |
QuerydslJpaRepository | Querydsl을 사용하여 동적 쿼리를 실행하는 기능을 추가로 제공 |
SimpleJpaRepository | 기본적인 JPA 저장소 기능 구현 |
save( )
CrudRepository<T, ID>의 save( ) 메서드는 Entity를 저장하는 역할을 한다.
<S extends T> S save(S entity)
• 매개변수 S는 Entity T의 하위 타입이다. 즉, S는 T 또는 T를 상속받은 타입이어야한다.
• save( ) 메서드는 매개변수로 받은 Entity를 저장하고, 저장된 Entity를 반환한다.
(※매개변수와 반환값은 null이어서는 안 된다. null일 경우 IllegalArgumentException 발생.)
• save( ) 작업은 Entity 인스턴스를 완전히 변경할 수 있으므로 반환된 인스턴스를 사용하는 것이 좋다.
구현체 없이 save( )를 사용할 수 있는 이유가 뭘까
일정 CURD를 구현하는 과정에서 구현체 없이 JpaRepository<T, ID>를 extends하는 것 만으로도 save() 메서드를 사용할 수 있는 이유가 궁금했다.
이 부분은 Spring Data JPA가 내부적으로 어떻게 동작하는지 알면 대략적으로 이해할 수 있다.
[Spring Data JPA의 내부 동작]
Spring Data JPA는 런타임 시 자동으로 리포지토리 인터페이스의 구현체를 생성한다.
1. Repository 인터페이스 정의
먼저, BoardRepository와 같은 리포지토리 인터페이스를 정의한다.
public interface BoardRepository extends JpaRepository<Board, Long> {
...
}
2. Spring Data JPA 설정, 프록시 객체 생성
Spring Data JPA는 애플리케이션이 시작될 때 리포지토리 인터페이스를 스캔하고, BoardRepository 인터페이스의 프록시 객체를 생성한다.
하지만 모든 메서드 호출은 SimpleJpaRepository 클래스와 같은 실재 구현체에 위임한다.
3. 작업 수행
프록시 객체는 SimpleJpaRepository와 같은 실제 구현체를 사용하여 데이터베이스 작업을 수행한다.
아직 프록시에 대해 정확히 알지 못해서 설명이 정확하지 않을 수도 있다.
그래도 어떤 매커니즘인지는 대략적으로 이해했다.
오늘의 TIL은 여기까지.
자잘한 내용은 담지 않고 굵직한 내용만 간단히 정리했다.
그리고 오늘로써 본격적으로 일정 관리 앱 과제 구현에 돌입했다.
API 명세 작성과 테이블 설계를 했고, 현재 CRUD를 구현중이다.
API명세에는 추후에 400번대 응답에 대한responseBody도 추가할 예정이다.
항상 문서 작성 시간이 왜 이렇게 오래 걸리는지 모르겠다. 😅
중간중간 궁금한게 생기면 계속 찾아보느라 다른 길로 새서 그런 것 같기도하고, 한 문장 한 문장 신중하게 적어서 그런 것 같기도 하다. 팍팍 써내려가는 연습도 해야지.
'TIL > 데일리 기록' 카테고리의 다른 글
[TIL] 데이터가 없으면 - 200? 404? (1) | 2024.12.17 |
---|