JAVA

[JAVA] 프록시패턴

집한구석 2021. 12. 9. 23:56
728x90

정의

  • 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
  • 실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어하는 패턴

사용하는 용도

  • 초기화 지연, 접근제어, 로깅, 캐싱 등 다양하게 응용해서 사용함
  • 접근제어 (권한에 따른 접근 차단 / 캐싱 / 지연 로딩)
  • 부가기능 추가 (원래 제공하는 기능에 더해서 부가 기능을 수행)

예시

//인터페이스 정의
public interface Subject {
    String operation();
}

//인터페이스 상속한 실제 객체 
@Slf4j
public class RealSubject implements Subject {

    @Override
    public String operation() {
        log.info("실제 객체 호출");
        sleep(1000);
        return "data";
    }

    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

//가짜 객체 프록시 객체 (캐싱기능 추가)
@Slf4j
public class CacheProxy implements Subject {

    private Subject subject;
    private String cache;

    public CacheProxy(Subject subject) {
        this.subject = subject;
    }

    @Override
    public String operation() {
        log.info("프록시동작");
        if (cache == null) {
            cache = subject.operation();
        }
        return cache;
    }
}

//프록시 실행하는 구현체
public class ProxyPatternClient {

    private Subject subject;

    public ProxyPatternClient(Subject subject) {
        this.subject = subject;
    }

    public void execute() {
        subject.operation();
    }
}

//실제 객체는 한번호출하고 나머지 두번은 프록시 호출
public class ProxyPatternTest {
    @Test
    void proxyTest() {
        RealSubject realSubject = new RealSubject();
        CacheProxy cacheProxy = new CacheProxy(realSubject);
        ProxyPatternClient proxyPatternClient = new ProxyPatternClient(cacheProxy);
        proxyPatternClient.execute();
        proxyPatternClient.execute();
        proxyPatternClient.execute();
    }
}

특징

  • 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있음
  • OCP (개방 폐쇄의 원칙) / SRP (단일책임의 원칙)을 지킬 수 있음
  • 기존 코드가 해야하는 일만 유지할 수 있음
  • 코드 복잡도가 증가한다는 단점이 생김

'JAVA' 카테고리의 다른 글

[JAVA] 리플렉션  (0) 2021.12.12
[JAVA] 데코레이터 패턴  (0) 2021.12.10
[JAVA] ThreadLocal  (0) 2021.12.03
[JAVA] 템플릿 메소드 패턴  (0) 2021.11.29
[JAVA] 전략패턴  (0) 2021.11.29