728x90
반응형

Repository find 와 entityManager로 조회하는 것의 차이점

기본적으로 Repository를 사용하면 JpaRepository를 상속받은 인터페이스를 사용하기에 EntityManager가 자동으로 주입됨

그렇다면 entityManager로 조회하는 것과 repository로 조회하는 것의 차이가 없는 것 아닐까?

기본적으로는 맞음

 


memberId로 Member Entity 객체 조회하기

하지만 나의 경우와 같이 memberId로 Member 객체를 조회하는 경우는 조금 다를 수 있음

orderRepository.findByMemberMemberId(1L) 을 실행하면 Spring Data JPA에서 제공하는 메소드를 이용한 조회 방식

Order 엔티티와 Member 엔티티가 연관되어 있을 때, Order 엔티티를 먼저 조회한 후 Member 엔티티를 조회하는 방식

 

entityManager.getReference(Member.class, 1L) 는 EntityManager를 이용해 직접 Order 엔티티 조회하는 방식

이 경우 Member 엔티티를 기준으로 조회하기에 연관된 Order 엔티티는 조회하지 않음

그렇기에 성능상 entityManager를 사용하는 것이 더 좋아보임

 

그렇지만 Entity에 FetchType.LAZY로 설정해놨다는 가정하에 memberRepository.findById(1L)과 entityManager.getReference(Member.class, 1L)은 성능상 큰 차이가 없어보임

 


+) entityManager.getReference()와 entityManager.find()는 어떤 차이가 있을까?

entityManager.getReference는 엔티티를 조회하는 대신 프록시 객체를 반환하기에 실제 엔티티를 사용하지 않는 경우에는 DB 조회를 하지 않음 → 그렇기에 DB 조회를 최소화 시킬 수 있음

entityManager.find는 해당 엔티티를 반환하지 않더라도 지정한 엔티티에 해당하는 데이터를 DB에서 가져와서 영속성 컨텍스트에 저장함  DB 조회 발생

 

반응형
복사했습니다!