[JAVA] 프록시패턴

2021. 12. 9. 23:56·JAVA
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
'JAVA' 카테고리의 다른 글
  • [JAVA] 리플렉션
  • [JAVA] 데코레이터 패턴
  • [JAVA] ThreadLocal
  • [JAVA] 템플릿 메소드 패턴
집한구석
집한구석
  • 집한구석
    tgyun615.info
  • 전체
    오늘
    어제
    • 카테고리 (183)
      • JAVA (38)
      • SPRING (15)
      • KOTLIN (23)
      • NETTY (1)
      • DEVOPS (3)
      • DOCKER (7)
      • KUBERNETES (2)
      • JAVASCRIPT (1)
      • SPLUNK (3)
      • ELK (7)
      • KAFKA (2)
      • GO (4)
      • ALGORITHM & DATA STRUCTURE (9)
      • IDE (5)
      • OS (16)
      • NETWORK (14)
      • GCP (2)
      • AWS (2)
      • DATABASE (10)
      • CLEANCODE (7)
      • OTHER (12)
  • 최근 글

  • 태그

    ElasticSearch
    Elk
    이펙티브 코틀린
    Kafka
    splunk
    클린코드
    이펙티브코틀린
    자바
    프로그래머스
    cleancode
    go
    JPA
    Spring
    IntelliJ
    SQL
    코틀린
    엘라스틱서치
    docker
    java
    AWS
  • 링크

    • github
    • linkedin
    • resume
  • hELLO· Designed By 정상우. v4.10.3
집한구석
[JAVA] 프록시패턴
상단으로

티스토리툴바