본문 바로가기

Web-BE/Spring

스프링 AOP(Spring AOP) 제대로 이해하기

반응형

스프링을 공부하다 보면 @Transactional, @Around, @Aspect 같은 어노테이션을 만나게 된다.
이 어노테이션들의 기반이 되는 개념이 바로 AOP(Aspect-Oriented Programming) 이다.

이번 글에서는

AOP가 왜 필요하고, 스프링 AOP는 어디에 어떻게 적용되는지를 중심으로 정리해보려고 한다.

 

AOP란 무엇인가?

AOP는 관점 지향 프로그래밍이라고 불리며,
핵심 로직과 공통 관심사(Cross-cutting Concern) 를 분리하기 위한 프로그래밍 기법이다.

공통 관심사의 예

  • 로깅
  • 트랜잭션 처리
  • 보안 / 권한 검사
  • 성능 측정

이런 로직들은
비즈니스 로직과는 직접적인 관련은 없지만, 반드시 필요한 코드들이다.


공통 로직을 비즈니스 코드에 직접 작성

이런 성능 측정 로직을 비즈니스 코드에 직접 작성하면 다음과 같은 문제가 생긴다.

public void createUser() {
    long start = System.currentTimeMillis();

    // 비즈니스 로직
    ...

    long end = System.currentTimeMillis();
    log.info("실행 시간: {}", end - start);
}
  • 코드 중복 증가
  • 비즈니스 로직 가독성 저하
  • 변경에 취약

즉, 공통 관심사가 핵심 로직을 침범하기 시작하는 순간 유지보수가 어려워진다.

AOP는 이런 공통 로직을 코드 밖으로 분리한다.

 

AOP의 핵심 아이디어

AOP는 이 문제를 이렇게 해결한다.

“공통 로직은 공통 로직대로 한 곳에 모아두고, 필요한 지점에 끼워 넣자”

 

즉 비즈니스 로직은  본인이 해야 할 일만, 공통 관심사는 별도의 영역에서 관리 이렇게 역할을 분리하는 것이다.

이를 통해 얻는 장점

  • 비즈니스 코드가 깔끔해진다
  • 공통 로직을 한 곳에서 관리할 수 있다
  • 변경에 강한 구조가 된다

스프링 AOP는 이걸 어떻게 구현할까?

스프링 AOP는 프록시(Proxy) 객체를 기반으로 동작한다.

개발자가 직접 메서드를 호출한다고 생각하지만, 실제로는 스프링이 만들어준 프록시 객체가 먼저 호출을 가로챈다.

그리고 그 사이에 공통 로직을 실행한다.

클라이언트
   ↓
프록시 객체
   ↓
공통 로직 (로깅, 트랜잭션 등)
   ↓
실제 비즈니스 메서드
 
 

이 구조 덕분에 비즈니스 코드는 공통 로직의 존재를 전혀 몰라도 된다.


@Aspect, @Around 의미

이제 우리가 자주 보던 어노테이션들을 정리해보자.

@Aspect

“이 클래스는 공통 관심사를 담고 있는 AOP 클래스입니다” 라고 스프링에게 알려주는 역할이다.

@Aspect
@Component
public class LoggingAspect {
}

 


@Around

“이 메서드는 지정한 지점을 기준으로 실행 전 / 실행 후 / 예외 발생 시 모두 제어”

 

@Around("execution(* com.example.service..*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
    long start = System.currentTimeMillis();

    Object result = joinPoint.proceed(); // 실제 메서드 실행

    long end = System.currentTimeMillis();
    log.info("{} 실행 시간: {}ms",
             joinPoint.getSignature(),
             end - start);

    return result;
}

 

이제 더 이상 비즈니스 코드 안에 시간 측정 로직을 작성할 필요가 없다.


@Transactional도 AOP다

많이 사용하는 @Transactional 역시
대표적인 스프링 AOP 적용 사례다.

@Transactional
public void createUser() {
    // 비즈니스 로직
}
 

이 어노테이션 하나로

  • 메서드 시작 시 트랜잭션 시작
  • 정상 종료 시 commit
  • 예외 발생 시 rollback

이 모든 작업이 AOP를 통해 자동으로 처리된다.


정리

  • AOP는 공통 관심사와 핵심 로직을 분리하기 위한 개념이다
  • 스프링 AOP는 프록시 기반으로 동작한다
  • 로깅, 트랜잭션, 보안 같은 기능을 비즈니스 코드 밖에서 깔끔하게 관리할 수 있다
  • 우리가 자주 쓰는 @Transactional, @Aspect, @Around는 모두 AOP 위에서 동작한다

 

 

반응형

'Web-BE > Spring' 카테고리의 다른 글

[Spring] Filter 정리  (0) 2025.12.19