Spring에서 반복적인 코드(로깅, 트랜잭션, 보안 검사 등)를 공통으로 처리하고 싶을 때, AOP(Aspect Oriented Programming)는 매우 강력한 도구입니다. 특히 @Aspect와 @Around 어노테이션은 AOP의 핵심을 이루는 중요한 개념이죠.
@Aspect란?
@Aspect는 해당 클래스가 AOP 기능을 제공하는 클래스임을 Spring에게 알려주는 어노테이션입니다. 쉽게 말하면 "이 클래스는 여러 지점(Pointcut)에 관여해서 공통 기능을 끼워넣을 거야!" 라는 선언입니다.
@Around 어노테이션의 역할
@Around는 메서드 실행 전/후, 예외 발생 여부 등 모든 시점에 개입할 수 있는 가장 강력한 어드바이스 타입입니다. ProceedingJoinPoint를 사용해 원래의 메서드 실행을 명시적으로 제어할 수 있습니다.
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.service..*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // 실제 대상 메서드 실행
long end = System.currentTimeMillis();
System.out.println("[LOG] " + joinPoint.getSignature() + " 실행 시간: " + (end - start) + "ms");
return result;
}
}
Pointcut 표현식 살펴보기
execution(* com.example.service..*(..)): 해당 패키지 이하의 모든 클래스, 모든 메서드에 적용within(com.example.controller..*): 특정 패키지 내 클래스 전체에 적용@annotation(MyCustomAnnotation): 특정 어노테이션이 붙은 메서드에만 적용
실무 적용 팁
- 서비스 레이어의 로깅, 트랜잭션 시간 측정에 유용
- 커스텀 어노테이션과 조합하면 역할 분리가 명확해짐
- 조심할 점: AOP는 프록시 기반이라 private 메서드는 적용되지 않음
@Aspect와 @Around는 Spring AOP에서 공통 관심사를 구현할 때 매우 유용합니다. 복잡한 서비스 로직에 중복된 코드를 넣지 않고, 필요한 곳에만 AOP로 기능을 분리할 수 있어 유지보수성이 크게 향상됩니다. 실무에서는 로깅, 보안, 트랜잭션, 성능 측정 등에 많이 활용되며, Pointcut을 잘 정의하는 것이 핵심입니다.
'개발 > JAVA' 카테고리의 다른 글
| [JAVA] Spring Scheduler와 @Scheduled 사용법 — 안정적인 스케줄링 구현하기 (0) | 2025.10.31 |
|---|---|
| [JAVA] 로깅과 AOP를 이용한 공통 로직 처리 (0) | 2025.10.30 |
| [JAVA] Spring AOP(관점 지향 프로그래밍) 기초 완전 정복 (0) | 2025.10.28 |
| [JAVA] Spring에서 세션 관리와 Redis 세션 클러스터링 (0) | 2025.10.27 |
| [JAVA] Spring Boot에서 OAuth2 소셜 로그인 구현하기 (kakao) (0) | 2025.10.26 |
