본문 바로가기

아는 만큼 보인다/Spring Framework

데코레이터 패턴 ==> 다이나믹프록시(자바) + 팩토리빈(스프링)

데코레이터 또는 프록시 패턴을 적용하는 데 어려움은..

부가기능을 구현할 클래스가
부가기능과 관계없는 메소드들도 인터페이스에 선언된 메소드라면 전부 구현해야 하는 번거로움과
부가기능과 관계된 메소드들에 구현되는 코드 중복을 들 수 있다.

이 두 가지 어려움을 한 방에 해결하는 방법이
자바의 reflection에서 제공하는 다이나믹 프록시이다.

Proxy.newProxyInstance(..)을 통해 프록시 오브젝트를 손쉽게 생성할 수 있다. 일일이 특정 인터페이스의 모든 메소드들을 구현하지 않아도 된다. 

Proxy.newProxyInstance(..)를 호출할 때 전달하는 InvocationHandler 인터페이스 구현체의 단일 메소드인 invoke() 메소드에 부가기능을 단 한번 만 구현함으로써 코드 중복도 해결된다.


하지만, 빈으로 등록하는 게 문제다.
위에서 손쉽게 생성한 다이나믹 프록시 오브젝트는 클래스파일 자체가 없으니 빈으로 등록할 수 없다.

그래서 스프링의 팩토리빈 인터페이스를 활용하게 된다.
팩토리빈 인터페이스를 구현한 클래스를 빈으로 등록하면 되는 것이다.

다이나믹 프록시 오브젝트의 생성은.. 팩토리빈 인터페이스의 getObject() 메소드 안에서 해주면 된다.


바로 앞 글에서 말했듯이 팩토리 빈이 스프링의 빈 클래스로 지정되는 경우에는

스프링은 팩토리빈의 getObject()가 반환한 오브젝트로 빈 오브젝트로 등록해준다.