스프링을 공부하다 보면 @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 |
|---|