AOP가 필요한 이유?
애플리케이션 전체에 걸쳐 흩어져 있던 기능을 한 곳(애스펙트)에 작성할 수 있다.
3.1 AOP소개
횡단(cross-cutting)관심사의 모듈화와 관련이 있다. (보안, 트랜잭션, 기타..)
횡단관심사는 애스팩트(aspect)라고 하는 특별한 객체로 모듈화된다.
#에스팩트의 이득
1) 각 관심사에 대한 로직이 한 장소에서 관리된다.
2) 애플리케이션 고유의 서비스 모듈이 명확해진다.
[3.1.1] AOP 용어 정리
aspect : 구현하고자 하는 횡단 관심사의 기능을 말함(로깅이 대표적)
joinpoint : aspect를 플러그인할 수 이는 애플리케이션의 실행 지점을 말한다. (메소드시작끝,예외 등)
advice : aspect의 실제 구현체
pointcut : advice가 어떤 joinpoint에 적용돼야 하는지를 정의함
introduction : 기존의 클래스에 새로운 메소드나 속성을 추가함(wow~ surprise~!)
target : advice를 받는 클래스
proxy : target에 advice가 적용된 후 생성되는 객체를 말함
weaving : aspect를 target에 적용하여 새로운 프록시 객체를 생성하는 과정을 말함(컴파일시, 클래스 로딩시, 런타임 시 발생할 수 있음)
[3.1.2] 스프링의 AOP 구현
#스프링의 advice는 자바로 작성한다
=> pointcut은 xml로 작성된다.
#스프링의 객체에 대한 advice는 runtime시에 이뤄진다
=> 애플리케이션이 프록시 빈을 필요로 하기전까지는 프록시 객체를 생성하지 않음.
고로, 특별한 컴파일러는 필요하지 않다.
* 프록시 클래스 만드는 2가지 방법?
target이 특정한 메소드들을 공개하는 인터페이스를 구현한다면 : java.lang.reflect.Proxy클래스 사용
target이 어떤 인터페이스를 구현하고 있지 않다면 : CGLIB 라이브러리를 사용 1
#스프링은 AOP 연맹의 인터페이스를 구현한다.
=> 다양한 자바 AOP 구현체 사이에 상호호환성을 제공하기 위해 자바의 AOP인터페이스를 표준화 하는 것이 목적
#스프링은 메소드 joinpoint만 제공한다.
=> AspectJ나 JBoss는 필드 결합점도 제공.
스프링의 철학은 필드 가로채기가 캡슐화를 위반하는 것으로 여긴다.
더 공부할 것 : 프록시 클래스 만드는 2가지 방법
- CGLIB는 오픈소스이며, 고성능의 코드 생성 라이브러리다. 자세한 정보는 http://cglib.sourceforge.net/ 참조. [본문으로]
댓글