JPA 프록시 - 가상 프록시 패턴 이해
프록시
프록시는 DB쿼리 수를 줄이기 위한 개념
Proxy는 실제 엔티티를 가져와서 대체 되는것이 아니다
‘엔티티를 참조’ 한다는 표현이 맞다
프록시 객체 설명
가상 프록시 패턴
프록시 패턴으로 기본형, 가상, 보호, 로깅, 원격, 캐싱 과 같이 다양한 패턴이 존재한다.
JPA에서는 원본 객체 생성에서 소모되는 리소스 부담을 줄이고자 실제 객체를 생성하지 않고 객체에 대한 참조만 하는 프록시 객체를 생성하는 ‘가상 프록시’패턴을 사용한다.
프록시 패턴 정의
메인 로직의 기능을 수행하는 함수를 인터페이스로 정의한다.
public interface Image {
void display();
}
프록시 객체 생성
실제 객체 RealImage를 생성하지 않고 참조를 한다 실제 객체가 필요한 시점인 display() 메서드가 수행할 때 실제 객체를 생성하고 display를 호출한다.
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName=fileName;
}
@Override
public void display(){
if (realImage==null){ // 실제 객체가 필요한 시점
realImage=new RealImage(fileName);
}
realImage.display();
}
실제 객체 생성
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
메인 실행
public static void main(String[] args) {
Image image = new ProxyImage("test.png");
// 실제 이미지 객체가 필요한 시점에서 실제 이미지 객체를 생성하고 display() 메서드를 호출합니다.
image.display();
}
이제 Image 인스턴스로 프록시 객체를 생성함으로써 필요 이전엔 가만히 있다가 이미지가 필요할 때 즉, 생성 할 시점에서 이미지 객체를 생성한다. 이와 같이 JPA에선 DB 쿼리로 인한 무분별한 접근을 프록시 패턴을 적용하여 실제 객체가 필요한 시점에 생성하도록 한다. 이는 FetchType.LAZY를 사용하여 엔티티를 가져올때 프록시 객체로 반환하게 된다. 이로서 지연로딩을 할 수 있게된다.
더 자세한 설명은 💠 프록시(Proxy) 패턴 - 완벽 마스터하기 참조