(스프링) AOP(Aspect Oriented Programming):관점 지향 프로그래밍

**AOP에 대한 개념: http://isstory83.tistory.com/90
**AOP예제: http://devofhwb.tistory.com/13


*관점 지향과 횡단적 관심사의 분리

관점(Aspect)라는 단어는 '양상'과 '측면','특징'이라는 뜻이 있습니다.
관점 지향에서 관점이라는 말은 '소프트웨어가 갖는 다양한 특징이나 성질'등을 나타낸다.


소프트웨어가 가진 여러 관심사 중, '횡단적 관심사(Cross-CuttingConcern)'라는 것이 있습니다. 일반적으로 하나의 소프트웨어는 복수 모듈로 구성되는데, 어떤 관심사가 이러한 복수모듈에 산재하는 것을 '횡단적이다'라고 합니다.
횡단적 관심사의 구체적인 예로 자주 언급되는 것이 '로그 출력' 입니다. 로그 출력은 소프트웨어의 동작이나 사용자의 조작, 그 밖에 다양한 정보를 기록으로 출력하기 위해 중요한 '관심사'입니다. 그러나 다양한 모듈에 횡단적으로 산재해 있는 것이 문제입니다.

예제를 좀 더 구체적으로 살펴보자. 객체 지향에서는 기능과 데이터를 하나의 클래스 단위로 묶어 모듈로부터 분리하여 재사용성과 보존성을 높입니다. 객체지향의 이러한 방법도
'관심사의 분리'라고 볼 수 있습니다.


*AOP에서 분리된 관심사는 AOP프레임워크에 의해 관리되고, 필요에 따라 필요한 시점에
각 모듈에 삽입됩니다. 일단 분리된 관심사를 다시 모듈에 삽입하는 것을 '위빙Weaving'이라고 부릅니다. 각 모듈에는 분리된 기능을 사용하기 위한 코드를 기술할 필요가 전혀없습니다. 즉, 각 모듈 개발자는 횡단적관심사에 대해 전혀 관여하지 않습니다.

*스프링 AOP에서 쓰이는 용어

1. 어드바이스(Advice)

관점으로서 분리되고 실행시 모듈에 위빙된 구체적인 처리를 AOP에서는 Advice라고 합니다. Advice를 어디에서 위빙하는지는 뒤에 나오는 Pointcut이라는 단위로 정의합니다.
또한 Advice가 위빙되는 인스턴스를 '대상객체'라고 합니다.
스프링은 Advice타입으로 아래에 있는 5개를 제공합니다.

  • Around Advice: Joinpoint 앞과 뒤에서 실행되는 Advice
  • Before Advice: Joinpoint 앞에서 실행되는 Advice
  • After returning Advice: Joinpoint 메소드 호출이 정상적으로 종료된 뒤에 실행되는 Advice
  • After Throwing Advice: 예외가 던져 질떄 실행되는 Advice
  • Introduction: 클래스에 인터페이스와 구현을 추가하는 특수한 Advice



2. 조인포인트(Joinpoint)

실행시의 처리 플로우에서 Advice를 위빙하는 포인트를 Joinpoint라고 합니다. 구체적으로는 '메소드 호출'이나 '예오 발생'이라는 포인트를 Joinpoint로 정의합니다.

3. 포인트컷(Pointcut)

하나 또는 복수의 Joinpoint를 하나로 묶은 것을 Pointcut이라고 합니다.
Advice의 위빙 정의는 pointcut을 대상으로 설정합니다. 하나의 포인트 컷에는 복수 Advice를 연결 할 수 있습니다. 반대로 하나의 Advice를 복수 Pointcut에 연결하는 것도 가능합니다.

4. 어드바이저(Advisor)

Advice와 Pointcut을 하나로 묶어 다루는 것을 Advisor라고 합니다. Advisor는 스프링 AOP에만 있는 것인데, 관점 지향에서 '관점'을 나타내는 개념이라고 할 수 있습니다.





<어노테이션으로 AOP설정하기>

어노테이션을 사용해 AOP를 설정하는 경우 <aop:aspect-autoproxy> 요소를 기술해야 합니다.
<aop:config>요소 내용을 어노테이션으로 설정하므로 <aop:config>요소는 삭제합니다.
그리고 어드바이스인 LoggingSample클래스에 어노테이션을 기술합니다.


예)
package sample1;

@Aspect
public class LoggingSample{
 
@Around("execution(* sayHello())")
public Object logAround(ProceedingJoinPoint pjp) throws Throwable{

}

@Aspectj 어노테이션을 어드바이스로 사용하는 클래스에 기술합니다. 그리고 Advice처리를 맡는 메서드에 @Around어노테이션을 기술합니다. @Around어노테이션 값에 Pointcut정의를 작성합니다.
Pointcut정의는 정의 파일과 같은 방법으로 작성합니다.

*AspectJ의 어노테이션

@Aspect :  Advice인 클래스에 마크를 부여하느 어노테이션
@Around: Around Advice 메서드에 부여하는 어노테이션
@Before: Before Advice메서드에 부여하는 어노테이션
@After: After Advice인 메서드에 부여하는 어노테이션
@AfterReturning: After Returning Advice인 메서드에 부여하는 어노테이션
@AfterThrowing: After Throwing Advice인 메서드에 부여하는 어노테이션


댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기