오늘은 JPA를 공부하면서 헷갈렸던 개념 하나를 정리했다.
바로 조회전략과 쿼리 방식이다.
처음에는 둘 다 그냥 "데이터를 조회하는 방법"이라고만 단순히 생각했는데, 공부를 하다보니 둘은 완전히 다른 축의 개념이었다.
이 둘을 분리해서 이해해야 JPA를 훨씬 명확하게 볼 수 있다는 것을 알게되었다.
조회 전략은 연관된 엔티티를 언제, 어떻게 가져올지에 대한 방식이다.
조회 전략에는 다음과 같은 개념들이 있다.
LAZYEAGERFetch JoinEntityGraphLAZY는 지연 로딩 방식이다.
연관된 엔티티가 실제로 필요해지는 시점에 조회한다.
@Entity
public class Order {
@Id @GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Member member;
}
Order를 조회해도 member는 바로 조회되지 않는다.order.geteMember()를 호출하는 시점에서는 member를 조회하는 쿼리가 나간다.orderRepository.findById(1L).orElseThrow(
() -> new RuntimeException("에러 발생" ) // 이때 order를 조회
foundOrder.getId(); // 1번
foundOrder.getName(); // 2번
foundOrder.getMemberId(); // 3번
foundOrder.getMemberName(); // 4번
위의 코드일 때 member도 같이 조회되는 위치는 어디일까요?
답은 4번이다.
select
o.id,
o.member_id,
o.name
from
order o
where
o.id = ?
여기까지가 3번일때 나오는 쿼리문이다.
order테이블에 연관관계로 member_id가 있기 때문에 member_id를 조회할 때는 member가 필요없다.
select
o.id,
o.member_id,
o.name
from
order o
where
o.id = ?
Hibernate:
select
m.id,
m.name
from
member m
where
m.id = ?
하지만 member_name를 조회할 때는 member가 필요하기 때문에 그때 member를 조회한다.
EAGER는 즉시 로딩이다.
→ 💡핵심 차이점 요약
**Q.
**A.