스프링 AOP

토토들·2026년 2월 1일

Spring AOP(Aspect-Oriented Programming)는 스프링 프레임워크의 핵심 기능으로 관점 지향 프로그래밍이라고 불린다.
쉽게 말해, 애플리케이션의 여기저기에 흩어져 있는 공통적인 기능(부가 기능)을 한곳에 모아서 관리하는 프로그래밍 기법이다.

1. 왜 AOP가 필요한가? (핵심 개념)
개발을 하다 보면 비즈니스 로직과는 상관없지만, 여러 곳에서 반복적으로 사용되는 코드들이 있다. 이를 횡단 관심사(Cross-cutting Concerns)라고 한다.

  • 핵심 관심사 : 업무 로직 (예: 계좌 이체, 상품 주문, 회원 가입)
  • 횡단 관심사 : 보안, 로깅, 트랙잭션, 예외 처리 등

AOP가 없다면 ? 모든 모든 비즈니스 메소드마다 로그를 찍고, 트랜잭션을 시작하고 끝내는 코드를 일일이 복사해서 붙여넣어야 하므로, 코드가 지저분해지고 유지보수가 매우 힘들어진다.

AOP 를 사용한다면 ? 공통 기능을 별도의 클래스로 분리하고, 실행 시점에 비즈니스 로직 앞뒤에 자동으로 끼워 넣는다. 결과적으로 비즈니스 로직은 자신의 역할에만 집중할 수 있게 된다.

  • Aspect : 흩어진 관심사를 모듈화 한 것 (Advice + Pointcut)
  • Advice : 실질적으로 어떤 일을 해야 할지, 언제 해야 할지에 대한 정의(Before, After, Around 등).
  • Pointcut: Advice를 적용할 타겟(JoinPoint)를 선별하는 표현식.
  • JoinPoint: Advice가 적용될 수 있는 위치(메소드 실행 시점, 생성자 호출 시점 등), 스프링 AOP는 메소드 실행만 지원
  • Target: 핵심 기능을 담고 있는 모듈

이를 은행 업무에 맞춰 비교해보자, Aspect는 '보안 검사'라는 업무 자체이고, Advice는 출입증을 들어갈 때, 검사할지, 나올 때 검사할 지 결정하는 역할.
Pointcut은 'VIP실' 들어가는 사람만 검사하라는 로직
JoinPoint 문을 통하나는 그 순간...
Target은 실제 은행원 즉, 업무 처리자로 생각할 수 있다.

  1. 스프링 AOP의 동작 원리 : 프록시(Proxy)
    스프링 AOP는 프록시 패턴(Proxy Pattern)을 기반으로 동작.
    1. 클라이언트가 Service 객체의 메소드를 호출
    2. 스프링은 Target 객체 대신, 이를 감싸고 있는 가짜 객체(Proxy)를 먼저 호출
    3. Proxy는 설정된 Advice(예: 트랜잭션 시작, 로그 출력)를 먼저 실행합니다.
    4. 그 후 실제 Target 객체의 비즈니스 로직을 호출합니다.
    5. 비즈니스 로직이 끝나면 다시 Proxy로 돌아와 마무리 작업(예: 트랜잭션 커밋)을 수행한다. 1) 어노테이션 정의 및 적용 (Target)
@Service
public class UserService {
    
    // 이 메소드 실행 시간을 재고 싶음
    @LogExecutionTime 
    public void join(User user) {
        // ... 회원가입 핵심 로직 ...
        repository.save(user);
    }
}

2) Aspect 정의 (부가 기능 구현)

Java

@Component
@Aspect
public class LogAspect {

    // @LogExecutionTime 어노테이션이 붙은 곳 주변(Around)에서 실행
    @Around("@annotation(LogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        
        long start = System.currentTimeMillis(); // 1. 시작 전 로직
        
        Object proceed = joinPoint.proceed();    // 2. 실제 타겟 메소드(join) 실행
        
        long executionTime = System.currentTimeMillis() - start; // 3. 종료 후 로직
        
        System.out.println(joinPoint.getSignature() + " 실행 시간: " + executionTime + "ms");
        
        return proceed;
    }
}
  1. 요약: 왜 스프링 AOP를 쓸까요?

    1. 코드 중복 제거: 로깅, 트랜잭션 코드를 한곳에서 관리합니다.

    2. 비즈니스 로직 집중: 개발자는 핵심 업무 코드만 작성하면 됩니다.

    3. 유지보수성 향상: 공통 기능 수정 시 Aspect 클래스 하나만 고치면 모든 곳에 적용됩니다

profile
패션과 개발을 좋아합니다.

0개의 댓글