낮은 결합도에 높은 응집도는 기본으로 가지며, DI는 낮은 결합도를 위한 것이라면 AOP는 높은 응집도를 위한 것이다.
엔터프라이즈 어플리케이션들은 보통 핵심 비즈니스 로직은 몇 줄 안되고 주로 로깅이나 예외, 트랜잭션 처리 같은 부가 코드가 대부분이다. 즉 비지니스 메소드의 복잡도는 증가하며 메소드들 마다 매번 반복해야하는 경우가 생긴다.
이를 해결하기 위해서는 단순복사 붙여넣기만으로는 코드중복이 많아지며 유지보수가 힘들어지기 때문에 AOP를 통해 부가적인 공통 코드들을 효율적으로 관리해야한다.
위 내용을 다르게 말하면 기존 OOP에서 공통 관심 기능을 여러 모듈에서 적용하며 발생하는 중복코드 양산의 한계를 극복하기위해 AOP가 탄생했다고 볼 수 있다.
또 이러한 AOP는 흩어진 Aspect들을 모아서 모듈화 하는 기법이다.
*Aspect란?
객체지향 언어의 클래스와 비슷한 개념이며 그 자체로 어플리케이션의 도메인 로직을 담은 핵심 기능은 아니지만, 많은 오브젝트의 걸쳐서 필요한 부가기능을 추상화 해놓은 것이다.
AOP에서 중요한 점으로는 관심 분리(Separation of Concerns) 가 있습니다.
로깅, 예외, 트랜잭션 처리같은 코드들은 횡단 관심(Crosscutting Concerns) 라고하며, 핵심 비즈니스 로직은 핵심 관심(Core Concerns)라고 합니다.
AOP 용어와 개념
AOP는 핵심 로직에서 공통관심기능을 호출하지 않고 위빙(Weaving)이라는 작업을 통해 공통 관심 기능코드를 추가합니다.
이런 위빙을 하기위해서는 언디에, 언제 추가해야할지 알아야 하며 Pointcut(어디에), Advice(언제)라고 합니다.
Joint Point : 모듈이 삽입되어 동작하게 되는 특정 위치(메서드 호출 등), 클라이언트가 호출하는 모든 비즈니스 메소드, 모든 메소드를 조이포인트로 생각하면 되고, 이 중에서 포인트컷이 결정된다.
Point Cut : 다양한 Joint Point 중에 어떤 것을 사용할지 선택, 즉 필터링된 Joint Point를 의미한다. 하나의 @Aspect class 안에 여러 개의 포인트컷을 선언할 수도 있습니다.
//포인트컷 선언의 예 @Pointcut("excution(* hello(...))") // 포인트컷 파라미터는 없으며 표현식으로 정의 "excution ~" private void all() { }
Advice : Joint Point에 삽입되어 동작할 수 있는 코드, 어드바이스는 횡단 관심에 해당하는 공통 기능의 코드를 의미하며 독립된 클래스의 메서드로 작성된다. 언제 동작할지는 스프링 설정에서 결정한다.
Advice도 Pointcut과 마찬가지로 하나 이상을 정의할 수 있고, Advice의 Annotation에는 이에 적용할 Point cut을 명시해야 한다.
@AspectJ에서 5가지의 Advice
before : 메서드 호출 전에 동작하는 advice
after : 예외 발생 여부와 관계없이 호출된 메서드의 동작이 완료되면 동작하는 Advice
after-returning : 예외 없이 호출된 메서드의 동작이 완료되면 동작하는 Advice
after-throwing : 호출된 메서드의 동작이 완료되면 동작하는 Advice
around : 메서드 호출 전과 후에 동작하는 Advice
/* *포인트컷에 이름을 부여해서 따로 정의하는 대신 어드바이스 메소드 어노테이션에 포인트컷 표현식을 넣어서 *적용하는 방법도 있다. */ @Around("excution(* *(...))") public Onject printParametersAAndReturnVal(ProceedingJointPoint pjp) throws Throwable{ return pjp; }
//어드바이스 정의 예 @Around("all()") // all() 메소드가 호출되기 전 과정을 모두 담을 수 있다. public Object aroundExample(ProceedingJointPoint pjp) throws Throwable{ //proceed 메서드는 클라이언트가 보낸 파라미터를 그대로 사용해서 타깃 오브젝트의 메소드를 호출하고 그 결과를 돌려줌 Object ret = pjp.proceed(); return ret; }
Weaving : Advice를 핵심 로직 코드에 적용하는 것, 위빙을 통해 비지니스 메소드를 수정하지 않고 횡단 관심에 해당하는 기능을 추가하거나 변경 가능.
Aspect : Point Cut + Advice, Aspect는 포인트컷과 어드바이스의 결합 => 어떤 포인트컷 메서드에 어떤 어드바이스 메소드를 실행할지 결정한다.