728x90
스프링 데이터 JPA
2. 핵심 개념 이해
본격적인 스프링 데이터 JPA 활용법을 학습하기에 앞서, ORM과 JPA에 대한 이론적인 배경을 학습합니다
포스팅 참조 정보
GitHub
공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다
해당 포스팅에 대한 내용의 GitHub 주소
실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다
https://github.com/freespringlecture/spring-data-jpa-study/tree/chap02-04-06_Fetch
해당 포스팅 참고 인프런 강의
실습 환경
- Java Version: Java 11
- SpringBoot Version: 2.1.2.RELEASE
4. JPA 프로그래밍 6: Fetch
Fetch
연관 관계의 엔티티의 정보를 지금(Eager) 나중에(Lazy) 가져올지 설정
잘 조정해야 성능을 향상시킬 수 있음
@OneToMany
의 기본값은 Lazy:- 기본적으로 해당 Entity의 정보를 가져올때 Lazy가 적용된
@OneToMany
관계의 Entity의 정보를 가져오지는 않음 - 얼마나 많이 있을 지도 모르고 사용하지도 않을 값들을 다 가져오면 객체에 불필요한 정보를 로딩할 수도 있으므로
- 기본적으로 해당 Entity의 정보를 가져올때 Lazy가 적용된
@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 테스트
- 재현되지 않음
- fetch에 Lazy 옵션이 적용되어 있더라도 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
'개발강의정리 > Spring' 카테고리의 다른 글
[스프링 데이터 JPA] 2-5. 스프링 데이터 JPA 원리 (0) | 2019.11.22 |
---|---|
[스프링 데이터 JPA] 2-4. JPA 프로그래밍 7: Query (0) | 2019.11.22 |
[스프링 데이터 JPA] 2-4. JPA 프로그래밍 5: Entity 상태와 Cascade (0) | 2019.11.22 |
[스프링 데이터 JPA] 2-4. JPA 프로그래밍 4: 관계 맵핑 (0) | 2019.11.22 |
[스프링 데이터 JPA] 2-4. JPA 프로그래밍 3: Value 타입 맵핑 (0) | 2019.11.22 |
댓글