memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

JPA의 Fetch

Fetch는 Entity를 조회할때, 그 Entity와 연관관계가 있는 다른 Entity의 정보를 어느 시점에 가지고 오는지 결정해준다.

 

Fetch의 타입은 2가지가 있다.

  • LAZY Fetch Type
  • EAGER Fetch Type

 

LAZY Fetch Type (지연 로딩)

Lazy는 '게으른'이란 뜻을 가지며, 사전 의미처럼 LAZY Fetch 타입은 실제로 엔티티 조회시에 바로 가지고 오지 않고, 연관 관계에 있는 엔티티를 참조할때 그때 가지고 온다.

 

예를들어, 사용자(User) 와 사용자 권한(Role) 정보를 담은 Entitiy가 있고, 2개의 Entity는 서로 1:1 관계를 이룬다고 하자

 

테스트 코드

@Entity
@Table(name = "user")
@Getter
@Builder
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class User {

    // ...중략...
    
    @OneToOne(fetch = FetchType.LAZY)
    private Role role;
}
@BeforeEach
void setUp() {
    em.persist(Role.builder()
            .roleName("ROLE_USER")
            .build());
    em.persist(User.builder()
            .username("user01")
            .password("12341234")
            .role(em.find(Role.class, 1L))
            .build());
    em.flush();
    em.clear();
}

@Test
@DisplayName("User find 테스트")
void findTest() {
    // when
    User user = em.find(User.class, 1L); // (1)

    // then
    assertEquals("user01", user.getUsername());
    assertEquals("ROLE_USER", user.getRole().getRoleName()); // (2)
}

 

총 2번 조회한다.

  • (1) USER 테이블만 조회
  • (2) USER와 ROLE 테이블을 Left Outer Join으로 조회

 

실행된 Query

LAZY 전략

  • 처음 em.find(User.class, 1L); 에서는 USER 테이블만 조회 한다.
  • user.getRole().getRoleName()에서 USER와 ROLE 테이블을 Left Outer Join하여 조회한다.

 

EAGER Fetch Type (즉시 로딩)

반대로 EAGER는 LAZY와 다르게 엔티티 조회시에 바로 연관관계에 있는 모든 Entity를 가지고 온다.

 

테스트 코드

@Entity
@Table(name = "user")
@Getter
@Builder
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class User {

    // ...중략...
    
    @OneToOne(fetch = FetchType.EAGER)
    private Role role;
}
@Test
@DisplayName("User find 테스트")
void findTest() {
    // when
    User user = em.find(User.class, 1L);

    // then
    assertEquals("user01", user.getUsername());
    assertEquals("ROLE_USER", user.getRole().getRoleName());
}

실행된 Query

EAGER 전략

  • Left Outer Join으로 조회시 연관관계가 있는 ROLE Entity 정보도 함께 가지고 온다.
반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!