🔍 AOP란?
AOP(Aspect Oriented Programming)는 공통 관심사(Cross-cutting Concerns)를 모듈화하여 핵심 비즈니스 로직과 분리시키는 프로그래밍 패러다임이다.
예를 들어, 로깅(logging), 트랜잭션 처리(transaction management), 보안(security), 성능 측정(performance monitoring) 등의 기능은 대부분의 서비스에 공통으로 적용된다. 이러한 코드들이 여러 클래스에 흩어져 있다면, 유지보수가 어려워진다.
AOP는 이러한 문제를 해결하기 위해, 공통 기능을 별도로 분리하고 선언을 통해 적용할 수 있도록 한다.
Spring 프레임워크는 AOP를 핵심 기능 중 하나로 지원한다. Spring에서 AOP를 사용하는 이유는 아래와 같다.
📖 1. 관심사의 분리
비즈니스 로직과 로깅, 보안, 트랜잭션 같은 공통 기능을 분리해 코드를 깔끔하게 유지할 수 있다.
📖 2. 중복 코드 제거
반복적으로 작성하던 코드를 하나의 Aspect로 정의해 중복성을 제거할 수 있다.
📖 3. 유지보수 용이
공통 로직이 하나의 모듈에 정의되어 있으므로 변경이 필요할 때 한 군데만 수정하면 된다.
📖 4. 선언적 프로그래밍 지원
@Aspect와 같은 어노테이션으로 직관적인 구성이 가능하고, XML 설정 없이 자바 코드로 간편하게 구성할 수 있다.
| 용어 | 설명 |
|---|---|
| Aspect | 공통 관심사를 모듈화한 것. 로깅, 트랜잭션, 보안 등 |
| Join Point | Advice가 적용될 수 있는 지점 (예: 메서드 호출) |
| Advice | 실제로 적용할 공통 기능. Before, After, Around 등 |
| Pointcut | Join Point를 선별하는 표현식 |
| Weaving | Advice를 Join Point에 적용하는 과정 |

핵심 비즈니스 코드
@Service
public class UserService {
public void registerUser(String username) {
System.out.println("사용자 등록 완료: " + username);
}
public void deleteUser(String username) {
System.out.println("사용자 삭제 완료: " + username);
}
}
공통 Logging 코드
@Aspect
@Component
public class LoggingAspect {
// 모든 service 패키지의 모든 메서드에 적용
@Pointcut("execution(* com.example.service..*(..))")
public void serviceMethods() {}
@Before("serviceMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("[Before] 호출 메서드: " + joinPoint.getSignature().getName());
}
@AfterReturning("serviceMethods()")
public void logAfter(JoinPoint joinPoint) {
System.out.println("[After] 완료된 메서드: " + joinPoint.getSignature().getName());
}
}
Spring AOP는 애플리케이션 전반에 걸쳐 반복적으로 나타나는 공통 기능을 모듈화함으로써, 코드의 재사용성, 유지보수성, 가독성을 높여준다. 특히 규모가 큰 프로젝트에서는 AOP를 적절히 활용 시, 그 효과가 두드러진다.