Dev./Spring

[Spring] AOP 정리

limitation01 2025. 12. 3. 08:58

AOP란

AOP (Aspect Oriented Programming) 는 여러 곳에 반복되는 공통 관심사를 비즈니스 로직과 분리해서
한 곳에서 관리하기 위한 프로그래밍 기법

AOP가 왜 필요할까?

예를들어 기획자가 개발자님 성능 측정을 위해 모든 메서드에 시작 시간과 종료 시간을 남기는 기능 추가해주세요

라고 요청을 했을 때

public void save() {
    log.info("start");
    // 비즈니스 로직
    log.info("end");
}

다음과 같은 코드가 모든 서비스 메서드마다 중복되면

 

  • 로깅, 트랜잭션, 권한 체크 코드가 모든 메서드에 흩어짐
  • 수정하려면 전체 코드를 다 건드려야 함
  • 비즈니스 로직이 더러워짐

AOP 도입 후에는 

 

시간 측정은 AOP가 알아서 처리한다.


AOP는 어디에 적용되는걸까?

AOP는 HTTP 요청 흐름과는 무관하다.

  • Service 메서드
  • Repository 메서드
  • Scheduler
  • 내부 메서드 호출

AOP 용어 

용어 설명
Join Point 메서드 실행 시점
Pointcut 어떤 메서드(Join Point)에 끼어들지 정하는 조건
Advice 끼어들어서 실행할 실제 AOP 로직 @Before @After @Around
Aspect 공통 관심사를 담는 모듈(로깅, 트랜잭션, 권한 체크)

AOP 어노테이션

 

  • @Before : 메서드 실행 전
  • @After : 메서드 종료 후
  • @AfterReturning : 정상 종료 후
  • @AfterThrowing : 예외 발생 시
  • @Around : 실행 전·후 모두 제어

실습- 실행 시간 측정 AOP 만들기

package org.example.nbcam_addvanced_1.common.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class TimeCheckAop {

    @Around("execution(* org.example.nbcam_addvanced_1.user.service..*(..))")
    public Object executionTime(ProceedingJoinPoint joinPoint) throws Throwable {

        long start = System.currentTimeMillis();

        Object result = joinPoint.proceed(); // 실제 메서드 실행 -> Filter에서 doFilter 와 비슷함.

        long end = System.currentTimeMillis();
        log.info("[AOP] {} 실행됨 in {}ms" , joinPoint.getSignature() , end - start);

        return result;
    }
}