[ 1 ] AOP 는 무엇인가?
AOP ( Aspect Oriented Programming ): 관점 지향 프로그래밍이다.
관점... 뭔가 어렵다.
개인적으로 이해하기 쉽게 얘기한다면, 바라보는 시점 또는 관심사를 시작으로 한 프로그래밍 이란 의미이다.
예를 한번 들어보자.
A 프로그램은 1 ~ 100까지 더하는 프로그램이다.
B 프로그램은 101 ~ 199까지 더하는 프로그램,
C는 200 ~ 299까지 더하는 총 3개의 프로그램이 있다고 생각해보자.
그런데 개발자는 위 A, B, C 프로그램이 수행하는 도중 덧셈 결과가 3의 배수일 경우는
중간 결괏값을 출력하고 싶다.
관점을 추가해보자. 위 A, B, C 프로그램 내 '3의 배수일 경우 중간 결괏값 출력' 관점을 적용시키고 싶다.
주 목표는 A, B, C 프로그램의 결과값을 얻는 것이고, 관점( 덧셈 결과가 3의 배수일 경우 중간 결과값 출력 )
은 주 목표에 영향을 끼치지 않은 상태에서 원하는 중간값을 얻는 것이다.
아래 그림에서 주황색 화살표(Module)를 A, B, C이라고 치면,
중간에 Cross cutting concern 은 중간 출력 값 처리 부분이다.
Spring AOP 의 구현 방식은 Proxy 를 이용하여 구현된다.
즉, 외부에서 AOP 에 선언된 객체를 호출하게 되면, 객체를 감싸고 있는 Proxy를 통해서 호출되는 방식이다.
Caller --> Proxy (AOP) --> 지정된 객체 |
1. Caller 가 Proxy 에 요청해서 횡단 관심사(AOP) 기능을 수행
2. Proxy 가 지정된 객체로 가서 객체의 기능을 실행
3. Proxy 설정에 따라 다시 Proxy 로 돌아와서 기능을 실행
[ AOP 용어 설명 ]
Aspect | AOP의 추상적 명칭. ( 말그대로 관점 ) |
Advice | Proxy 내 실제로 기능을 구현한 객체 |
Join Point | Advice를 적용할 위치를 의미 예를 들어 특정 Package 내 ...Proc로 끝나는 클래스의 모든 메소드에 Advice를 적용한다면, ....Proc로 끝나는 클래스의 모든 메소느는 Join Point 가 된다 |
Pointcut | Join Point를 선별 또는 기능을 정의한 모듈의 의미 또한 서비스 성격에 따라 어떤 Join point를 사용할지 결정 |
Target | 실제 비지니스 로직을 수행하는 객체. Advice를 적용할 대상을 의미 |
Proxy | 어드바이스가 적용되었을 떄 생성되는 객체 |
[ AOP 종류 (Spring 표기 기반) ]
@Before | Target 메소드 실행 전 Advice 실행 |
@After | Target 메소드 실행 시 Exception 이 발생해도 Advice 실행 |
@AfterReturning | Target 메소드 정상 실행 후 Advice 실행 |
@AfterThrowing | Target 메소드 실행 중 Exception 발생 시 Advice 실행 |
@Around | Target 메소드 실행 전/후 또는 Exception 발생 시 Advice 실행 |
위 내용을 간단한 예시로 정리해보자
@Before( pointcut ) public void beforeAopTest( JoinPoint jp ) { .... Advice .... } |
다음에는 pointcut 선언 방법과 간단한 예제 글을 올리도록 하겠습니다.