1. 개요

AOP란? Aspect Oriented Programming의 약자이다.

분산되어 있고 중복적인 내용을 묶어주는 기법이라고 할 수 있다.


2. 장점

  • 중복코드가 제거된다. 공통 관심이 여러 모듈에 반복적으로 나오는걸 막아준다.
  • 가독성이 향상된다. 주요 기능 코드에서 공통 관심 코드를 분리하기 때문이다.
  • 생산성이 향상된다. 비즈니스 로직의 독립에 의해 개발에 집중할 수 있다.
  • 재사용성이 향상된다. 공통 관심 코드는 여러 모듈에 재사용된다.
  • 변경이 용이해진다. 공통 관심 코드가 독립적으로 따로 관리되기 때문에 변경이 수월해진다.

예를 들어 로깅, 보안, 트랜잭션 등의 공통 기능을 모듈화처리한다.

당연히 중복 코드가 제거되고, 로직의 가독성이 향상되고, 생산성/재사용성이 좋아지고, 변경하기가 수월해진다.


3. 구성요소

그러면 AOP의 구성 요소에 대해 하나하나 살펴볼께요...

3.1. JointPoint

모듈의 특정 위치를 가리킨다.

메소드가 호출되는 부분, 리턴되는 시점, 필드를 억세스 하는 부분, 인스턴스 생성 지점, 예외 시점, 클래스 초기화 시점, 객체 생성 시점 등이 모두 JointPoint가 된다.

3.2. Advice

각 JointPoint에 삽입되어 동작할 수 있는 코드이다.

Advice는 Interceptor로 쓰이기도 하는데 Interceptor는 Interceptor Chain 방식의 AOP 툴에서 사용하는 용어로 주로 하나 이상의 invoke 메소드를 가지는 Advice이다.

before advice, after returning advice, after throwing advice, around advice등 중 하나이다.

  • before advice : 메소드(JointPoint) 실행 전에 적용된다.
  • after returning : advice는 메소드가 정상 실행된 후에(=JointPoint가 정상 리턴된 후에) 실행된다.
  • after throwing : advice는 예외가 발생될 때(Exception 발생하여 JointPoint 빠져나갈 때) 적용된다.
  • around advice : 메소드 호출 이전, 이후, 예외 등 모든 시점에서 적용 가능한  advice이다.

3.3. Pointcut

어떤 클래스의 어느 JointPoint를 사용할 것인지 결정하는 선택 기능이다.

AOP라고 해서 모든 모듈의 모든 JointPoint를 사용하는 것은 아니다.

Pointcut은 일종의 JointPoint 설정 툴이다.

Pattern Matching Examples, Pointcut Designators 등이 되는데, AspectJ는 *를 이용한 메소드 시그니처를 사용한다.

3.4. Aspect

Pointcut + Advice의 조합이다.

AspectJ와 같은 자바 기반의 AOP를 사용하면 자바 클래스와 같이 Aspect를 코드로 작성할 수 있다.

AOP에 따라서는 Pointcut과 Advice를 각각의 자바 클래스로 만든 후에 이를 결합한 Advisor 클래스로 만들어 사용할 수도 있다.

3.5. Weaving

Pointcut에 의해 결정된 JointPoint에 Advice를 삽입하는 과정이다.

CrossCutting이라고 부르기도 한다.

Weaving을 구현하는 방법은 다양한데 후처리기를 통한 코드 생성 기술을 사용하거나, 이를 위한 특별한 컴파일러를 사용하곤 한다.

Weaving의 타이밍은 크게 세가지로 나눌 수 있다.

  • 하나... 컴파일 시에 Weaving : AOP가 적용된 클래스 파일이 생긴다.
  • 둘... 클래스 로딩 시에 Weaving : 원본 클래스는 그대로 유지가 되며 클래스 로딩 시에 JVM을 통해 변경된 바이트 코드가 적용된다.
  • 셋... 런타임 시에 Weaving : 소스나 클래스가 전혀 변하지 않으며 프록시를 이용하여 AOP를 적용한다.