# 프록시 (Proxy) 패턴

# 프록시 패턴이란 무엇인가요?

프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미입니다.
프록시 패턴은 대상 객체에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 역할을 하는 디자인 패턴입니다.

  • UML
    프록시 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 [코딩팩토리]