개발강의정리/Spring

[스프링 데이터 JPA] 2-4. JPA 프로그래밍 6: Fetch

nineDeveloper 2019. 11. 22.
728x90

스프링 데이터 JPA

2. 핵심 개념 이해

본격적인 스프링 데이터 JPA 활용법을 학습하기에 앞서, ORM과 JPA에 대한 이론적인 배경을 학습합니다

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/spring-data-jpa-study/tree/chap02-04-06_Fetch

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-jpa/dashboard

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

4. JPA 프로그래밍 6: Fetch

Fetch

연관 관계의 엔티티의 정보를 지금(Eager) 나중에(Lazy) 가져올지 설정
잘 조정해야 성능을 향상시킬 수 있음

  • @OneToMany의 기본값은 Lazy:
    • 기본적으로 해당 Entity의 정보를 가져올때 Lazy가 적용된 @OneToMany 관계의 Entity의 정보를 가져오지는 않음
    • 얼마나 많이 있을 지도 모르고 사용하지도 않을 값들을 다 가져오면 객체에 불필요한 정보를 로딩할 수도 있으므로
  • @ManyToOne의 기본값은 Eager: 해당 Entity의 정보를 가져올때 Eager로 설정된 @ManyToOne 관계의 Entity의 정보도 같이 가져옴

Eager 테스트

EAGER가 적용된 Entity 정보를 미리 다 가져와서 불필요한 조회를 더이상 하지 않음

Account 클래스의 studies에 EAGER 를 적용

@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Study> studies = new HashSet<>();

JpaRunner 에서 테스트

Session session = entityManager.unwrap(Session.class);
Post post = session.get(Post.class, 4l);
System.out.println("========================");
System.out.println(post.getTitle());

Lazy

Lazy가 적용된 Entity 정보를 미리 가져 오지 않음

Account 클래스의 studies에 LAZY를 적용

@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL)
private Set<Study> studies = new HashSet<>();

n+1 테스트

  • 재현되지 않음
  • fetchLazy 옵션이 적용되어 있더라도 n에 해당되는 것을 한번에 다가져와서 처리하므로 재현되지 않음
  • Hibernate의 기능 개선으로 성능상의 이슈가 크게 없을 것으로 보임
  • 너무 많은 데이터를 객체에 로딩하는 문제는 있을 수 있음
// EAGER 테스트
Session session = entityManager.unwrap(Session.class);
Post post = session.get(Post.class, 4l);
System.out.println("========================");
System.out.println(post.getTitle());

post.getComments().forEach(c -> {
    System.out.println("--------------");
    System.out.println(c.getComment());
});

Hibernate

  • load: 가져오려 할때 없으면 예외를 던짐 Proxy로도 가져올 수 있음
  • get: 무조건 DB에서 가져옴 해당하는게 없으면 예외를 던지지 않고 무조건 레퍼런스를 null로 만듬
728x90

댓글

💲 추천 글