Spring AOP(Aspect-Oriented Programming)는 스프링 프레임워크의 핵심 기능으로 관점 지향 프로그래밍이라고 불린다.
쉽게 말해, 애플리케이션의 여기저기에 흩어져 있는 공통적인 기능(부가 기능)을 한곳에 모아서 관리하는 프로그래밍 기법이다.
1. 왜 AOP가 필요한가? (핵심 개념)
개발을 하다 보면 비즈니스 로직과는 상관없지만, 여러 곳에서 반복적으로 사용되는 코드들이 있다. 이를 횡단 관심사(Cross-cutting Concerns)라고 한다.
AOP가 없다면 ? 모든 모든 비즈니스 메소드마다 로그를 찍고, 트랜잭션을 시작하고 끝내는 코드를 일일이 복사해서 붙여넣어야 하므로, 코드가 지저분해지고 유지보수가 매우 힘들어진다.
AOP 를 사용한다면 ? 공통 기능을 별도의 클래스로 분리하고, 실행 시점에 비즈니스 로직 앞뒤에 자동으로 끼워 넣는다. 결과적으로 비즈니스 로직은 자신의 역할에만 집중할 수 있게 된다.
이를 은행 업무에 맞춰 비교해보자, Aspect는 '보안 검사'라는 업무 자체이고, Advice는 출입증을 들어갈 때, 검사할지, 나올 때 검사할 지 결정하는 역할.
Pointcut은 'VIP실' 들어가는 사람만 검사하라는 로직
JoinPoint 문을 통하나는 그 순간...
Target은 실제 은행원 즉, 업무 처리자로 생각할 수 있다.
@Service
public class UserService {
// 이 메소드 실행 시간을 재고 싶음
@LogExecutionTime
public void join(User user) {
// ... 회원가입 핵심 로직 ...
repository.save(user);
}
}
2) Aspect 정의 (부가 기능 구현)
Java
@Component
@Aspect
public class LogAspect {
// @LogExecutionTime 어노테이션이 붙은 곳 주변(Around)에서 실행
@Around("@annotation(LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis(); // 1. 시작 전 로직
Object proceed = joinPoint.proceed(); // 2. 실제 타겟 메소드(join) 실행
long executionTime = System.currentTimeMillis() - start; // 3. 종료 후 로직
System.out.println(joinPoint.getSignature() + " 실행 시간: " + executionTime + "ms");
return proceed;
}
}
요약: 왜 스프링 AOP를 쓸까요?
코드 중복 제거: 로깅, 트랜잭션 코드를 한곳에서 관리합니다.
비즈니스 로직 집중: 개발자는 핵심 업무 코드만 작성하면 됩니다.
유지보수성 향상: 공통 기능 수정 시 Aspect 클래스 하나만 고치면 모든 곳에 적용됩니다