menuhwang

프록시 패턴 : 디자인 패턴 본문

스터디/etc

프록시 패턴 : 디자인 패턴

menuhwang 2022. 8. 20. 11:59

프록시 패턴


 

특정 객체를 직접 참조하지 않고 해당 객체를 대행하는 객체를 통해 접근하는 패턴

Proxy 라는 단어는 '대리' 즉, 대신 무언가 해준다는 의미이다. 프록시 패턴은 말 그대로 객체를 직접 불러와 사용하는 것이 아니라 프록시 객체를 통해 접근하는 방법이다. 어떻게 사용하는지 어떻게 사용되는지 알아보자.

 

 

프록시 패턴


프록시 패턴을 구현하는 방법은 객체를 상속받아 프록시 클래스를 구현하는 방법.

인터페이스로 메인객체와 프록시 객체를 구현하는 방법이 있다.

클래스는 단 하나만 상속받을 수 있으니 인터페이스로 구현하는 방법을 알아보자.

 

MyService.java

public interface MyService {
	void hello();
}

프록시와 기본 구현체를 구현하기 위한 인터페이스를 생성한다.

 

MyServiceImpl.java

public class MyServiceImpl implements MyService {
	@Override
    public void hello() {
    	System.out.println("안녕하세요");
    }
}

기본 동작을 위한 구현체를 생성한다.

 

MyServiceProxy.java

public class MyServiceProxy implements MyService {
	private MyService myService;
    
    public MyServiceProxy(MyService myService) {
    	this.myService = myService;
    }
    
    @Override
    public void hello() {
    	long start = System.currentTimeMillis();
        myService.hello();
        long end = System.currentTimeMillis();
        System.out.println(end - start + "ms");
    }
}

기본 동작 이 외의 부가 기능을 추가한 프록시 객체를 생성한다.

생성자에 실질적인 동작을 하는 메인 객체를 주입받는다.

 

Application.java

public class Application {
	public static void main(String[] args) {
    	MyService myService = new MyServiceProxy(new MyServiceImpl());
        myService.hello();
    }
}

프록시 객체에 메인 객체를 주입해서 생성해주고 프록시 객체의 메서드를 실행한다.

프록시 객체에서 오버라이드한 부가 기능과 메인 객체에 구현되있는 핵심 기능이 잘 작동된다. 

 

 

 

스프링


이 프록시 패턴 역시 스프링에 적용되어있다. Filter, Transaction을 그 예로 들수 있다.

 

public 메인객체 implements 인터페이스 {
	public void 핵심기능() {
    	...
    }
}

public 프록시객체 implements 인터페이스 {
	// (중략)
	@Override
    public void 핵심기능(){
    	// Transaction 또는 필터
        핵심기능()
        ...
    }
}

 

스프링에서 사용하던 Transaction, Filter 들이 이렇게 프록시 패턴으로 구현되어 있다는 사실을 알 수 있다.

이 외에도 로깅, 성능 체크(실행 시간 체크), 검증 등 핵심 기능 외 부가 기능을 따로 분리해 구현해주는 AOP에 활용될 수 있다.

 

 

 

 

'스터디 > etc' 카테고리의 다른 글

DTO, VO 비교 + Entity (2022. 08. 26 추가)  (1) 2022.08.23
URL URI 차이 [결론 못냄]  (0) 2022.08.22
싱글톤 패턴 : 디자인 패턴  (0) 2022.08.20
REST API  (0) 2022.08.20
도메인 비즈니스 로직  (0) 2022.08.19
Comments