데코레이터 또는 프록시 패턴을 적용하는 데 어려움은..
부가기능을 구현할 클래스가
부가기능과 관계없는 메소드들도 인터페이스에 선언된 메소드라면 전부 구현해야 하는 번거로움과
부가기능과 관계된 메소드들에 구현되는 코드 중복을 들 수 있다.
이 두 가지 어려움을 한 방에 해결하는 방법이
자바의 reflection에서 제공하는 다이나믹 프록시이다.
Proxy.newProxyInstance(..)을 통해 프록시 오브젝트를 손쉽게 생성할 수 있다. 일일이 특정 인터페이스의 모든 메소드들을 구현하지 않아도 된다.
Proxy.newProxyInstance(..)를 호출할 때 전달하는 InvocationHandler 인터페이스 구현체의 단일 메소드인 invoke() 메소드에 부가기능을 단 한번 만 구현함으로써 코드 중복도 해결된다.
하지만, 빈으로 등록하는 게 문제다.
위에서 손쉽게 생성한 다이나믹 프록시 오브젝트는 클래스파일 자체가 없으니 빈으로 등록할 수 없다.
그래서 스프링의 팩토리빈 인터페이스를 활용하게 된다.
팩토리빈 인터페이스를 구현한 클래스를 빈으로 등록하면 되는 것이다.
다이나믹 프록시 오브젝트의 생성은.. 팩토리빈 인터페이스의 getObject() 메소드 안에서 해주면 된다.
바로 앞 글에서 말했듯이 팩토리 빈이 스프링의 빈 클래스로 지정되는 경우에는
스프링은 팩토리빈의 getObject()가 반환한 오브젝트로 빈 오브젝트로 등록해준다.
'아는 만큼 보인다 > Spring Framework' 카테고리의 다른 글
프록시 팩토리빈 ==> 빈 후처리기(BeanPostProcessor) (0) | 2012.06.14 |
---|---|
다이나믹프록시 + 팩토리빈 ==> 프록시 팩토리빈 (0) | 2012.06.13 |
스프링이 빈 오브젝트를 생성하는 방법 (0) | 2012.06.12 |
서비스 추상화 그리고 DI (Dependency Injection) (0) | 2012.06.06 |
JdbcTemplate (쓰기 편한 database 접속 api) (0) | 2012.05.23 |