-
[JPA] JpaRepository 관련 코드 들여다보기개발 지식/JPA 2023. 11. 28. 23:36
- spring data jpa를 이용하여 데이터 엑세스 계층 코드를 작성할 때 보통 다음과 같이 JpaRepository<T, ID> 를 확장하여 인터페이스를 만든다.
public interface MemberRepository extends JpaRepository<Member, Long> { }
- 서비스 계층에서 엔티티를 저장할 때 다음과 같이 save 메서드를 호출한다.
memberRepository.save(member);
- 위의 save 메서드는 CrudRepository 인터페이스에 있는 메서드로 실제 어떤 구현체의 메서드가 실행되는지 확인하기 위해서는 디버깅 과정이 필요하다. (상속관계: JpaRepository -> PagingAndSortingRepository -> CrudRepository)
테스트 예제 코드
- 해당 라인에 브레이크포인트를 걸고 디버깅 모드로 실행을 시키면 어떤 구현체가 memberRepository에 할당되는지 알 수 있다.
- 프록시 객체가 생성되었고 SimpleJpaRepository를 상속하였다는 것을 확인할 수 있다.
SimpleJpaRepository
- 해당 코드에서 주의할 점은 persist하는 경우에는 기존 entity를 리턴하고 merge하는 경우에는 메서드의 반환값을 그대로 리턴한다는 점이다.
persist와 merge의 차이
- JpaRepository의 save 메서드는 새로 생성되는 entity에 대해서는 persist, 준영속 상태의 Entity에 대해서는 merge를 수행한다.
- persist, merge 둘 다 Entity를 영속상태로 만드는 동작이다.
- 차이점은 대상 Entity가 아예 새로 만들어지는 Entity인지, 기존에 영속성 컨텍스트에 의해 관리되던 Entity인지이다. (아마 이 부분은 DB에서 기본키로 조회해서 있다면 준영속 상태로 인지하는 것일 듯 한데 내부 코드 더 살펴보기!, 이 이유가 맞을 듯 애초에 준영속 상태라는 것은 과거에 영속성 상태였던적이 있었다는 뜻이고 detach했거나 db에 저장된 후 영속성 컨텍스트가 비워졌거나 하는 경우밖에 없기 때문)
- persist의 경우, save 메서드로 넘겨준 인자와 반환값 Entity 모두 영속성 컨텍스트에 의해 관리된다.
- merge의 경우, DB에서 조회한 Entity에 대해서만 영속성 컨텍스트에서 관리하므로 반환값 Entity만 영속성 컨텍스트에 의해 관리된다.
예제 코드
- member2 객체를 새로 만들고 Id 값을 member1로 변경하게 되면 준영속 상태를 만들 수 있다.
- memberRepository.save(member2)를 하게 되면 merge가 일어나고 이후에 flush 되면 updata 쿼리가 나가게 된다.
- SimpleJpaRepository의 findById 메서드. 이 코드는 나중에 더 자세히 분석해보기!
- 결국 우리가 사용하는 Repository는 EntityManager를 생성자 주입받아서 사용한다.
참고 자료
https://hungseong.tistory.com/84
JpaRepository의 save() 메서드 내부동작 - Persist vs Merge
1. 알고자 하는 것 - JpaRepository의 save() 메서드의 동작에 대해 내부 코드를 확인한다. - 내부 코드 중 persist와 merge의 차이를 테스트코드로 확인한다. 2. 알게된 것 JpaRepository의 save 메서드 내부 확인
hungseong.tistory.com
'개발 지식 > JPA' 카테고리의 다른 글
[JPA] 영속성 전이(CASCADE)와 고아 객체 정리 (0) 2023.11.30 [JPA] Referential integrity constraint violation (0) 2023.11.29 [JPA] em.merge(entity)는 내부 코드 들여다보기 (0) 2023.11.29 [JPA] Entity 클래스의 @NoArgsConstructor(access = AccessLevel.PROTECTED) (0) 2023.11.07