AOP(Aspect-Oriented Programming)란? 스프링에서의 활용법

## AOP(Aspect-Oriented Programming)란? AOP(Aspect-Oriented Programming)은 객체 지향 프로그래밍(OOP)을 보완하는 프로그래밍 패러다임 중 하나로, OOP의 한계를 극복하기 위해 등장한 개념입니다. OOP는 코드의 모듈화, 재사용성, 유지보수성을 향상시키는데 큰 기여를 했지만, 횡단 관심사(cross-cutting concern)에 대한 처리가 어려운 한계가 있습니다. 횡단 관심사란, 여러 모듈이나 객체에서 공통으로 나타나는 기능을 말하며, 예를 들어 로깅, 트랜잭션 처리, 보안 등이 있습니다. 이러한 횡단 관심사는 기능의 분리와 모듈화를 어렵게 하고, 코드 중복을 유발하여 유지보수를 어렵게 만듭니다. AOP는 이러한 문제를 해결하기 위해 등장한 개념으로, 횡단 관심사를 모듈화하여 쉽게 재사용하고 적용할 수 있도록 합니다. AOP는 주요 로직에서 횡단 관심사를 분리하여 관리하는 방식으로 동작하며, 이를 위해 Advice(조언), Joinpoint(결합점), Pointcut(포인트컷), Aspect(관점) 등의 개념을 사용합니다. – Advice(조언): 횡단 관심사를 정의한 코드로, 언제 적용될지를 결정합니다. Advice에는 Before, After, Around 등의 종류가 있습니다. – Joinpoint(결합점): Advice가 적용될 수 있는 지점을 말합니다. 메서드 실행 전, 후, 예외 발생 시 등이 결합점에 해당합니다. – Pointcut(포인트컷): Advice가 적용될 Joinpoint의 집합을 말합니다. 포인트컷은 정규 표현식이나 애노테이션 등으로 표현할 수 있습니다. – Aspect(관점): Advice와 Pointcut을 결합한 것으로, 특정한 횡단 관심사를 담당하는 모듈을 말합니다. ## 스프링에서의 AOP 활용법 스프링 프레임워크는 AOP를 지원하여, 편리하고 유연한 방식으로 AOP를 구현할 수 있습니다. 스프링 AOP는 프록시를 이용하여 AOP를 적용하므로, 타깃 객체를 직접 수정하지 않고도 AOP를 적용할 수 있습니다. 스프링에서 AOP를 사용하기 위해서는 다음과 같은 방법을 사용할 수 있습니다. ### 1. XML 기반 AOP 설정 스프링에서는 XML을 이용한 AOP 설정을 지원합니다. AOP 설정은 \ 태그를 사용하여 Advice, Pointcut, Aspect를 정의하고 적용할 수 있습니다. 예를 들어 다음과 같이 설정할 수 있습니다.
<pre class="wp-block-syntaxhighlighter-code">
<aop:config>
    <aop:aspect ref="myAspect">
        <aop:pointcut expression="execution(* com.example.service.*.*(..))" id="pointcut"/>
        <aop:before method="beforeAdvice" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>
</pre>
### 2. 어노테이션 기반 AOP 설정 스프링은 어노테이션을 이용한 AOP 설정도 지원합니다. @Aspect 어노테이션을 이용하여 Aspect를 정의하고, @Before, @After, @Around 등의 Advice를 적용할 수 있습니다. 예를 들어 다음과 같이 설정할 수 있습니다.

@Aspect
@Component
public class MyAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void beforeAdvice() {
        // Advice 내용
    }
}

### 3. 프록시를 이용한 AOP 적용 스프링은 프록시를 이용하여 AOP를 적용합니다. 프록시는 타깃 객체를 감싸고, Advice를 적용하여 횡단 관심사를 처리합니다. 스프링은 JDK Dynamic Proxy 또는 CGLIB를 이용하여 프록시를 생성하며, ProxyFactoryBean을 사용하여 프록시를 생성하고 설정할 수 있습니다.

@Bean
public ProxyFactoryBean myProxy() {
    ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
    proxyFactoryBean.setTarget(myService());
    proxyFactoryBean.setInterceptorNames("myInterceptor");
    return proxyFactoryBean;
}

### 4. 자동 프록시 생성 스프링은 @EnableAspectJAutoProxy 어노테이션을 사용하여 자동으로 프록시를 생성하고 AOP를 적용할 수 있습니다. @EnableAspectJAutoProxy 어노테이션을 설정하면, @Aspect 어노테이션이 붙은 빈을 자동으로 찾아 프록시를 생성하고 AOP를 적용합니다.

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // 설정 내용
}

### 5. 다양한 Advice 종류 스프링은 다양한 종류의 Advice를 제공하여 AOP를 유연하게 구성할 수 있습니다. BeforeAdvice, AfterReturningAdvice, AfterThrowingAdvice, AroundAdvice 등의 Advice를 조합하여 다양한 시나리오에 맞게 AOP를 적용할 수 있습니다.
<pre class="wp-block-syntaxhighlighter-code">