4. Spring 프레임워크의 AOP 개념
Spring Framework - AOP 계정 관리를 담당하고 있는 AccountManager라는 다음과 같은 인터페이스가 있다고 생각하자. 고객의 요구사항은 AccountManager 내에서 Exception이 발생할 때마다 담당자에게 이메일을 발송하기를 바라고 있다. 이 같은 요구사항을 충족시키기 위한 일반적인 개발 방법은 다음과 같다. 예제를 이용한 Spring AOP : http://wiki.javajigi.net/pages/viewpage.action?pageId=283 문서 참고 AccountManagerImpl 문제점 Exception을 try/catch하는 부분과 Exception을 catch한 다음 메일을 보내는 중복코드가 발생한다. 고객이 메일을 보내는 대신 파일 Logging을 원하거나 위 기능에 파일 Logging을 추가할 경우 위 예제와 같이 Exception을 추가한 모든 소스를 찾아 수정해 주어야 한다.
(AccountManagerCore) Spring Framework - AOP AccountManagerImpl 해결 방법 중복이 발생하는 부분을 제외한 핵심적인 비즈니스 로직만을 구현하는 부분이 필요하다. Exception이 발생했을 때 메일을 보내는 로직만을 가지는 부분이 필요하다. 비즈니스 로직을 담당하는 클래스의 메서드 호출시 발생하는 Exception에만 메일을 보내도록 하기 위해서는 특정한 패턴을 가지는 패턴 정보가 필요하다. 위 세가지 정보를 하나로 묶어 본래 AccountManagerImpl가 처리할 수 있는 기능을 수행할 수 있도록 해야한다. 핵심 비즈니스 로직 구현부 (AccountManagerCore) Exception 발생시 메일 전송이 필요한 패턴을 명시 (Pattern) AccountManagerImpl 메일을 전송하는 구현부 (SendEmail)
(AccountManagerCore) Spring Framework - AOP AOP에서는 이와 같은 역할을 하는 녀석을 Point-Cut라고 한다. 핵심 비즈니스 로직 구현부 (AccountManagerCore) Exception 발생시 메일 전송이 필요한 패턴을 명시 (Pattern) AccountManagerImpl 메일을 전송하는 구현부 (SendEmail) Weaving한다. AOP에서는 이와 같은 역할을 하는 녀석을 Advice라고 한다.
Spring Framework - AOP OOP 기반으로 애플리케이션을 개발할 경우 하나의 클래스에 다양한 성격의 Aspect(또는 Concerns)가 존재한다. 한 곳에 너무도 많은 Aspect가 섞여서 개발됨으로 인해 중복된 코드 발생, 복잡도 증가, 유지보수의 어려움이 발생 각각의 Aspect를 분리하기 위한 시도
Spring Framework - AOP OOP가 가지고 있는 한계를 인식하고 Aspect(Concerns)을 분리하기 위한 시도 OOP 기반위에서 Aspect를 분리한 다음 핵심 비즈니스 로직과 Aspect를 결합함으로서 이 같은 한계를 극복하려고 함.
Spring Framework - AOP 분리된 Aspect는 Weaving이라는 과정을 거쳐서 본래 구현하고자 했던 기능을 구현하도록 가능하게 함. 이처럼 Aspect로 분리한다음 Weaving 작업이 가능하도록 지원하는 다양한 프레임워크가 등장(Spring AOP, Jboss AOP, AspectJ) AOP를 최종적으로 정의한다면 하나의 모듈속에 얼키설키 섞여 있는 Aspect들을 분리하여 구현한 다음 이 구현물을 하나로 엮어줌으로서 근본적으로 우리들이 구현하고자 하는 기능 구현을 가능하도록 하는 개발 방법
Spring Framework - AOP 용어정리 오픈 소스 스터디 Spring 1차 : http://wiki.javajigi.net/pages/viewpage.action?pageId=280 문서의 Spring AOP 파트에서 AOP 용어정리 부분 참고
Spring Framework - AOP 실습 기본적인 Spring AOP 기능 Advanced Spring AOP 기능 Spring AOP에서 제공하는 Advice들에 관한 예제 : http://wiki.javajigi.net/pages/viewpage.action?pageId=1062 Spring AOP에서 제공하는 Advisors와 Pointcuts : http://wiki.javajigi.net/pages/viewpage.action?pageId=1078 JDK Dynamic Proxy와 CGLIB Proxy에 대한 이해 : http://wiki.javajigi.net/pages/viewpage.action?pageId=1065 Advanced Spring AOP 기능 Introduction Advice 시작하기 : http://wiki.javajigi.net/pages/viewpage.action?pageId=1084 AOP를 Bean Definition에서 선언적으로 사용하기 : http://wiki.javajigi.net/pages/viewpage.action?pageId=1080 Automatic Proxying 사용 예제 : http://wiki.javajigi.net/pages/viewpage.action?pageId=1075 Spring 프레임워크와 AspectJ의 통합 : http://wiki.javajigi.net/pages/viewpage.action?pageId=1081
Spring Framework - AOP 실습 Spring 프레임워크 개발 전략
Spring Framework - AOP 온라인 문서 도서 Aspect-Oriented Programming in Java : http://wiki.javajigi.net/pages/viewpage.action?pageId=282 I want my AOP!, Part 1 : http://www.javaworld.com/javaworld/jw-01-2002/jw-0118-aspect_p.html 도서 AspectJ in action : http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200410260001 Pro Spring : http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200502280029 Java Development with the Spring Framework : http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200507040005