Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Parallel Old GC
- 생산자 소비자 패턴
- Java
- Resilinece4j
- 체인 패턴
- 배치
- saga pattern
- thread
- Serial GC
- 디자인 패턴
- Spring Boot Actuator
- JPA
- Transaction Pattern
- 타입스크립트
- zipkin
- 스레드
- Spring Cloud Netfilx Eureka
- TypeScript
- MSA
- spring batch
- 키클락
- The law of Demeter
- 멀티스레드
- java 정렬
- 사가 패턴
- 디자인패턴
- spring cloud
- 스프링 배치
- Action Pattern
- 알고리즘
Archives
- Today
- Total
PSD( Private-Self-Development )
JPA 의 프록시, 지연 로딩, 즉시 로딩 본문
프록시(Proxy)란?
"대리"를 의미한다.
JPA에서는 엔티티 조회 시, em.find() 가 아닌 em.getReference()로 지연 조회 시
조회 결과 값으로 이 가짜( 프록시 )를 조회해 온 후
이후 실 사용 시 조회 및 실 엔티티에 프록시 엔티티를 연결하는 역할로 사용된다.
프록시 특징
- 프록시는 첫 사용 시 한번만 초기화 된다.
- 초기화 시 프록시가 실 엔티티로 변경 되지는 않는다.
- 따라서 타입 체크 시 == 비교가 아닌 instance of 로 비교 해야한다.
- 영속성 컨텍스트에 해당 엔티티가 이미 있다면
getReference 시 실제 엔티티가 반환된다. - 영속성 컨텍스트 에서 제거 된 경우, 프록시 초기화 시도 시 에러 발생
프록시 상태 확인 함수
프록시 초기화 여부 확인
emf.getPersistanceUnitUtil().isLoaded( entity );
프록시 강제 초기화( JPA 표준은 아니다. )
org.hibernate.Hibernate.initialize( entity );
지연 로딩
연관 관계의 엔티티 조회를 프록시로 되게 끔 하는 것
@ManyToOne( fetch = FetchType.LAZY ) // 지연 로딩 설정
@JoinColumn( name = "TEAM_ID" )
private Team team;
team 의 무엇인가를 실제 사용하는 시점에 조회
즉시 로딩
연관 관계의 엔티티 조회되도록 하는 것
@ManyToOne( fetch = FetchType.EAGER ) // 즉시 로딩 설정
@JoinColumn( name = "TEAM_ID" )
private Team team;
팁!
- 가급적 지연 로딩을 사용하자.
- 즉시 로딩 사용 시 예상치 못한 sql 이 발생
- 즉시 로딩은 JPQL 에서 N + 1 문제를 일으킨다.
- @ManyToOne, @OneToOne 은 기본이 즉시 로딩이기 때문에
LAZY 설정을 해주자 - @OneToMany, @ManyToMany 은 기본이 지연 로딩
참조 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'Backend > JPA' 카테고리의 다른 글
JPA 의 쿼리 작성 라이브러리 (0) | 2022.10.20 |
---|---|
JPA 값 타입 (0) | 2022.10.14 |
JPA 의 상속 (0) | 2022.10.11 |
JPA의 DB 매핑 (0) | 2022.10.06 |
JPA의 영속성 컨텍스트 (0) | 2022.10.06 |