AOP란?
AOP(Aspect-Oriented Programming)는 공통 관심 사항과 핵심 관심 사항을 분리하여 코드의 중복을 제거하고, 재사용성을 높이는 프로그래밍 기법이다.
쉽게 말해, 핵심 기능에 공통 기능(예: 로깅, 트랜잭션 관리)을 추가하거나 변경할 때, 기존 코드를 수정하지 않고도 이를 구현할 수 있도록 해준다.
AOP의 주요 개념
- 프록시 객체
- AOP는 핵심 기능을 대신 수행하는 프록시 객체를 생성하여 동작한다.
- 스프링에서는 프록시 객체를 자동으로 생성하여 AOP를 구현한다.
- 프록시 객체는 런타임 시 생성되며, 공통 관심 기능을 핵심 기능에 삽입하는 역할을 한다.
- 공통 관심 사항
- 예: 로깅, 인증, 권한 관리, 트랜잭션 처리 등.
- 공통 기능은 AOP에서 어드바이스(Advice)로 구현된다.
- 포인트컷(Pointcut)
- 공통 기능이 어느 메서드나 클래스에 적용될지를 정의한다.
- 예: @Pointcut("execution(* com.example..*(..))")
- 어드바이스(Advice)
- 공통 기능을 실행하는 코드이다.
- 적용 시점에 따라 구분된다:
- @Before: 메서드 호출 전에 실행.
- @After: 메서드 호출 후에 실행.
- @Around: 메서드 호출 전후 모두 실행. (가장 많이 사용됨)
- 조인 포인트(Join Point)
- AOP에서 공통 기능을 삽입할 수 있는 지점이다.
- 스프링 AOP에서는 메서드 호출에만 관여한다.
- 위빙(Weaving)
- 런타임 시 프록시 객체를 생성하여, 공통 기능을 핵심 기능에 삽입하는 과정을 의미한다.
AOP의 주요 구성 요소
- Aspect
- 어드바이스와 포인트컷을 합쳐 정의한 단위이다.
- 스프링에서는 @Aspect 애너테이션을 사용해 구현한다.
@Aspect
public class LoggingAspect {
// Pointcut: 적용할 메서드 정의
@Pointcut("execution(* com.example.service.*.*(..))")
public void logMethods() {}
// Advice: 메서드 실행 전후 로깅
@Around("logMethods()")
public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("메서드 실행 전: " + joinPoint.getSignature());
Object result = joinPoint.proceed(); // 실제 메서드 실행
System.out.println("메서드 실행 후: " + joinPoint.getSignature());
return result;
}
}
AOP의 장점
- 코드 중복 제거
- 공통 기능을 중앙에서 관리하여 코드 중복을 없애고 유지보수를 쉽게 한다.
- 핵심 로직과 공통 로직의 분리
- 비즈니스 로직과 공통 기능(예: 로깅)을 분리해 가독성과 모듈화를 높인다.
- 재사용성 향상
- 공통 관심 사항을 여러 곳에서 재사용 가능하다.