Post

AOP, Spring AOP

AOP, Spring AOP

📌 AOP란?

AOP(Aspect-Oriented Programming) 은 여러 모듈에서 반복되는 공통 기능을 하나의 모듈로 분리하여 재사용이 가능한 모듈로 만드는 프로그래밍 패러다임을 말한다. 관점 지향 프로그래밍이라고 부른다.

비즈니스 로직을 작성하다 보면, 여러 모듈에 걸쳐 공통으로 필요한 기능들이 중복으로 구현되는 경우가 많다. 이렇게 코드의 중복성이 증가하면 유지보수 시 큰 어려움이 있다. AOP를 통해 로직을 Core Concern (핵심 기능)과 Cross-cutting Concerns (부가 기능)으로 분리하여 코드의 재사용성과 유연성을 높인다.

📌 용어

  • Join Point

조인 포인트는 AOP를 적용할 수 있는 지점이다. 메서드 실행, 생성자 호출, 필드 값 접근 등의 지점이 될 수 있다. Spring AOP 는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 시점으로 제한된다. 프록시 특성 상 메서드 호출을 가로챌 수는 있지만 생성자 호출이나 필드 값 변경을 가로챌 수는 없기 때문이다.

  • Advice

특정 조인 포인트에서 실행되는 코드로 실제 부가 기능을 담은 구현체이다. 언제, 어떤 작업을 수행할지 결정한다. 어드바이스는 여러 종류가 있는데, Before 은 메서드 실행 전, After 는 메서드 실행 후 동작한다. After-returning 은 메서드가 정상 실행 후, After-throwing 은 예외가 발생한 후 동작한다. Around 모든 시점에서 동작한다.

  • Target

타겟은 부가 기능을 부여할 대상이다. 즉, 어드바이스를 받는 객체로, 포인트컷으로 어느 타겟에 들어갈지 결정된다.

  • Pointcut

포인트컷은 어드바이스를 적용할 타겟의 메서드를 결정하는 방법이다.

  • Aspect

애스펙트는 AOP의 기본 모듈로, 어드바이스와 포인트컷을 합친 개념이다.

  • Weaving

위빙은 포인트컷에 의해 결정된 타겟의 조인 포인트에 어드바이스를 삽입하는 과정이다. 위빙을 통해 타겟의 코드에 영향을 주지 않으면서 어드바이스를 추가할 수 있다. 위빙 시점에 따라 컴파일 타임 위빙, 로드 타임 위빙, 런타임 위빙이 존재한다.

  • Advisor

어드바이저는 하나의 어드바이스와 하나의 포인트컷으로 구성되며 스프링 AOP에서만 사용되는 용어이다.

  • AOP Proxy

AOP 프록시는 AOP를 구현하기 위한 프록시 객체로 스프링 AOP에서는 JDK 프록시 또는 CGLIB 프록시를 사용한다. JDK 프록시는 인터페이스를 구현한 클래스에, CGLIB 프록시는 일반 클래스에 적용된다.

📌 Spring AOP 구현 방법

어노테이션을 통해 AOP를 구현해보자.

1
implementation 'org.springframework.boot:spring-boot-starter-aop'

Spring AOP 의존성을 추가한다.

1
2
3
4
5
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // ...
}

AOP를 활성화하기 위해 @EnableAspectJAutoProxy 를 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Aspect
@Component
public class LoggingAspect {
    
    @Pointcut("execution(* com.example.service.*.*(..))")
    private void serviceLayer() {}
    
    @Before("serviceLayer()")
    public void beforeAdvice(JoinPoint joinPoint) {
        // ...
    }
}

@Aspect 어노테이션을 통해 Aspect를 정의한다. 포인터컷은 @Pointcut 어노테이션으로 정의하며, 어드바이스는 유형에 따른 어노테이션으로 정의한다.

📌 참고

https://dev-coco.tistory.com/81

https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP

https://sharonprogress.tistory.com/195

This post is licensed under CC BY 4.0 by the author.