Spring/Spring AOP

다이나믹 프록시 (1)

레알윙 2020. 2. 18. 21:30
반응형

이거 보기 전 패턴 메뉴에 있는 프록시 패턴과 데코레이터 패턴 보기!

2020/02/17 - [Java/패턴] - 데코레이터 패턴

2020/02/17 - [Java/패턴] - 프록시 패턴

 

다이나믹 프록시

프록시는 기존 코드에 영향을 주지 않으면서 타깃의 기능을 확장하거나 접근 방법을 제어할 수 있는 유용한 방법이다. 하지만 프록시를 만드는 거는 번거롭다. 매번 새로운 클래스를 정의해야 하고, 인터페이스의 구현해야 할 메소드는 많으면 모든 메소드를 일일이 구현해서 위임하는 코드를 작성해야 되기 때문이다. 비슷한 사호아으로는 단위 테스트를 위해 목이나 스텁을 일일이 클래스로 정의하고 인터페이스의 모의 메소드를 구현하는 일이 불편했던  것이기 때문이다.

 

그러나 목 프레임워크를 사용해 편리하게 바꿨던 것처럼 프록시도 일일이 모든 인터페이스를 구현해서 클래스를 새로 정의하지 안고도 편리하게 만들 수 있는 있다. 바로 java.lang.reflect 패키지 안에 프록시를 손쉽게 만들 수 있도록 지원해주는 클래스가 존재한다. 일일이 프록시 클래스를 정의하지 않고도 몇가지 API를 이용해 프록시처럼 동작하는 오브젝트 다이내믹하게 생성하는 것이다.

 

프록시의 구성과 프록시 작성의 문제점

예제코드 UserServiceTx( AOP - 트랜잭션 ) 를보게 된다면 UserService인터페이스를 구현하고 타깃으로 요청을 위임하는 트랜잭션 부가기능을 수행하는 코드로 분류하는 것을 볼 수 있다.

 

이렇게 프록시가 만들기가 번거롭지만 이를 두가지로 요약할 수 있다.

  • 타깃의 인터페이스를 구현하고 위임하는 코드를 작성하기가 번거롭다는 점이다. 부가기능이 필요 없는 메소드로 구현해서 타깃으로 위임하는 코드를 일일이 만들어 줘야 된다. 복잡하지 않지만 인터페이스의 메소드가 많아지고 다양해지면 상당히 부담스러운 작어이 되기 때문이다.
  • 부가기능 코드가 중복될 가능성이 많다는 점이다. 메소드가 많아지고 트랜잭션 적용의 비율이 높아지면 트랜잭션 기능을 제공하는 유사한 코드가 여러 메소드에 중복이 된다.

 위의 단점들 중 인터페이스의 구현과 위임 기능 문제는 JDK의 다이내믹 프로시를 이용하여 해결 할 수 있다.

 

 

프록시 클래스

다이내믹 프록시를 만들어 보자.  해당 코드는 아래와 같다.

public interface Hello {
	String syHello(String name);
	String sayHi(String name);
	String sayThankYou(String name);
}

 

public class HelloTarget implements Hello{
	public String syHello(String name) {
		return "Hello" + name;
	}
	public String sayHi(String name) {
		return "Hi" + name;
	}
	public String sayThankYou(String name) {
		return "Thank You" + name;
	}
}

 

public class HelloUppercase implements Hello {
	Hello hello;

	public HelloUppercase(Hello hello) {
		this.hello = hello;
	}

	public String sayHello(String name) {
		return hello.sayHello(name).toUpperCase();
	}

	public String sayHi(String name) {
		return hello.sayHi(name).toUpperCase();
	}

	public String sayThankYou(String name) {
		return hello.sayThankYou(name).toUpperCase();
	}

}

위의 코드를 보게 된다다면 Hello 인터페이스 구현 메소드에서는 타깃 오브젝트의 메소드를 호출한 뒤에 결과를 대문자로 바꿔주는 부가 기능을 적용하고 리턴한다. 위임기능부가라는 두가지 프록시의 기능을 모두 처리하는 전형적인 프록시 클래스이다.

 

위에서 말했듯이 인터페이스의 모든 메소드를 구현해 위임하도록 코드를 만들어야하고, 부가기능인 리턴 값을 대문자로 바꾸는 기능이 모든 메소드에 중복되서 나타나는 문제점을 가지고 있다.

 

 

 

 

반응형