Spring AOP는 개발하면서 흔히 중복되는 부가적인 로직(로깅, 트랜잭션 처리, 보안 등)을 핵심 비즈니스 로직과 분리해 깔끔하게 관리할 수 있게 해주는 강력한 기능입니다.
AOP란 무엇인가?
AOP는 Aspect Oriented Programming의 약자로, "횡단 관심사(Cross-Cutting Concern)"를 모듈화하는 프로그래밍 패러다임입니다.
- 핵심 로직과는 별개로 애플리케이션 전반에 걸쳐 반복되는 기능(예: 로깅, 보안, 트랜잭션)
- 이런 로직을 공통 모듈로 분리해 코드의 재사용성과 유지보수성을 높임
기존 방식으로는 매 서비스 클래스마다 로그를 찍는 코드가 중복됐겠지만, AOP를 활용하면 하나의 Aspect 클래스에서 처리 가능합니다.
AOP의 핵심 개념
- Aspect: 공통 기능을 모듈화한 클래스
- Join Point: Aspect가 적용될 수 있는 지점 (메서드 실행 등)
- Advice: Join Point에 실행될 실제 로직 (@Before, @After 등)
- Pointcut: Advice를 적용할 Join Point를 필터링
- Weaving: 실제 객체에 Aspect를 적용하는 과정 (Spring은 런타임 Weaving)
Spring AOP 적용 예제
실제로 로깅 기능을 AOP로 구현하는 예제를 보겠습니다.
1. 의존성 추가 (Gradle)
implementation 'org.springframework.boot:spring-boot-starter-aop'
2. 로깅 Aspect 클래스 작성
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.example.service..*(..))")
public void allServiceMethods() {}
@Before("allServiceMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("[Before] " + joinPoint.getSignature().toShortString());
}
@AfterReturning(pointcut = "allServiceMethods()", returning = "result")
public void logAfter(JoinPoint joinPoint, Object result) {
System.out.println("[After] " + joinPoint.getSignature().toShortString() + " => " + result);
}
}
3.서비스 클래스 예시
@Service
public class UserService {
public String getUser(String id) {
return "User:" + id;
}
}
위처럼 AOP를 적용하면, UserService의 모든 메서드 실행 전후에 로그가 자동으로 찍힙니다.
AOP 적용 시 주의할 점
- AOP는 기본적으로 프록시 기반이므로, public 메서드에만 적용됩니다.
- 내부 메서드 호출(self-invocation)에는 AOP가 적용되지 않습니다.
- Pointcut 표현식을 명확히 작성하지 않으면, 원치 않는 곳에 Advice가 적용될 수 있습니다.
실무에서의 AOP 활용 사례
- API 요청 로그 수집: 모든 Controller에 대한 진입 로그 출력
- 트랜잭션 감지: 서비스 로직 전후로 DB 상태 확인
- 보안 체크: 특정 어노테이션 기반으로 권한 검사
- 성능 측정: 메서드 실행 시간 측정
Spring AOP는 우리가 흔히 놓치기 쉬운 ‘중복’과 ‘부수 로직’을 깔끔히 정리해줍니다. 코드의 핵심 로직에만 집중할 수 있도록 도와주는 도구죠. 단순히 기능으로서가 아니라, 아키텍처 설계의 중요한 한 축으로 자리 잡은 기술입니다.
'개발 > JAVA' 카테고리의 다른 글
| [JAVA] 로깅과 AOP를 이용한 공통 로직 처리 (0) | 2025.10.30 |
|---|---|
| [JAVA] Spring AOP에서 @Aspect와 @Around 어노테이션 제대로 활용하기 (0) | 2025.10.29 |
| [JAVA] Spring에서 세션 관리와 Redis 세션 클러스터링 (0) | 2025.10.27 |
| [JAVA] Spring Boot에서 OAuth2 소셜 로그인 구현하기 (kakao) (0) | 2025.10.26 |
| [JAVA] JWT 기반 인증/인가 구현하기 (Spring Boot 실전 가이드) (0) | 2025.10.25 |
