본문 바로가기

STUDY/Spring

Spring Boot | AOP(Aspect Oriented Programming)

AOP(Aspect Oriented Programming)

  • 공통 관심 사항(croos-sutting concern)과 핵심 관심 사항(core concern)을 분리하기 위해 사용
  • @Pointcut이나 advice의 다양한 애노테이션을 사용해 원하는 적용 대상만 선택해 적용할 수 있다
  • AOP가 적용되면 프록시로 해당 타겟을 실행하게 된다 -> 프록시가 실제 메서드나 클래스를 호출하는 방식으로 의존관계가 변경 됨

AOP 활성화

스프링 부트 메인 클래스에 @EnableAspectJAutoProxy 애노테이션을 추가한다.

Aspect 작성

@Aspect 애노테이션을 추가

@Aspect
public class TimeTractApp {

}

Pointcut

PointcutAdvice의 실행 시기를 제어한다. @Pointcut애노테이션과 표현식(point cut designator (PCD))을 이용해 정의한다. Pointcut은 일반 메서드(void)를 정의하여 사용한다.

@Pointcut(...)                // pointcut 표현식
public void onExecute() { }    // pointcut 생성

Pointcut의 표현식에서 사용할 수 있는 지정자는 아래와 같다.

  • execution
  • within
  • this
  • target
  • args
  • @target
  • @args
  • @within
  • @annotation

Pointcut표현식은 &&, ||, !을 사용해 표현식을 결합할 수도 있다.

Advice

Advice는 aspect에 의해 실질적으로 실행하는 부분이다.
pointcut과 일치하는 메서드의 실행 전, 후 혹은 전, 후 모두 (around)에 실행된다.
pointcut을 참조하거나 표현식을 선언하여 사용한다.
Advice@Before, @After, @Around의 애노테이션을 사용해 정의한다.

  • @Before : 일치하는 메서드가 실행되기 전
  • @After : 일치하는 메서드가 완료된 뒤
  • @AfterReturning : 일치하는 메서드가 정상적으로 실행된 뒤
  • @AfterThrowing : 일치하는 메서드가 예외를 발생했을 경우
  • @Around : 일치하는 메서드를 감싼다, 메서드 호출 전과 호출 후. Around는 반드시 proceed()메서드가 호출되어야 한다.

참고

기억보단 기록을 | AOP 정리 (3)
inflearn 스프링 입문 강의
spring doc