AOP 활용 방법 - Spring Boot

AOP는 정말 다양한 횡단 관심사(Cross-Cutting Concerns) 처리에 활용될 수 있어요. 우리가 흔히 떠올리는 로깅 외에도, 성능 측정, 트랜잭션, 보안, 감사(Audit), 캐싱, 리트라이, 데이터 암호화/복호화까지도 다뤄요. 💥


✅ Spring AOP를 활용할 수 있는 대표적인 시나리오들

1. 메서드 실행 시간 측정 (Performance Monitoring)

  • 특정 메서드들의 성능 병목 측정
  • 슬로우 쿼리 잡기
  • @LogExecutionTime 커스텀 어노테이션과 함께 자주 씀

2. 트랜잭션 관리 (@Transactional은 AOP 기반)

  • 선언적 트랜잭션 처리
  • 메서드 진입 시 트랜잭션 시작 → 정상 반환 시 커밋, 예외 발생 시 롤백
java
복사편집
@Transactional public void saveData() { ... }

3. 보안 처리 (접근 제어, 권한 체크 등)

  • 특정 권한이 있는 유저만 메서드 접근 허용
  • Spring Security도 내부적으로 AOP 사용
java
복사편집
@PreAuthorize("hasRole('ADMIN')") public void adminOnlyOperation() { ... }

4. 감사 로그(Audit Trail)

  • 중요한 메서드 호출이나 데이터 변경을 로그로 남김
  • 사용자 ID, 요청 시간, 변경 내용 기록

5. 입력값 검증 / 자동 암호화 & 복호화

  • 민감한 필드에 대한 사전/사후 처리
  • 예: 주민번호, 전화번호 마스킹 처리
java
복사편집
@Around("@annotation(EncryptSensitiveData)") public Object encryptHandler(ProceedingJoinPoint joinPoint) { // 복호화 → proceed → 암호화 }

6. 리트라이 로직 (Retry)

  • 실패한 외부 API 재시도
  • Spring Retry + AOP 조합
java
복사편집
@Retryable(value = RemoteApiException.class, maxAttempts = 3) public String callExternalApi() { ... }

7. 멀티 테넌시 (Multi-Tenancy)

  • 각 요청의 테넌트 정보를 컨텍스트에 세팅
  • AOP로 모든 DAO/Repository 호출 전에 처리 가능

8. 커스텀 애노테이션 기반 공통 로직

예: @Loggable, @Sensitive, @TrackUserAction

java
복사편집
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TrackUserAction { String value(); }

✨ 보너스: AOP + Annotation 활용 예

java
복사편집
@LogExecutionTime @TrackUserAction("게시물 조회") public PostDto getPost(Long id) { ... }

→ 각각의 애노테이션을 인식해서 실행 시간 + 사용자 활동을 자동 추적하게 할 수 있어요 💪


결론 🧠

"AOP = 공통 관심사를 깔끔하게 분리하는 힘"

복잡한 코드에서 비즈니스 로직과 인프라성 코드(로그, 트랜잭션 등)를 분리해서 유지보수성과 재사용성을 극대화할 수 있어요.