JPA 즉시로딩과 지연로딩에 대해
본 내용은 자바 ORM 표준 JPA 프로그래밍 책을 토대로 정리했습니다.
JPA는 즉시로딩과 지연로딩이 있다.
- 즉시 로딩: 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다.
ex) em.find(Member.class, "member1") 를 호출할 때 Member 엔티티와 연관된 팀 엔티티도 함께 조회한다.
@ManyToOne(fetch = FetchType.EAGER)
이렇게 EAGER를 이용해서 설정해준다.
- 지연 로딩: 연관된 엔티티를 실제 사용할 때 조회한다.
ex) membet.getTeam().getName() 처럼 조회한 Team 엔티티를 실제 사용하는 시점에서 JPA가 SQL을 호출해서 팀 엔티티를 조회한다.
@ManyToOne(fetch = FetchType.LAZY)
이렇게 LAZY를 이용해서 설정해준다.
즉시 로딩은 말 그대로 즉시 로딩이다. Member 엔티티 안에 Team이 들어가 있을 때에 조인을 해서 두 엔티티를 모두 조회한다.
만약 포함된 엔티티 수가 많으면 엄청나게 조인이 많이 엮이게 될 것이다.
지연 로딩은 Member 엔티티를 조회할 때에 회원만 딱 조회하고 팀은 조회하지 않는다. 그저 해당 team 에 프록시 객체만 넣어둘 뿐이다. 실제 사용될 때까지 데이터 로딩을 미룬다. 그래서 지연로딩이라고 부른다. 이제 이 team 을 조회할 때에 그때 초기화 하기 위해 SQL문을 실행하게 된다.
@ManyToOne
은 기본값이 즉시로딩이다. 따라서 (fetch = FetchType.LAZY)
를 꼭 붙여줘야 한다.
모든 관계에 지연 로딩을 사용하는 것이 좋다. 즉시 로딩은 n+1 문제를 야기하기 떄문이다.
만약 이 엔티티는 같이 조회했으면 좋겠다 싶으면 fetch 조인을 이용하는 방법을 택하면 될 것이다.
'Spring' 카테고리의 다른 글
[JPA] 값 타입에 대해 (0) | 2020.11.01 |
---|---|
[JPA] 영속성 전이(CASCADE)와 고아 객체에 대해 (0) | 2020.10.30 |
[JPA] 기본 키 매핑 전략에 대해 (0) | 2020.10.30 |
[JPA] 연관관계 매핑에 대해 (0) | 2020.10.30 |
[JPA] 프록시와 연관관계에 대해 (0) | 2020.10.30 |