블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
JPA의 Fetch
Fetch는 Entity를 조회할때, 그 Entity와 연관관계가 있는 다른 Entity의 정보를 어느 시점에 가지고 오는지 결정해준다.
Fetch의 타입은 2가지가 있다.
LAZY
Fetch TypeEAGER
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
- 처음
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
Left Outer Join
으로 조회시 연관관계가 있는ROLE Entity
정보도 함께 가지고 온다.
반응형
'Backend > Spring Boot' 카테고리의 다른 글
Spring @RequestBody, Java 객체에 JSON 데이터를 매핑 (0) | 2021.05.17 |
---|---|
Spring @RestController 를 이용하여 REST API 개발 (0) | 2021.05.17 |
Spring Boot에서 AOP 구현 (Aspect Oriented Programming) (0) | 2021.03.11 |
Spring Boot 에서 JWT 적용 (Maven 환경) (0) | 2021.01.21 |
SpringBoot, Junit5에서 REST API(Controller) 테스트 (0) | 2021.01.15 |