0%

spring boot aop 정리

개요

관심사를 분리합니다.
비즈니스로직에 집중할 수 있게 합니다.

선행 개념

advice

실행할 로직은 어떤것인가?

1
2
3
public void myAdvice() {
System.out.println("test advice");
}

pointcut

어떤 대상을 기준으로 advice 를 동작하게 할것인가?
execution(* com.aop.controller.*(..))
within(com.aop.controller..)

joinpoint

동작될 대상의 어떤 시점에 advice 를 동작시킬것인가?
@Before(...)
@After(...)
@Around(...)

aspect 구성

  1. 컨트롤러에 @Aspect 를 등록합니다.
  2. advice 메소드를 만듭니다.
  3. advice 에 joinpoint 를 등록합니다.
  4. poinpoint 에 pointcut 을 지정합니다.

예시

1
2
3
4
5
6
7
8
@Component
@Aspect // 1. 어노테이션 등록
public class MyAspect {
@Before("execution(* com.aop.controller.*(..))") // 3, 4 pointcut, joinpoint 지정
public void myAdvice() { // 2. advice 메소드 구현
System.out.println("test advice");
}
}

Aspect 상세정보

pointcut

지시자

  • execution 표현식에 부합되는 함수를 선택합니다.
  • within 특정 타입에 속하는 함수 전체를 지정
  • bean
  • And, Or 복합적인 조건을 &&, || 로 지정할 수 있습니다.

표현식

[접근제어자] [리턴타입] [패키지] [클래스이름] [메소드명](파라미터)

사용 예제

example 리턴타입 패키지 클래스 메소드 파라미터
* com.aop.controller.*.*(..) 모든 타입 com.aop.controller 모든 클래스 모든 메소드 모든 파라미터
String com.aop.controller.HomeController.index(*) String com.aop.controller HomeController index 파라미터가 1개

jointpoint

동작시점

어노테이션 설명
@Before 메소드 실행 전 동작
@After 메소드 실행 후 동작
@Around 메스도 실행 전, 후 동작
@AfterReturning 메소드 실행 후 동작
메소드 반환값 획득 가능
@AfterThrowing 예외가 발생했을때 동작

advice

파라미터 확인

1
2
3
4
5
6
7
8
9
@Before("execution(* com.aop.demo.util.*.*(*))")
public void before(JoinPoint joinPoint) {
System.out.println("--- Before ---");

// 요청 파라미터 출력
Stream.of(joinPoint.getArgs()).forEach(it -> {
System.out.println(it.toString());
});
}

리턴 확인

1
2
3
4
5
6
7
8
9
@AfterReturning(value = "execution(* com.aop.demo.util.*.*(*))", returning = "returnValue")
public void after(Object returnValue) {
System.out.println("--- After returning ---");

// 응답 파라미터 출력
Stream.of(returnValue).forEach(it -> {
System.out.println(it.toString());
});
}