본문 바로가기

spring/AOP

AOP 프록시 객체

AOP란?

AOP(Aspect-Oriented Programming)는 공통 관심 사항과 핵심 관심 사항을 분리하여 코드의 중복을 제거하고, 재사용성을 높이는 프로그래밍 기법이다.
쉽게 말해, 핵심 기능에 공통 기능(예: 로깅, 트랜잭션 관리)을 추가하거나 변경할 때, 기존 코드를 수정하지 않고도 이를 구현할 수 있도록 해준다.

 

AOP의 주요 개념

  1. 프록시 객체
    • AOP는 핵심 기능을 대신 수행하는 프록시 객체를 생성하여 동작한다.
    • 스프링에서는 프록시 객체를 자동으로 생성하여 AOP를 구현한다.
    • 프록시 객체는 런타임 시 생성되며, 공통 관심 기능을 핵심 기능에 삽입하는 역할을 한다.
  2. 공통 관심 사항
    • 예: 로깅, 인증, 권한 관리, 트랜잭션 처리 등.
    • 공통 기능은 AOP에서 어드바이스(Advice)로 구현된다.
  3. 포인트컷(Pointcut)
    • 공통 기능이 어느 메서드나 클래스에 적용될지를 정의한다.
    • 예: @Pointcut("execution(* com.example..*(..))")
  4. 어드바이스(Advice)
    • 공통 기능을 실행하는 코드이다.
    • 적용 시점에 따라 구분된다:
      • @Before: 메서드 호출 전에 실행.
      • @After: 메서드 호출 후에 실행.
      • @Around: 메서드 호출 전후 모두 실행. (가장 많이 사용됨)
  5. 조인 포인트(Join Point)
    • AOP에서 공통 기능을 삽입할 수 있는 지점이다.
    • 스프링 AOP에서는 메서드 호출에만 관여한다.
  6. 위빙(Weaving)
    • 런타임 시 프록시 객체를 생성하여, 공통 기능을 핵심 기능에 삽입하는 과정을 의미한다.

 

AOP의 주요 구성 요소

  1. 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의 장점

  1. 코드 중복 제거
    • 공통 기능을 중앙에서 관리하여 코드 중복을 없애고 유지보수를 쉽게 한다.
  2. 핵심 로직과 공통 로직의 분리
    • 비즈니스 로직과 공통 기능(예: 로깅)을 분리해 가독성과 모듈화를 높인다.
  3. 재사용성 향상
    • 공통 관심 사항을 여러 곳에서 재사용 가능하다.