프록시 패턴
특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)을 제공합니다.
즉, 진짜 객체를 보호하기위해 가짜 객체를 노출하여 진짜 객체의 보안을 강화하는 패턴입니다.
특징
- 클라이언트가 실제 객체에 직접 접근하는 것을 제어할 수 있습니다.
- 필요한 시점에 실제 객체를 생성하거나 초기화하는 등의 지연 로딩을 구현할 수 있습니다.
장점
- 객체에 대한 직접적인 접근을 제한하고 특정 권한이나 보안을 강화할 수 있습니다.
- 필요한 경우에만 객체를 생성하고 초기화하여 자원을 효율적으로 활용할 수 있습니다.
단점
- 코드의 구조가 더 복잡해질 수 있습니다.
- 지연 로딩으로 인해 성능 저하가 될 수 있다.
지연 로딩을 위해 로딩이 필요한 순간까지 프록시를 유지해야 하므로 추가적인 메모리 사용량이 발생할 수 있고
지연 로딩된 객체에 접근할 때마다 쿼리 실행이 필요할 수도 있기 때문입니다.
종류
- 원격 프록시 : 클라이언트는 로컬에서 마치 원격에 있는 것처럼 프록시 객체를 호출하고, 프록시 객체가 실제 객체를 관리하며 필요에 따라 원격 서버에 요청을 전달합니다.
- 가상 프록시 : 리소스가 많이 필요한 객체를 필요할 때까지 생성하지 않고, 대신 가벼운 프록시 객체를 사용하여 필요한 시점에 실제 객체를 생성하는 방식입니다.
- 보호 프록시 : 실제 객체에 대한 접근을 제어하여 보안이나 권한 검사를 수행합니다.
- 동적 프록시 : 런타임에 프록시 객체를 생성하는 방식입니다.
프록시 패턴 사용 예제
가상 프록시를 사용해 지연로딩 예제를 만들어 보겠습니다.
public interface Picture {
void display();
}
public class RealPicture implements Picture {
private String name;
public RealPicture(String name) {
this.name = name;
}
@Override
public void display() {
System.out.println(name + "사진 업로드");
}
}
public class ProxyPicture implements Picture {
private RealPicture realPicture;
private String name;
public ProxyPicture(String name) {
this.name = name;
}
@Override
public void display() {
if (realPicture == null) {
realPicture = new RealPicture(name);
}
realPicture.display();
}
}
public class Test {
public static void main(String[] args) {
Picture 강아지 = new ProxyPicture("강아지");
System.out.println("==========================");
Picture 고양이 = new ProxyPicture("고양이");
System.out.println("==========================");
강아지.display();
System.out.println("==========================");
고양이.display();
}
}
//==========================
//==========================
//강아지사진 업로드
//==========================
//고양이사진 업로드
결과를 보면 알 수 있듯이 실제로 display() 메소드를 호출하기 전에는 로딩이 되지 않고 호출한 후에 로딩이 되는 것을 알 수 있습니다.
'개발 도서' 카테고리의 다른 글
디자인 패턴 - 컴포지트 패턴 (1) | 2023.12.19 |
---|---|
디자인 패턴 - 반복자 패턴 (0) | 2023.12.19 |
디자인 패턴 - 템플릿 메소드 패턴 (0) | 2023.12.16 |
디자인 패턴 - 어댑터 패턴과 퍼사드 패턴 (0) | 2023.12.12 |
디자인 패턴 - 커맨드 패턴 (0) | 2023.12.09 |