본문 바로가기

자바

[디자인 패턴] 프록시(Proxy) 패턴

프록시(Proxy) 패턴이란?

프록시패턴은 특정 객체를 대신하여 처리하게 함으로써 로직의 흐름을 제어하는 행동패턴이다.

사용자가 A객체의 methodA라는 메서드를 호출하려고 할 때 프록시 패턴을 사용해서 B객체의 methodB를 호출하고 추가적인 로직을 추가로 수행한 뒤 methodA를 호출하는 것이다. 이를 사용하는 이유는 대상 클래스가 민감한 정보를 가지고 있거나 원본 객체를 수정할 수 없는 상황일 때 추가적인 기능을 사용하기 위해서이다.

 

프록시 패턴을 사용했을 때 좋은 경우

  • 보안
    • 클라이언트가 작업을 수행할 수 있는 권한이 있는지 확인한 후 요청된 작업 수행
  • 캐싱
    • 프록시 내부에 캐시를 생성하여 데이터에 캐시가 존재하는 경우에 캐싱된 데이터를 반환하여 응답시간을 단축시킨다.
  • 데이터 유효성 검사
    • 프록시가 작업을 수행하기 전에 입력 받은 데이터가 유효한지 확인 후 작업 수행
  • 지연 초기화
    • 요청받은 대상의 객체 생성 비용이 비싸다면 프록시는 그것이 필요할 때 까지 연기할 수 있다.
  • 로깅
    • 작업을 수행하기 전후로 로그를 기록한다.
  • 원격 객체
    • 연격 위치에 있는 객체를 가져와서 로컬처럼 보이게 한다.

 

turnOn의 기능을 가진 인터페이스 TV를 선언하고 구현체인 SamsungTV를 선언한다. 

interface TV {
    void turnOn();
}

class SamsungTV implements TV {
    @Override
    public void turnOn() {
        System.out.println("삼성티비 전원 ON");
    }
}

 

 

필드변수로 TV 객체를 가지는 프록시 클래스를 선언하고 인터페이스를 구현한다.

class ProxySamsungTV implements TV {
    private final TV tv;

    ProxySamsungTV(TV tv) {
        this.tv = tv;
    }

    @Override
    public void turnOn() {
        System.out.println("프록시 로깅 시작");
        tv.turnOn();
        System.out.println("프록시 로깅 종료");
    }
}

 

 

SamsungTV의 전원을 키는 동작을 동일하게 수행하지만 프록시 객체를 사용해서 

메서드의 실행 전후로 로깅기능을 추가 수행할 수 있다.

    TV tv = new ProxySamsungTV(new SamsungTV());
    tv.turnOn();