반응형
1. 즉시로딩
- 엔티티를 조회할 때 연관된 엔티티도 함께 조회.
- 예를 들어 회원 엔티티와 팀 엔티티가 연관이 있는 경우 em.find(Member.class, "member1")를 호출하면 회원 엔티티와 팀 엔티티가 함께 조회된다.
- 즉시로딩을 사용하기 위해서는 @ManyToOne의 fetch 속성을 FetchType.EAGER로 지정합니다.
- 아래와 같이 Order 엔티티와 Member 엔티티가 조인쿼리를 사용하여 함께 조회된다.
- JPA 조인 전략
- 내부조인(Inner Join)이 아닌 외부조인(Outer Join)이 사용된다. 왜냐하면 JoinColoumn으로 선언된 데이터가 Null 인 경우가 있을 수 있기 때문입니다. Null인 경우 Order 정보도 조회할 수 없습니다.
- 만약 내부조인을 사용하고 싶은 경우는 엔티티에 nullable = false 처리를 하면 내부 조인을 사용하게 됩니다.
2. 지연 로딩(LAZY LOADING)
- 연관된 엔티티가 실제 사용할 때 조회합니다.
- 지연로딩을 사용하기 위해선 @ManyToOne의 fetch 속성을 FetchType.LAZY로 지정합니다.
- 아래코드와 같이 지연로딩으로 설정된 경우 연관된 엔티티 정보(Member)는 조회하지 않고 주문(Order)정보만 조회합니다.
연관된 엔티티를 조회하기 위해서는 연관 관계에 있는 변수에 '프록시 객체'를 넣어둔다. 그리고 실제 데이터가 필요한 순간에 호출하여 DB를 조회해서 프록시 객체를 초기화합니다.
3. 컬렉션 레퍼
- 엔티티에 컬력션이 있는 경우 하이버네이트가 엔티티를 영속상태로 만들 때 컬렉션을 추적, 관리하기 위해 원본 컬렉션을 하이버네이트가 제공하는 내장 컬렉션으로 변경하는데 이것을 컬렉션 레퍼라고 한다.
- 위에서 설명한 것과 같이 지연로딩의 경우 프록시 객체를 사용해서 수행하지만, 컬력션의 경우에는 컬렉션 레퍼가 지연로딩을 처리해준다. 컬렉션 레퍼도 프록시 역할은 하는 것은 동일하다.
- 기존 프록시 객체의 초기화와는 다른점은 프록시 객체에 넣어둔 후 get메소드를 호출해도 초기화되지 않습니다.
실제 컬렉션을 사용하는 것과 동일하게 컬렉션 데이터를 조회하는 메소드를 호출해야지만 초기화가 된다.
4. JPA 기본 페치(fetch) 전략
- JPA에서 연관관계의 데이터를 어떻게 가져올 것인가를 fetch(페치)라고 한다.
- 각 연관관계의 default속성은 다음과 같습니다.
-ToMany는 지연로딩, -ToOne은 즉시로딩으로 생각하면 좋습니다.- @OneToMany : LAZY
- @ManyToMany : LAZY
- @OneToOne : EAGER
- @ManyToOne : EAGER
반응형
'Backend > Spring' 카테고리의 다른 글
Spring OSIV? (0) | 2022.03.02 |
---|---|
[JPA] N+1 문제 (0) | 2022.02.28 |
JPA 프록시란? (0) | 2022.02.24 |
영속성 컨텍스트란? (0) | 2022.02.22 |
Spring Data JPA 란? (0) | 2022.02.20 |