AOP(관점 지향 프로그래밍 - Aspect Oriented Programming)이란 여러 곳에 흩어져 있는 공통 관심사를 한곳으로 모아 중복을 줄이고 일관성을 확보하는 기법이다.

 

 

AOP의 핵심 개념


Aspect - 공통 기능을 담은 모듈(class)

  • Aspect는 클래스에 @Aspect를 붙여 선언한다

Advice - 적용 시점(전, 후, 예외)을 의미한다

  • @Before - 메서드 실행 전 기능을 실행
  • @After - 메서드 실행 후 기능을 실행한다 여기서 예외 여부는 관계없이 실행
  • @AfterReturning - 메서드가 정상적으로 실행된 후 실행
  • @AfterThrowing - 메서드 실행 중 예외가 발생되면 기능을 실행
  • @Around - 가장 강력한 기능으로 메서드 실행 전, 후, 예외 발생 등을 감싸서 어디서든 기능을 수행할 수 있다

Pointcut - 어떤 메서드들에 적용할지를 정의한 규칙

 

JoinPoint - 실제로 끼어들 지점(메서드 실행)

 

 

 

포인트컷 지정자


 

 

execution - 접근 제한자, 리턴 타입, 선언 타입, 메서드명, 파라미터 타입(개수)같은 정적 정보를 지정할 수 있다

  • 아래 이미지를 해석하면 public으로 선언되어야 하고 java.util.List를 반환하며, com.example 패키지에 속한 모든 클래스, 모든 메서드, 모든 매개 변수(타입이나 개수 상관X), throws 절에 java.io.IOException가 있을 시 적용 대상이라는 뜻이다
    ex) public List exam(int a) throws java.io.IOException

  • 추가적으로 *과 ..를 혼동할 수 있는데 *는 무엇이든 하나, .. 은 무엇이든 0개 이상이라고 해석할 수 있다

within - 패키지를 기준으로 매칭

// controller 패키지(하위 포함)에 '선언된' 모든 메서드
within(com.example.controller..*)

// 특정 클래스(또는 내부 클래스까지)
within(com.example.service.OrderServiceImpl)

 

this와 target - 비슷한 개념으로 this는 프록시 객체의 타입 기준, target은 실제 대상(원본) 객체의 타입 기준

// 프록시가 인터페이스 OrderService를 구현하면 매칭
this(com.example.order.OrderService)

// 실제 객체가 OrderServiceImpl이면 매칭(프록시 전략 무관하게 안전)
target(com.example.order.OrderServiceImpl)

 

args - 실제 전달된 매개변수를 기준으로 매칭

// 첫 매개 변수가 Long인 모든 호출
args(java.lang.Long, ..)

// 매개 변수가 2개 (String, *)
args(java.lang.String, *)

// 매개 변수가 0개
args()

 

@annotation - 애노테이션 기준으로 매칭

// @Timed 붙은 메서드만
@annotation(com.example.aop.Timed)

 

 

마지막으로 execution, within. annotation등은 정적 매칭으로 프록시 생성 시점에 매칭이 이루어지고 호출 때마다 재평가를 하지 않는다

하지만 args, this, target등은 동적매칭으로 런타임중 메서드가 호출될 때마다 런타임 정보(인자, 실제 타입)를 보고 추가로 검사한다

 

 

'CS > Spring' 카테고리의 다른 글

JPA  (1) 2025.08.27
DispatcherServlet  (3) 2025.08.25
Servlet? ServletContainer?  (5) 2025.08.18

+ Recent posts