본문 바로가기
Web/JPA

[JPA] 지연 로딩/즉시 로딩

by foreverever 2019. 6. 20.
반응형

1. 프록시 객체

  • 가짜 객체
  • 지연로딩 기능을 사용하기 위해 쓰임
  • 실제 객체에 대한 참조를 가짐

2. 지연로딩

  • 연관된 엔티티를 실제 사용할 때 조회

  • answer.getQuestion().getName() 처럼 질문 엔티티를 실제 사용하는 시점에 JPA가 SQL을 호출하여 질문 엔티티를 조회한다.

  • 설정 : @ManyToOne(fetch = FetchType.LAZY)

예제 (Test Code)

1) Answer Entity

@ManyToOne의 fetch타입을 지연로딩(FetchType.LAZY)로 지정한다.

 

2) Answer 엔티티 조회

test코드에서 answerRepository.findById(1L)를 수행하여, 해당 answer 엔티티를 조회한다.

 

2_1) 지연로딩 실행 SQL

sql문을 보면, 단순히 answer만 조회하는 것을 볼 수 있다.

 

3) Answer 엔티티와 연관된 Question 엔티티 조회

 

3_1) 지연로딩 실행 SQL

question 엔티티를 조회할 때 select문을 호출하는 것을 볼 수 있다.

3. 즉시로딩

  • 엔티티를 조회할 때 연관된 엔티티도 함께 조회
  • em.find(Answer.class, "answer1")를 호출할 때 답변 엔티티와 연관된 질문 엔티티도 함께 조회한다.
  • 설정 : @ManyToOne(fetch = FetchType.EAGER)

예제 (Test Code)

1) Answer Entity

@ManyToOne의 fetch타입을 즉시로딩(FetchType.EAGER)로 지정한다.

 

2) Answer 엔티티 조회

 

2_1) 즉시로딩 실행 SQL 

즉시로딩인 경우, answer엔티티만 조회하더라도, answer와 question을 조인해서 한 번에 조회하는 것을 볼 수 있다.

 

3) Answer 엔티티와 연관된 Question 엔티티 조회

3_1) 즉시로딩 실행 SQL

즉시로딩이기 때문에 추가 sql문 없이, 이미 로딩된 question엔티티를 통해 question의 이름을('질문1') 출력하는 것을 볼 수 있다.

반응형

'Web > JPA' 카테고리의 다른 글

[JPA] 트랜잭션  (0) 2019.05.29
[JPA] 영속성 컨텍스트 (Persistence context)  (0) 2019.05.28