Spring AOP

AOP란?

  • Aspect Oriented Programming: 관점 지향 프로그래밍
  • OOP 와 분리된 개념이 아니라, OOP에 기초를 두는 프로그래밍 방식
  • 하나의 프로그램을 관점(혹은 관심사)라는 논리적인 다위로 분리하여 관리하는 개념
  • 로깅, 감사, 선언적 트랜젝션, 보안, 캐싱 등 다양한 곳에서 사용된다.
  • 낮은 결합도에 높은 응집도는 기본으로 가지며, DI는 낮은 결합도를 위한 것이라면 AOP는 높은 응집도를 위한 것이다.
  • 엔터프라이즈 어플리케이션들은 보통 핵심 비즈니스 로직은 몇 줄 안되고 주로 로깅이나 예외, 트랜잭션 처리 같은 부가 코드가 대부분이다. 즉 비지니스 메소드의 복잡도는 증가하며 메소드들 마다 매번 반복해야하는 경우가 생긴다.
  • 이를 해결하기 위해서는 단순복사 붙여넣기만으로는 코드중복이 많아지며 유지보수가 힘들어지기 때문에 AOP를 통해 부가적인 공통 코드들을 효율적으로 관리해야한다.
  • 위 내용을 다르게 말하면 기존 OOP에서 공통 관심 기능을 여러 모듈에서 적용하며 발생하는 중복코드 양산의 한계를 극복하기위해 AOP가 탄생했다고 볼 수 있다.
  • 또 이러한 AOP는 흩어진 Aspect들을 모아서 모듈화 하는 기법이다.
    • *Aspect란?
    • 객체지향 언어의 클래스와 비슷한 개념이며 그 자체로 어플리케이션의 도메인 로직을 담은 핵심 기능은 아니지만, 많은 오브젝트의 걸쳐서 필요한 부가기능을 추상화 해놓은 것이다.
  • AOP에서 중요한 점으로는 관심 분리(Separation of Concerns) 가 있습니다.
    • 로깅, 예외, 트랜잭션 처리같은 코드들은 횡단 관심(Crosscutting Concerns) 라고하며, 핵심 비즈니스 로직은 핵심 관심(Core Concerns)라고 합니다.

AOP 용어와 개념

  • AOP는 핵심 로직에서 공통관심기능을 호출하지 않고 위빙(Weaving)이라는 작업을 통해 공통 관심 기능코드를 추가합니다.
  • 이런 위빙을 하기위해서는 언디에, 언제 추가해야할지 알아야 하며 Pointcut(어디에), Advice(언제)라고 합니다.
  • Joint Point : 모듈이 삽입되어 동작하게 되는 특정 위치(메서드 호출 등), 클라이언트가 호출하는 모든 비즈니스 메소드, 모든 메소드를 조이포인트로 생각하면 되고, 이 중에서 포인트컷이 결정된다.
  • Point Cut : 다양한 Joint Point 중에 어떤 것을 사용할지 선택, 즉 필터링된 Joint Point를 의미한다. 하나의 @Aspect class 안에 여러 개의 포인트컷을 선언할 수도 있습니다.
  • //포인트컷 선언의 예 @Pointcut("excution(* hello(...))") // 포인트컷 파라미터는 없으며 표현식으로 정의 "excution ~" private void all() { }
  • Advice : Joint Point에 삽입되어 동작할 수 있는 코드, 어드바이스는 횡단 관심에 해당하는 공통 기능의 코드를 의미하며 독립된 클래스의 메서드로 작성된다. 언제 동작할지는 스프링 설정에서 결정한다.
  • Advice도 Pointcut과 마찬가지로 하나 이상을 정의할 수 있고, Advice의 Annotation에는 이에 적용할 Point cut을 명시해야 한다.
    • @AspectJ에서 5가지의 Advice
      • before : 메서드 호출 전에 동작하는 advice
      • after : 예외 발생 여부와 관계없이 호출된 메서드의 동작이 완료되면 동작하는 Advice
      • after-returning : 예외 없이 호출된 메서드의 동작이 완료되면 동작하는 Advice
      • after-throwing : 호출된 메서드의 동작이 완료되면 동작하는 Advice
      • around : 메서드 호출 전과 후에 동작하는 Advice
  • /* *포인트컷에 이름을 부여해서 따로 정의하는 대신 어드바이스 메소드 어노테이션에 포인트컷 표현식을 넣어서 *적용하는 방법도 있다. */ @Around("excution(* *(...))") public Onject printParametersAAndReturnVal(ProceedingJointPoint pjp) throws Throwable{ return pjp; }
  • //어드바이스 정의 예 @Around("all()") // all() 메소드가 호출되기 전 과정을 모두 담을 수 있다. public Object aroundExample(ProceedingJointPoint pjp) throws Throwable{ //proceed 메서드는 클라이언트가 보낸 파라미터를 그대로 사용해서 타깃 오브젝트의 메소드를 호출하고 그 결과를 돌려줌 Object ret = pjp.proceed(); return ret; }
  • Weaving : Advice를 핵심 로직 코드에 적용하는 것, 위빙을 통해 비지니스 메소드를 수정하지 않고 횡단 관심에 해당하는 기능을 추가하거나 변경 가능.
  • Aspect : Point Cut + Advice, Aspect는 포인트컷과 어드바이스의 결합 => 어떤 포인트컷 메서드에 어떤 어드바이스 메소드를 실행할지 결정한다. 
  • Reference

'Spring, Spring Boot' 카테고리의 다른 글

Spring Web Layer  (0) 2023.01.12
Spring MVC 동작과정  (0) 2023.01.11
SOLID 객체지향 설계의 5가지 원칙  (0) 2022.05.13
Spring 어노테이션(Annotation) 정리  (0) 2021.12.28

+ Recent posts