AOP를 더 자세히 알아보자.
또한 AOP를 잘 이해하기 위해서 AOP에서 사용하는 용어에 대해서 알아보자.
용어 | 뜻 | 역할 |
---|---|---|
Aspect | 관점, 측면, 양상 | Pointcut 과 Advice 의 집합 - 어디에,언제,무엇을? |
Advice | 조언, 충고 | 언제,무엇을? |
JoinPoint | 결합점 | 연결 가능한 지점 |
Pointcut | 자르는 점 | Aspect 적용 위치 지정자 |
Weaving | Advice 를 핵심 로직 코드에 적용하는 것을 말한다. |
Pointcut
- 어디에Pointcut
은 Joinpoint
중 실제 Advice
가 적용되는 위치를 나타낸다.
스프링에서는 정규 표현식이나 AspectJ
의 문법을 이용해서 정의할 수 있다.
표현방법
{접근제한자패턴} 리턴타입 {패키지.클래스} 메서드이름(파라미터) {throws 예외패턴}
//{}은 생략가능하다.
예시 - execution
은 포인트컷 지시자이다.
@Before("execution(public void aop002.Boy.runSomething ())")
@Before("execution(* runSomething ())")
//접근제한자 상관없이, 리턴타입 상관없이, 모든패키지. 모든 클래스의
//에러상관없이 이름이 runSomeThing이라면 Pointcut으로 지정해라
JoinPoint
Advice
를 적용할 수 있는 지점을 말한다. 다른 AOP에서는 메서드 호출, 필드 값 변경에도 적용할 수 있으나 스프링 AOP에서는 빈의 메서드 호출에 대해서만 지원한다. (스프링은 프록시를 이용해서 AOP를 구현하기 때문이다.
JoinPoint
파라미터를 이용하면 실행 시점에 실제 호출된 메서드, 메서드의 객체, 파라미터를 확인할 수 있다.
...
public void before(JoinPoint joinPoint){
System.out.println(joinPoint);
System.out.println("얼굴 인식 확인: 문 개방");
...
execution(void aop002.Person.runSomething())
얼굴 인식 확인: 문 개방
컴퓨터로 게임을 한다.
execution(void aop002.Person.runSomething())
얼굴 인식 확인: 문 개방
요리한다.
Advice
- 언제, 무엇을언제 횡단관심사를 핵심 관심사를 적용할지를 정의한다.
즉. Pointcut
에 언제, 무엇을 적용할지 정의한 메서드이다.
종류 | 설명 |
---|---|
Before Advice | 대상 객체의 메서드 호출 전에 공통 기능을 실행한다. |
After Returning Advice | 대상 객체의 메서드가 예외 없이 실행된 이후에 공통 기능을 실행한다. |
After Throwing Advice | 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행한다. |
After Advice | 익셉션 발생 여뷰에 상관없이 대상 객체의 메서드 실행 후 공통 기능을 실행한다. |
Around Advice | 대상 객체의 메서드 실행 전, 후, 또는 익셉션 발생시점에 공통 기능을 실행하는데 사용된다. |
🔍 가장 자주 사용되는
Around Advice
?
대상 객체의 메서드 실행에 대해서 다양한 시점에 사용할 수 있기 때문이다.
캐시 기능이나 성늘 모니터링 기능을 공통기능으로 사용할 수 있다.
예시
public class MyAspect {
@Before("~~~") //실행 전에 before 메서드를 실행하겠다.
public void before(JoinPoint joinPoint){
...
위에서는 PointCut
이 시작되기 전에 before
메서드를 실행하라고 되어 있다.
Aspect
여러개의 Advice
와 여러개의 Pointcut
의 결합을 의미한다. 즉 언제+무엇을+어디에를 뜻한다.
예사
@Aspect //이 클래스를 이제 AOP에서 사용하겠다는 의미이다.
public class MyAspect {
@Before("execution(* runSomething ())") //대상 메서드 실행전에 이 메서드를 실행하겠다.
public void before(JoinPoint joinPoint){
runSomething ()
실행 전에, before()
를 실행한다.
트랜잭션이나 보안등이 Aspect
의 좋은 예이다.
Advisor
..?스프링 AOP에서만 사용되며 한 개의
Advise
와 한개의Pointcut
으로만 구성되어있다.
그러나 스프링이 발전되고 Aspect가 나오면서 더이상 사용되지 않는다.
Weaving
Advice
를 핵심 로직 코드에 적용하는 것을 말한다.
After Advice
- 어노테이션 기반으로package aop005;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect //이 클래스를 이제 AOP에서 사용하겠다는 의미이다.
public class MyAspect {
@Before("execution(* runSomething ())") //대상 메서드 실행전에 이 메서드를 실행하겠다.
public void before(JoinPoint joinPoint){
System.out.println("얼굴 인식 확인: 문 개방");
}
@After("execution(* runSomething ())")
public void after(JoinPoint joinPoint) {
System.out.println("외출 : 문잠금");
}
}
얼굴 인식 확인: 문 개방
컴퓨터로 게임을 한다.
외출 : 문잠금
얼굴 인식 확인: 문 개방
요리한다.
외출 : 문잠금
package aop005;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect //이 클래스를 이제 AOP에서 사용하겠다는 의미이다.
public class MyAspect {
@Pointcut("execution(* runSomething ())")
private void iampc() {
}
@Before("iampc()") //대상 메서드 실행전에 이 메서드를 실행하겠다.
public void before(JoinPoint joinPoint){
System.out.println("얼굴 인식 확인: 문 개방");
}
@After("iampc()")
public void after(JoinPoint joinPoint) {
System.out.println("외출 : 문잠금");
}
}