프록시란?
프록시는 특정 객체를 감싸 프로퍼티 읽기, 쓰기와 같은 객체에 가해지는 작업을 중간에서 가로채는 객체로,
가로채진 작업은 프록시 자체에서 처리되기도하고, 원래 객체가 처리하도록 전달되기도 한다.
java에서 프록시는 RealSubject라는 자신의 기능에만 집중을 하고 그 이외 부가 기능을 제공하거나 접근을 제어하는 역할을 프록시 객체에게 위임한다.
JPA 구현체들은 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라 실제 사용하는 시점에 데이터베이스를 조회할 수 있다.
이와 관련된 기술이 프록시 인데, 이 프록시를 통해 즉시로딩과 지연로딩을 할 수 있다.
지연로딩을 사용하기 위해 실제 엔티티 객체 대신 데이터베이스 조회를 지연할 수 있도록 지원하는 가짜 객체가 필요한데 이를 프록시라 한다.
프록시 객체의 초기화
- 프록시 객체에 메소드를 호출하면 초기화가 진행
(영속성 컨텍스트에 실제 엔티티가 생성되어 있지 않으면, 데이터베이스에 접근하여 데이터를 가져와 실제 엔티티 를 생성한다) - 프록시 Entity target 인스턴스에 생성된 인스턴스의 참조를 할당
- 프록시 객체는 실제 객체의 메소드를 호출한다
즉시로딩, 지연로딩
즉시로딩은 엔티티를 조회할 때, 연관된 엔티티도 함께 조회
지연로딩은 연관된 엔팅티를 실제 사용할 때 조회
지연로딩은 연관된 엔티티 프록시로 조회하고 프록시를 실제 사용할 때 초기화 하면서 데이터베이스를 조회한다. 그러나 만약 조회대상이 영속성 컨텍스트에 존재한다면 프록시 객체가 아닌 실제 객체를 사용한다.
즉시로딩은 데이터를 불러올 때 조인 쿼리를 이용하여 연관된 모든 데이터를 조회하기 때문에 연관된 데이터가 항상 같이 사용된다면 지연로딩보다 성능이 좋다
하지만 처음부터 모든 엔티티를 영속성 컨텍스트에 올려두는 것은 현실적이지 않고, 성능도 좋지 않다
그렇다고 항상 지연로딩을 지원하도록 설정하는 것은 모든데이터를 가져온다면 조인 쿼리를 사용하는 것이 성능이 더 좋기 때문에 지연로딩, 즉시로딩은 상황에 따라 다르게 사용해야 한다.
JPA 기본 패치 전략
ManyToOne , OneToOne - 즉시로딩
OneToMany, ManyToMany - 지연로딩
연관된 엔티티가 하나의 객체라면 즉시로딩을 기본적으로 지원하고
컬렉션 이라면 지연 로딩을 지원한다
객체가 하나라면 사용 유무와 상관없이 바로 가져와도 부담이 없고 조인쿼리를 사용하여 데이터를 가져오기 때문에 성능이 더 좋을 수 있다
하지만 연관 엔티티가 많은 수 일 경우에는 사용하지 않는 엔티티를 굳이 가져올 필요가 없기 때문에 지연로딩을 사용하는 것이 더 좋다.
참고자료
https://lkhlkh23.tistory.com/87
'Spring' 카테고리의 다른 글
Spring) Swagger? 너 뭔데? 어떻게 쓰는데? (0) | 2022.12.28 |
---|---|
Spring) Spring AOP & 프록시 패턴 (0) | 2022.12.14 |
Spring) 연관관계 매핑 (1) | 2022.12.08 |
Spring) 인증, 인가 / 스프링 시큐리티 (1) | 2022.12.08 |
Sping) ORM, JPA, Spring Data JPA (0) | 2022.12.07 |