반응형
지연로딩(FetchType.LAZY)
- 실제 객체를 사용하는 시점에 데이터를 조회한다.
예시)
@Entity
public class Member {
@Id
Long id;
String name;
@ManyToOne(fetch = FetchType.LAZY)
Team team;
}
- Member를 조회하면 id와 name에는 MEMBER 테이블을 조회해서 획득한 데이터가 저장되어 있다.
- team에는 프록시객체가 대입되어 있다. (Team객체가 대입되어 있지 않다.)
- getTeam() 메소드를 실행해서 Team을 조회하면 프록시 객체가 반환된다.
- getTeam().getXXX() 메소드를 실행하면 비로소 SQL을 실행해서 DB에서 데이터를 조회한다.
- 위의 예시에서는 SQL이 2번 실행된다.
select ...
from member
where ... - select ...
from team
where ...
즉시로딩(FetchType.EAGER)
- fetch타입을 EAGER로 설정하면 즉시 로딩으로 설정된다.
- 데이터를 사용할 때 연관관계에 있는 테이블의 정보도 항상 같이 사용된다면 즉시로딩으로 설정할 수 있다.
- 즉시로딩으로 지정하면 조인을 사용해 SQL을 한번만 실행해서 데이터를 한번에 조회한다.
예시)
@Entity
public class Member {
@Id
Long id;
String name;
@ManyToOne(fetch = FetchType.EAGER)
Team team;
}
- team에는 TEAM 테이블을 조회해서 획득한 팀정보가 저장된 Team객체가 대입되어 있다.
- 조인을 사용해서 SQL이 1번 실행된다.
select
from member
join on team
where member.xxx = team.xxx
사용방법
- 실무에서는 가급적
(!!!무조건)
지연로딩(LAZY)만 사용 - 즉시로딩은 N+1문제를 일으킨다.
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-연관관계OneToMany-...의-즉시로딩과-지연로딩
'BackEnd > Spring' 카테고리의 다른 글
[Spring] REST API (0) | 2025.01.19 |
---|---|
[Spring JPA] 스프링 애플리케이션의 JPA open-in-view 설정 (Feat. 지연로딩) (0) | 2025.01.19 |
[Spring JPA] Spring Data JPA의 쿼리 메소드 작성 규칙 (0) | 2025.01.19 |
[Spirng JPA] 단방향/양방향 연관관계 (0) | 2025.01.19 |
[Spring] form태그 하나로 등록, 수정 함께 컨트롤하기 (0) | 2025.01.19 |