Contents
see List작성일 2014. 09. 25.
Spring AOP와 트랜잭션 순서 설정하기
Spring에서 AOP(AspectJ)와 트랜잭션이 동시에 적용될 때 실행 순서를 제어하는 방법입니다. @Order 어노테이션과 Ordered 인터페이스를 활용합니다.
1. 문제 상황
로깅 AOP가 트랜잭션보다 먼저 실행되면 트랜잭션 밖에서 로깅되어 롤백 시 잘못된 로그가 남을 수 있습니다.
// 원하는 순서: 트랜잭션 시작 → 로깅 → 비즈니스 로직 → 로깅 → 트랜잭션 종료
// 잘못된 순서: 로깅 → 트랜잭션 시작 → 비즈니스 로직 → 트랜잭션 종료 → 로깅
2. @Order 어노테이션 사용
@Aspect
@Component
@Order(1) // 숫자가 낮을수록 먼저 실행 (외부)
public class LoggingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
log.info("메서드 시작: {}", pjp.getSignature());
Object result = pjp.proceed();
log.info("메서드 종료: {}", pjp.getSignature());
return result;
}
}
@Aspect
@Component
@Order(2) // LoggingAspect 다음에 실행 (내부)
public class SecurityAspect {
// ...
}
3. 트랜잭션 순서 설정
@Configuration
@EnableTransactionManagement(order = 0) // 가장 먼저 (가장 바깥)
public class TransactionConfig {
// ...
}
// 또는 XML 설정
<tx:annotation-driven order="0"/>
4. 실행 순서 예시
// Order 값: 트랜잭션(0) → 로깅(1) → 보안(2)
트랜잭션 시작 ─┐
로깅 시작 ─┤
보안 체크 ─┤
비즈니스 로직
보안 체크 ─┘
로깅 종료 ─┘
트랜잭션 커밋 ─┘
5. Ordered 인터페이스 구현
@Aspect
@Component
public class LoggingAspect implements Ordered {
@Override
public int getOrder() {
return 1;
}
// ...
}
6. 실전 권장 순서
| Order | Aspect | 용도 |
|---|---|---|
| 0 | Transaction | 트랜잭션 관리 (가장 외부) |
| 1 | Logging | 메서드 진입/종료 로깅 |
| 2 | Security | 권한 검사 |
| 3 | Validation | 입력값 검증 |
| 4 | Caching | 캐시 처리 |
7. 주의사항
- Order 값이 같으면 실행 순서 보장 안 됨
- @Order는 Spring Bean에만 적용
- Lowest값(Integer.MAX_VALUE)이 가장 마지막 실행
- Aspect끼리만 순서 조절, 일반 빈은 별도
8. 디버깅 팁
// 현재 적용된 AOP 순서 확인
@Autowired
private AspectJProxyFactory factory;
// 로그 레벨 설정
logging.level.org.springframework.aop=DEBUG
logging.level.org.springframework.transaction=DEBUGspring
| No | 작성일 | Title |
|---|---|---|
| 3360 | 2026. 08. 15. | Spring Boot Actuator와 Micrometer로 장애 징후를 먼저 찾는 운영 모니터링 구성 |
| 3328 | 2026. 08. 06. | Spring Boot 예외 처리 표준화 가이드: ProblemDetail로 일관된 API 오류 응답 만들기 |
| 3296 | 2026. 07. 29. | Spring Boot 로그인 API 보안 설계: 세션 없이 JWT를 안전하게 검증하는 방법 |
| 3265 | 2026. 07. 21. | Spring Boot API 장애 원인 빨리 찾기: Actuator와 Micrometer 관측성 구성 가이드 |
| 3238 | 2026. 07. 13. | Spring Boot 안정적인 외부 API 연동: WebClient·Circuit Breaker·Retry를 함께 운영하는 실전 가이드 |
| 3182 | 2026. 07. 04. | Spring Boot 무중단 배포를 위한 Graceful Shutdown과 Readiness Probe 설정 |
| 3137 | 2026. 06. 26. | Spring Security API 권한 설계: 공개 엔드포인트와 관리자 기능을 분리하는 실전 기준 |
| 3081 | 2026. 06. 18. | Spring Boot API 장애 추적을 위한 요청 ID와 관측 로그 설계 |
| 2992 | 2026. 06. 10. | Spring Boot 무중단 배포를 위한 준비 상태 점검과 종료 처리 설계 |
| 2935 | 2026. 06. 02. | Spring Boot Redis 캐시 운영 가이드: TTL, 무효화, 캐시 스탬피드 방지 설계 |