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 조회 발생
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] JPQL 날짜 조회 시 원치않는 타임존이 붙는다면? (0) | 2023.04.19 |
---|---|
[JPA] JPA setter 사용하지 않는 이유 (0) | 2023.04.14 |
[JPA] JPA Entity Id를 String 으로 설정하기 (0) | 2023.04.10 |
[JPA] 복합키 설정 방법(@EmbeddedId, @IdClass) (0) | 2023.03.28 |
[JPA] Order by multiple Columns (0) | 2023.02.24 |