Proxy란?
JPA에서 엔티티 객체의 지연 로딩(Lazy Loading)을 지원하기 위해 사용하는 대리 객체.
실제 엔티티 객체를 생성하거나 데이터베이스에서 값을 읽어오지 않고도 엔티티의 참조를 사용할 수 있다.
지연로딩(Lazy Loading)과 즉시로딩(Eager Loading)
지연 로딩(Lazy Loading)
데이터를 실제로 사용할 때 DB에서 조회하는 방식
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
private Company company;
지연 로딩을 사용하면 연관된 객체를 Proxy로 조회한다.
실제 값에 접근할 때 조회 SQL이 실행
즉시 로딩(Eager Loading)
엔티티를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "company_id")
private Company company;
Proxy 객체를 조회하지 않고 한 번에 연관된 객체까지 조회한다.
연관된 모든 엔티티를 조인하여 한 번의 쿼리로 데이터를 가져기 때문에 불필요한 데이터 로드가 발생할 수 있다.
JPQL에서 N+1 문제 발생 -> fetch join으로 해결
@OneToMany, @ManyToMany 의 기본 값 : 지연 로딩
@ManyToOne, @OneToOne 의 기본 값 : 즉시 로딩 -> FetchType.LAZY 설정 필요
꼭 필요한 경우가 아니라면 지연 로딩을 사용!
'TIL' 카테고리의 다른 글
| TIL 250108 (0) | 2025.01.08 |
|---|---|
| TIL 250107 (0) | 2025.01.07 |
| TIL 241219 (0) | 2024.12.19 |
| TIL 241213 (0) | 2024.12.13 |
| TIL 241129 (1) | 2024.11.29 |