본문 바로가기
Spring

[Spring] 스프링 AOP 정리

by 개미가되고싶은사람 2024. 9. 26.

목차

     

    스프링 AOP (Aspect Oriented Programming)

    관점 지향 프로그래밍(aspect-oriented programming, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임입니다. 쉽게 말해 애플케이션의 로직을 핵심적인 관점(핵심 기능)과 부가적인 관점(부가 기능)으로 나누어 각 관점에 따라 캡슐화하고 모듈화하는 것입니다.

    핵심 기능은 애플리케이션 로직에서 핵심 비니지스 로직을 의미하며, 부가 기능은 핵심 기능을 보조하기 위해 제공되는 기능입니다. 예를 들어서 로깅, 트랜잭 등등 다양한 기능들이 부가 기능에 해당됩니다. 로깅 기능은 핵심 기능이 호출 되었는지 로그를 남기기 위해 사용됩니다. 즉 부가 기능은  혼자 사용할 수 없으며, 핵심 기능을 보조하는 역할을 수행합니다.

     

    이때, 애플리케이션에서 부가 기능 관련 코드들은 계속 반복해서 작성하는 걸 볼 수 있습니다.

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

     

    이러한 문제를 해결하기 위해 부가 기능(횡단 관심사)을 Aspect X, Y, Z와 같은 모듈로 분리하고, 핵심 비즈니스 로직(핵심 기능)에서 독립적으로 재사용할 수 있도록 설계하는 것이 AOP의 개념입니다.

     

    SOLID원칙과 AOP의 차이점

    결론적으로 SOLID 원칙을 올바르게 적용하면 핵심 기능과 부가 기능을 모듈화할 수 있으며, 이는 AOP(Aspect-Oriented Programming)를 잘 적용한 것이라고 라고 생각합니다. 그러나 두 개념의 차이점은 목적(역할)에 있다고 생각합니다. AOP는 핵심 기능과 부가 기능을 모듈화하기 위한 방법인 반면, SOLID 원칙은 좋은 객체 지향 프로그램을 만들기 위한 설계 원칙입니다. 개인적으로 AOP보다 SOLID 원칙이 더 상위 개념이라고 생각합니다.

    다른 분들은 여기에 대해서 어떻게 생각하세요???ㅎㅎㅎㅎ 혹시 제가 틀린 부분이 있으면 알려주세요ㅠㅠㅠ!!

     

     

    Spring AOP 주요 용어 개념 및 특징

    Aspect(Advisor)

    • Advice + PointCut를 합친 개념
    • 부가 기능을 모듈화한 클래스
    • @Aspect를 사용하면 스프링 빈으로 등록해야 합니다.(자동 프록시 생성기를 사용해서)
    • Aspect와 Advisor는 비슷한 개념이지만 Advisor는 Advice와PointCut이 한 개일 때 사용하는 용어입니다.

    Target

    • 부가기능을 부여할 실제 객체
    • 프록시 객체를 적용할 실제 객체

    JointPoint

    • 메소드의 실행이나 예외 처리와 같은 프로그램의 실행 중의 포인트
    • AOP를 적용할 수 있는 모든 지점(추상적인 개념)
    • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한됩니다.

    Advice

    • 프록시가 호출하는 부가 기능으로 단순하게 부가 기능이라고 생각해도 됩니다.
    • Advice의 종류에는 Before, After, AfterReturning, AfterThrowing, Around 등이 있으며, 각각의 실행 시점에 따라 다릅니다.

    PointCut

    • 부가 기능(Advice)을 적용할지 결정하는 필터링
    • 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식
    • 메소드 이름, JDK 정규 표현식, 애노테이션 기반, AspectJ표현식으로 표현 가능합니다.

    Proxy

    • Target 객체에 대한 대리 객체로, 부가 기능을 적용하기 위해 사용됩니다.
    • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시입니다.