본문 바로가기
카테고리 없음

[JPA, DB] eager & lazy

by hbIncoding 2024. 3. 13.

1. eager & lazy 예시

  • eager
    • Member 테이블과 Team 테이블이 있고 양방향 매핑 관계이며 ManyToOne이다.
    • Member를 조회한다고 할때 eager라면 아래와 같이 쿼리가 나간다.
Hibernate: 
    select
        member0_.MEMBER_ID as MEMBER_I1_0_0_,
        member0_.TEAM_ID as TEAM_ID3_0_0_,
        member0_.USERNAME as USERNAME2_0_0_,
        team1_.TEAM_ID as TEAM_ID1_1_1_,
        team1_.name as name2_1_1_ 
    from
        Member member0_ 
    left outer join
        Team team1_ 
            on member0_.TEAM_ID=team1_.TEAM_ID 
    where
        member0_.MEMBER_ID=?
  • lazy의 경우
Hibernate: 
    select
        member0_.MEMBER_ID as MEMBER_I1_0_0_,
        member0_.TEAM_ID as TEAM_ID3_0_0_,
        member0_.USERNAME as USERNAME2_0_0_ 
    from
        Member member0_ 
    where
        member0_.MEMBER_ID=?

 

2. eager & lazy 차이

  • 위와 같이 eager는 관련된 모든 객체를 요구한다. 
  • 반대로 lazy의 경우 조회한 객체만 조회하며 나머지 데이터는 조회를 미룬다.
  • 어떤 것이 더 좋을지는 설계와 사용에 따라 달려있다.
    • member를 부를때 team 정보도 반드시 사용하는 경우가 잦다면 eager가 훨씬 나을것이다.
    • 반대로 그런 경우가 적다면 query를 낭비하는 경우가 빈번하게 발생하는 것이다.
    • 하지만 이분법적인 경우 외에도 함께 조회되는 정보의 양이나 개발환경에 따라 어떤게 적절한지 테스트해볼 필요가 있다.

3. 참조

 

[JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1)

이전 글에서 Proxy에 대해 살펴보았다. Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자

velog.io