[Java] 프록시 패턴

charco·2021년 7월 27일
0

나도TIL

목록 보기
13/55
post-thumbnail

스프링 AOP에는 프록시라는 존재가 나온다.
뭔가 추상적인 개념이라 처음에는 이해하기 힘들었다.
자바 프록시 패턴을 통해 조금더 이해해보자

출처 : https://www.baeldung.com/java-proxy-pattern


프록시 패턴이란?

프록시 패턴은 데코레이터 패턴처럼 타깃의 기능을 확장하지는 않는다.
클라이언트(사용하는 쪽)이 타겟에 접근하는 방식을 변경한다.

프록시는 쉽게 말해 중개자다.
클라이언트의 요청을 대신 받아 같은 인터페이스의 다른 구현체에게 위임한다.
그림으로 보자면 이렇다.


프록시 패턴 예제

JDBC Connection 이나 SessionFactory 같은 무거운 오브젝트가 있다고 해보자. 이 오브젝트는 초기에 어떤 설정을 필요로 한다. 우리는 필요할때 이 오브젝트를 호출하고 그다음 계속 재사용하고싶다.

쉽게 말하면 한번 설정하고나면 설정없이 계속 재사용할 수 있게 할 것이다.

ExpensiveObject 인터페이스

public interface ExpensiveObject {
    void process();
}

ExpensiveObjectImpl 클래스

public class ExpensiveObjectImpl implements ExpensiveObject {
	
    //인스턴스가 생성될때 설정 메서드를 실행한다.
    public ExpensiveObjectImpl() {
        heavyInitialConfiguration();
    }
    
    @Override
    public void process() {
        LOG.info("프로세스가 끝났습니다.");
    }
    
    private void heavyInitialConfiguration() {
        LOG.info("초기 설정중...");
    }
    
}

ExpensiveObjectProxy

//클라이언트가 사용하는 중개인(proxy) 클래스
public class ExpensiveObjectProxy implements ExpensiveObject {
	
    private static ExpensiveObject object;
//클라이언트는 이 process() 를 호출할 것이다.
    @Override
    public void process() {
    //static 필드에 인스턴스를 저장하기 때문에 설정 메서드는 
    //ExpensiveObjectImpl 메서드가 실행될때 총 한번만 실행된다.
        if (object == null) {
            object = new ExpensiveObjectImpl();
        }
        //ExpensiveObject에 위임
        object.process();
    }
}

테스트

public static void main(String[] args) {
    ExpensiveObject object = new ExpensiveObjectProxy();
    object.process();
    object.process();
}

결과

초기 설정중...
프로세스가 끝났습니다.
프로세스가 끝났습니다.

결론

프록시 패턴은 이럴때 사용하면 좋다.

  • 오브젝트에 대해 더 단순한 버전의 오브젝트가 필요하거나 오브젝트에 대해 더 안전한 접근이 필요할 때
  • remote 오브젝트에 대해 local 버전의 오브젝트를 얻고 싶을때
profile
아직 배우는 중입니다

0개의 댓글