Spring Boot

JH Kim·2026년 1월 16일

Spring

목록 보기
8/8

Spring Boot AOP

Aspect Oriented Programming(관점 지향 프로그래밍)을 Spring Boot 환경에서 구현한 기능입니다.

쉽게 말하면,

"여러 군데에서 반복적으로 쓰이는 기능을 공통으로 빼서 한 번에 적용하는 기술"

입니다

1. 왜 쓰나?

Spring Boot 프로젝트를 하다 보면, 여러 클래스/메서드에 반복되는 코드가 생깁니다.

예:

  • 로깅 (메서드 시작/끝 로그)
  • 실행 시간 측정
  • 트랜잭션 처리
  • 권한 체크
  • 예외 처리
  • API 호출 전/후 공통 처리

이걸 매번 복붙하면 유지보수가 힘들죠.

AOP를 쓰면 이 공통 로직을 한 곳에 정의하고 필요한 지점에 자동 삽입할 수 있습니다.


2. 핵심 개념

용어설명
Aspect공통 기능을 모아놓은 클래스
Join Point공통 기능을 삽입할 수 있는 지점 (메서드 실행, 예외 발생 등)
Pointcut공통 기능을 실제로 적용할 지점(메서드 패턴, 어노테이션 기준)
Advice실제 실행되는 공통 기능 코드 (Before, After, Around 등)
WeavingPointcut 위치에 Advice를 삽입하는 과정 (Spring은 런타임 Weaving 사용)

3. 기본 예제

java

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // execution(리턴타입 패키지명.클래스명.메서드명(매개변수))
    @Around("execution(* com.example.service.*.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        try {
            return joinPoint.proceed(); // 실제 메서드 실행
        } finally {
            long end = System.currentTimeMillis();
            System.out.println(joinPoint.getSignature() + " 실행 시간: " + (end - start) + "ms");
        }
    }
}

설명

  • @Aspect : 이 클래스가 AOP를 담당함을 명시
  • @Around : 메서드 실행 전/후를 감싸는 Advice
  • execution(* com.example.service.*.*(..)) : service 패키지의 모든 메서드에 적용
  • ProceedingJoinPoint.proceed() : 원래 메서드 실행

4. 적용 과정

  1. Spring Boot는 @EnableAspectJAutoProxy로 AOP를 활성화 (스프링 부트는 기본 활성화)
  2. 런타임에 프록시 객체를 만들어 원래 메서드 호출 전에 Advice 실행
  3. Pointcut 조건에 맞는 메서드에서만 공통 로직 동작

5. 장점 & 단점

장점

  • 코드 중복 제거
  • 공통 로직을 한 곳에서 관리
  • 서비스 로직과 부가 로직 분리 → 가독성↑, 유지보수↑

단점

  • 디버깅이 어려울 수 있음
  • 잘못 쓰면 로직이 뒤섞여 예측 어려움
  • 성능에 약간의 오버헤드
profile
Backend Engineer(Spring, API, Spring Boot, MSSql, SVN..)

0개의 댓글