스터디/[스프링 퀵스타트] (2024)

[스프링 퀵스타트] Day2 - chapter1. 스프링 AOP (v2024)

ttoance 2024. 10. 6. 11:18

 

스프링 프레임워크는 AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)를 통해 공통적인 관심사(Cross-Cutting Concerns)를 분리하여 코드의 응집도를 높이고, 결합도를 낮춥니다. 이번 포스팅에서는 스프링 AOP의 개념과 XML을 활용한 설정 방법에 대해 정리하겠습니다.


1. AOP의 개념과 필요성

  • 낮은 결합도 = IoC (Inversion of Control)
    • 객체 간의 의존성을 스프링 컨테이너가 관리함으로써 결합도를 낮추고 유연한 구조를 제공합니다.
  • 높은 응집도 = AOP
    • 공통적으로 반복되는 로직(예: 로깅, 예외 처리, 트랜잭션 관리 등)을 핵심 로직과 분리하여 코드의 응집도를 높입니다.
  • 관심사 분리 (Separation of Concerns)
    • 핵심 비즈니스 로직과 부가적인 관심사(로깅, 예외 처리 등)를 분리하여 각각의 로직을 독립적으로 관리합니다.
    • 핵심 관심사: 사용자 요청에 따라 수행되는 비즈니스 로직.
    • 횡단 관심사: 여러 모듈에서 공통적으로 사용하는 로직(로깅, 트랜잭션 관리 등).

2. AOP 설정 예시 (XML 기반)

XML 설정

다음은 XML을 이용해 스프링 AOP를 설정하는 방법을 보여주는 예시입니다.

<bean id="log" class="com.springbook.biz.common.Log4jAdvice"></bean>

<aop:config>
    <!-- 포인트컷(Pointcut) 설정 -->
    <aop:pointcut id="allPointcut" 
                  expression="execution(* com.springbook.biz..*Impl.*(..))" />

    <!-- 애스펙트(Aspect) 설정 -->
    <aop:aspect ref="log">
        <aop:before pointcut-ref="allPointcut" method="printLogging" />
    </aop:aspect>
</aop:config>
  • 포인트컷(Pointcut)
    • aop:pointcut은 AOP 적용 범위를 지정하는 부분입니다.
    • 위의 예시에서는 execution(* com.springbook.biz..*Impl.*(..))을 통해 com.springbook.biz 패키지의 모든 Impl로 끝나는 클래스의 모든 메서드를 지정했습니다.
  • 애스펙트(Aspect)
    • aop:aspect는 공통적으로 적용할 부가 기능을 정의하는 부분입니다.
    • ref 속성을 통해 log 빈을 참조하고, aop:before를 사용해 지정한 포인트컷에 메서드(printLogging)를 호출하도록 설정합니다.
  • 어드바이스(Advice)
    • aop:before는 메서드 실행 전에 호출되는 어드바이스를 설정하는 부분입니다.

이러한 설정을 통해 횡단 관심사(로깅)를 핵심 로직과 분리하여 관리할 수 있습니다.

 

 


3. AOP를 통한 이점

  • 유지보수성 향상
    • 공통된 기능(로깅, 트랜잭션 등)을 별도의 클래스로 분리하여 관리할 수 있어 유지보수성이 향상됩니다.
  • 코드의 재사용성 증가
    • 여러 클래스에서 반복되는 로직을 한 번만 정의하고 재사용할 수 있습니다.

결론

✔️ 스프링 AOP는 공통적인 관심사를 핵심 로직과 분리하여 코드의 응집도를 높이고 결합도를 낮추는 효과적인 방법입니다.
✔️ XML 설정을 활용하여 포인트컷과 애스펙트를 정의함으로써 필요한 부분에만 부가 로직을 적용할 수 있습니다.
✔️ 이러한 설정을 통해 개발자는 핵심 비즈니스 로직에만 집중할 수 있으며, 유지보수성과 재사용성을 높일 수 있습니다.

반응형