인프런 커뮤니티 질문&답변

김동민님의 프로필 이미지
김동민

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

즉시 로딩과 지연 로딩

DB에서 가져온다는 의미는 뭘까요?

작성

·

293

·

수정됨

0

간단한 질문일 것 같습니다!

지연 로딩, 즉시 로딩이란 결국 DB에 쿼리문을 날려 원하는 데이터를 어느 시점에 가지고 올지 결정하는 거잖아요.

그런데 가지고 온다는 의미가 제가 이해하고 있는 것과 맞는지 궁금합니다.

DB에서 쿼리문을 통해 데이터를 가지고 오는 것은, 해당 객체(예: Member)의 멤버변수에(name, age, address, Team 타입... 등) 값을 대입한다는 뜻일까요?

 

@Entity
public class Member {

   @Id @GeneratedValue
   private Long id;   
   private String name;
   private int age;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColum(name = "TEAM_ID")
   private Team team;

   ...
)

Member member = em.find(Member.class, "1L"); // 실행 코드

 위 코드를 예시로 들면, em.find()를 호출했을 때, DB에 저장된 id, name, age 값을 가지고 Member 객체를 만들어 줍니다.
대신, LAZY 로딩이라서 TEAM team 멤버변수엔 프록시 객체를 대신 넣어 주게 됩니다. 나중에 team 멤버변수를 사용할 일이 생기면 그제서야 해당 Member가 가진 Team의 FK를 가지고 조인되는 팀 정보를 조회하는 쿼리를 DB에 보낸다...
제 이해가 맞는지 궁금합니다!

추가로,
EAGER 로딩인 경우엔 DB에 select * from member; 쿼리문을 한 번만 보냈는데, DB에 저장된 멤버 필드가 10개라면 각각의 멤버의 Team 객체를 조회하는 쿼리문이 +10개가 즉시 DB로 보내지기 때문에 N + 1이 발생한다...
이것도 맞는 이해일까요?

감사합니다!

답변 1

1

안녕하세요. 김동민님, 공식 서포터즈 y2gcoder입니다.

DB에서 가져온다는 말에 대해서는 저도 김동민님과 동일하게 이해하고 있습니다!

N+1 문제는 약간 다릅니다. 어떻게 보면 1+N 문제라고 하는게 더 이해가 쉬울 지 모르겠습니다.

N+1 문제는 Eager Loading, Lazy Loading 할 것 없이 발생할 수 있는 문제로 엔티티(1)를 조회할 때, 연관관계에 있는 엔티티 수(N)만큼 추가로 N 개의 쿼리가 나가는 문제를 말합니다!

이는 영한님의 강의 중 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 에서 속시원하게 설명해드리고 있으니, 참고해보시면 좋겠습니다 🙂

(+ 추가로 본 강의의 설명에서도 17분 50초부터 레이지 로딩을 했을 때도 루프를 돌리면 또 쿼리가 나간다고 하셨습니다. 다만 Eager에 비해 Lazy 로 했을 때는 이러한 N+1을 해결할 수 있는 대안이 있다고 말씀해주십니다!)

감사합니다.

김동민님의 프로필 이미지
김동민
질문자

감사합니다!

김동민님의 프로필 이미지
김동민

작성한 질문수

질문하기