# 프록시 (Proxy) 패턴
# 프록시 패턴이란 무엇인가요?
프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미입니다.
프록시 패턴은 대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴입니다.
- UML
# 프록시가 사용되는 대표적인 3가지
- 가상프록시
: 꼭 필요로하는 시점까지의 객체의 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을 때 사용하는 패턴입니다. - 원격프록시
: 원격 객체에 대한 접근을 제어 로컬 환경에 존재하며, 원격객체에 대한 대변자 역할을 하는 객체 서로다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하게 만드는 패턴입니다. - 보호프록시
: 주체 클래스에 대한 접근을 제어하기 위한 경우에 객체에 대한 접근 권한을 제어하거나 객체마다 접근 권한을 달리하고 싶을때 사용하는 패턴으로 프록시 클래스에서 클라이언트가 주체 클래스에 대한 접근을 허용할지 말지 결정하도록 할수가 있습니다.
# 예시 코드
Client가 Image코드를 바꾸지 않고 Image가 실행되기 전에 Image 로딩 시간이 얼마나 걸리는 지 확인하고 싶어한다고 할 때,
프록시 패턴을 사용하여 이를 실행해보겠습니다.
- Image 객체
public interface Image {
void displayImage();
}
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
}
@Override
public void displayImage() {
System.out.println("Displaying " + fileName);
}
}
- Proxy 객체
public class ProxyImage implements Image {
private Image image;
private String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
@Override
public void displayImage() {
long before = System.currentTimeMillis();
if (image == null) {
image = new RealImage(fileName);
}
realImage.displayImage();
System.out.println(System.currentTimeMillis() - before); // 로딩시간 계산
}
}
- Proxy 사용
public class Main {
public static void main(String[] args) {
Image image1 = new ProxyImage("test1.png"); // 프록시를 사용하여 호출한다.
Image image2 = new ProxyImage("test2.png"); // 가짜 객체만 우선 생성
image1.displayImage(); //이 때 진짜 객체가 생성됨.
image2.displayImage();
}
}
# 프록시 패턴의 장점은 무엇인가요?
- 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있습니다. (OCP)
- 기존 코드가 해야 하는 일만 유지할 수 있습니다. (SRP)
- 기능 추가 및 초기화 지연등으로 다양하게 활용할 수 있습니다.
# 프록시 패턴의 단점은 무엇인가요?
- 코드의 복잡도가 증가합니다.
# 실제로 사용한 프록시 패턴을 사용한 예는 무엇인가요?
- 스프링 AOP
- 프록시 서버 : nginx (node.js 거버 사용할때 사용), cloudflare
TIP
프록시 서버란?
프록시 서버는 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킵니다.
# 참고자료
출처: 주홍철.면접을 위한 CS 전공지식 노트.서울:길벗,2022.
출처: https://kingchan223.tistory.com/305?category=894627 [어제보다 오늘 더]
출처: https://coding-factory.tistory.com/711 [코딩팩토리]