일단 AOP가 뭔지 생각을 해봐야 할 것 같다.
일단 위키에 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적 이라고하는데, 일단 말이 어렵다.
간단히 설명해보면, 코드 내 비지니스 로직과 관계 없이 사이 사이에 엉켜있는 코드들을 분리한다를 의미한다.
예로 로깅을 위한 코드이다. 이러한 코드가 수정된다면, 유지보수를 어렵게 만들 수 있다.
따라서 이것을 분리하여 동작할 수 있게 한다면, 위의 말처럼 모듈성이 증가하여 유지보수가 한층 쉬워 질 수 있다.
위키에서는 이렇게 말하고 있다.
트랜잭션, 보안, 로깅은 모두 횡단 관심사를 가리킨다.
이를 종합하여 정리하면
기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을때 공통된 요소를 추출하는 것을 말할 수 있고, 이때 가로(횡단) 영역의 공통된 부분을 잘라냈다고 하여, AOP를 크로스 컷팅(Cross-Cutting) 이라고 불린다.
AOP 구현하기 위한 방법은 다양하다.
1) 컴파일 A.java ----(AOP)---> A.class(AspectJ, @Aspect 기반 AOP 구현)
2) 바이트코드를 조작하는 방법:
A.java -> A.class ---(AOP)---> 메모리 (AspectJ, @Aspect 기반 AOP 구현)
3) 프록시패턴을 이용하는 방법: (스프링 AOP)
OOP : 비지니스 로직의 모듈화
모듈화의 핵심 단위는 비지니스 로직
AOP : 인프라 혹은 부가기능의 모듈화
각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
OOP와 마찬가지로 공통된 기능을 재사용하기 위한 기법이며, 공통된 기능이 무엇이냐의 차이이다.
OOP에선 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용한다.
하지만 부가기능들을 상속이나 위임으로 처리하기에는 깔끔하게 모듈화하기 어렵다.
그래서 이 문제를 해결하기 위해 AOP가 등장하게 됩니다. AOP의 장점은 2가지입니다.
1) 어플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리된다는 점
2) 다른 서비스 모듈들이 본인의 목적에만 충실하고 그외 사항들은 신경쓰지 않아도 된다는 점
Aspect: 부가기능 모듈을 의미
Advice: Aspect의 부가 기능 구현체으로 애스펙트가 무엇을 언제 할지를 정의함
PointCut: Advice를 적용 대상을 선정, JointPoint 선별 기능
JoinPoint: 어드바이스가 적용될 수 있는 위치(보통 메소드나 클래스)
proxy: 대상의 wapper 클래스, target을 호출할 때, 선처리/후처리가 가능
(AOP에서 프록시는 호출을 가로챈 후, 어드바이스에 등록된 기능을 수행 후 타겟 메소드를 호출합니다.)
인트로덕션 (Introduction)
타겟 클래스에 코드 변경없이 신규 메소드나 멤버변수를 추가하는 기능
위빙 (Weaving)
지정된 객체에 애스팩트를 적용해서 새로운 프록시 객체를 생성하는 과정
예) A라는 객체에 트랜잭션 애스팩트가 지정되어 있다면, A라는 객체가 실행되기전 커넥션을 오픈하고 실행이 끝나면 커넥션을 종료하는 기능이 추가된 프록시 객체가 생성되고, 이 프록시 객체가 앞으로 A 객체가 호출되는 시점에서 사용되며, 이때의 프록시객체가 생성되는 과정을 위빙임
컴파일 타임, 클래스로드 타임, 런타임과 같은 시점에서 실행되지만, Spring AOP는 런타임에서 프록시 객체가 생성 됨