디자인 패턴 - Proxy Pattern

bp.chys·2020년 6월 11일
0

OOP & Design Pattern

목록 보기
16/17

프록시 패턴

  • 프록시 패턴이란 실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어하는 디자인 패턴이다.
  • 프록시란 대역이라는 뜻
  • 비용이 많이드는 연산이나 객체 생성등을 프록시 객체로 임시로 만들어놓고 실제 필요한 시점에 수행하도록 할 수 있다.
    • 이미지 로딩, JPA 지연로딩, Spring AOP 등
  • 필요한 순간에 실제 객체를 생성해 주는 가상 프록시와 실제 객체에 대한 접근을 제어하는 보호 프록시가 있다.

예시

  • 이미지를 로딩해야하는 경우 매번 큰 용량의 이미지를 불러오는 것이아니라, 객체 자체에는 경로만 가지고 있다가 실제 이미지를 화면에 보여줘야할 때만 실제 객체를 호출하여 렌더링한다.
  • 실제 이미지를 보여줘야하기 전까지 이미지 로딩을 지연할 수 있기 때문에 불필요하게 메모리를 낭비하지 않을 수 있다.

public class ProxyImage implements Image {
    private String path;
    private RealImage image;
    
    public ProxyImage(String path) {
        this.path = path;
    }
    
    public void draw() {
        if (image == null) {
            image = new RealImage(path); // 최초 접근 시 객체 생성
        }
        image.draw(); // RealImage 객체에 위임
    }
}
  • 이미지를 사용하는 ListUI 객체는 현재 proxy image를 가지고 있는지, real image를 가지고 있는지 알지 못한다.
  • proxy image를 가지고 있다고 하더라도, draw를 호출하는 시점에 proxy 객체가 real image의 메서드의 draw를 한번 더 호출해주기 때문에 기능상으로는 차이가 없다.
public class ListUI {
    private List<Image> images;
    
    public ListUI(List<Image> images) {
        this.images = images;
    }
    
    public void onScroll(int start, int end) {
        for (int i = start; i <= end; i++) {
            Image image = images.get(i);
            image.draw();
        }
    }
}

SOLID 관점에서 본 프록시 패턴

  • 단일 책임 원칙 : 실제 객체와 프록시 객체의 책임이 분리되어있다.
  • 개방 폐쇄 원칙 : 프록시 객체를 사용하는 객체 관점에서는 새로운 기능이 추가되어도 여전히 프록시 객체인지 진짜 객체인지 알 수가 없다.
  • 리스코프 치환 원칙 : 인터페이스를 구현하면서 제공하는 기능이 구현체의 메서드로 대체 가능하다.
  • 인터페이스 분리 원칙 : 프록시 객체를 사용하는 객체 관점에서 필요한 기능으로 인터페이스를 분리했다.
  • 의존성 역전 원칙 : 프록시 객체와 프록시 객체를 사용하는 객체 모두 추상화된 인터페이스에 의존한다.

결론

프록시 객체는 실제 객체의 역할(외형)을 대신하다가 실제 객체가 필요할 때, 메시지를 대신하여 호출해주는 디자인 패턴이다. 실제 객체의 생성 비용이 큰 경우 지연 로딩을 통해 불필요한 메모리 낭비를 줄일 수 있는 장점 이 있다.

프록시 패턴은 Spring AOP, JPA 지연로딩 등 실제로 프레임워크에서도 많이 사용되는 유용한 패턴이다. 원리를 잘 알아두면 좋을 것 같다.


참고자료

  • 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균
profile
하루에 한걸음씩, 꾸준히

0개의 댓글