Back-End/Spring

스프링 - AOP(부제: AOP란 무엇이고 스프링이 제공하는 AOP는 어떻게 다른지 알아보자)

얄루몬 2023. 3. 17. 16:30

1.  서론(AOP가 어떻게 부가기능의 단점을 해결했을까?)

애플리케이션 로직은 두가지의 기능으로 구성되어 있다.

  1. 핵심 기능
    • 애플리케이션에서 단독으로 사용할 수 있고 애플리케이션에서 필수로 하는 기능등이 이에 해당한다.
    • ex) 아카이브나 업무 로직을 포함하는 경우가 핵심 기능에 해당한다.
  2. 부가 기능
    • 단독으로 사용할 수 없는 기능을 부가 기능이라고 부르고 핵심 기능에 함께 사용하는 기능을 부가 기능이라 한다.
    • ex) 로그 추적, 트랜잭션 기능 등이 부가 기능에 해당한다.

 

부가 기능의 단점

  • 하나의 부가 기능이 여러 핵심 기능에서 사용된다할 때 여러번 코드 반복의 문제가 있다.
  • 여러 곳에서 사용될 때 유지보수가 어렵다는 단점이 있다.
  • 위의 단점으로 aop를 적용시켜 해당 부가 기능의 단점을 해결하고자 한다.

 

2.  AOP(AOP는 어떻게 부가 기능의 단점을 해결했을까?)

핵심 기능에 붙어 있던 부가 기능을 하나로 떨어뜨려서 단독으로 떨어진 부가 기능을 핵심기능에서 사용할 수 있게 했다. 

기존 구성

기능 분리를 하지 않은 경우

  • 기존의 경우라면 부가 기능을 핵심 기능에 같이 사용하는 식의 구성이었다. 

기능 분리 후

기능 분리를 한 경우

 

3. @Aspect와 AOP?

AOP

  • 부가기능과 핵심기능의 분리
  • 해당 부가 기능을 어디에 적용할지 정의 
    • Advisor = Advice + Pointcut
  • @Aspect 역시 위의 역할을 제공하고 있기 때문에 AOP라고 할 수 있다.
    • spring에서 제공하는 aop

AOP와 OOP

  • AOP의 경우엔 OOP의 보조 목적으로 등장했다 
    • OOP의 대체 목적이 아님
    • 횡단 관심사를 처리하기 위해서 등장했다. (OOP의 경우 횡단 관심사 처리가 어려움)
  • OOP의 경우 횡단 관심사 처리를 하려면 객체지향적이지 못하게 되기 때문에 이를 위해서 등장한 개념이 AOP이다. 

 

AOP 적용 방식

  • 컴파일 시점
    • 컴파일러가 따로 필요하다는 단점이 있다.
    • 또한 AspectJ를 사용해야한다.
  • 클래스 로딩 시점
    • 클래스 로더기 조작이 필요하다는 단점이 있다.
    • 또한 AspectJ를 사용해야한다.
  • 런타임 시점
    • 프록시를 사용한 경우엔 메소드에 한정된 경우에만 Joinpoint가 적용 위치로 사용된다
    • 메소드에 한정된 사용 위치에도 대부분의 실무는 이정도 범위에서 해결이 된다.
    • 스프링의 경우엔 AspectJ에서 사용되는 것들을 차용해서 일부만 사용할 수 있게 했다 그렇기에 spring에서 aop를 적용한다면 메소드에 한정된 위치에서 사용한다고 생각해야한다.

 

4. AOP 용어

  • Joinpoint
    • advice가 적용될수 있는 위치
    • 원래는 다양하게 존재한다. (메소드 실행, 생성자호출 static 메소드 접근 등..)
    • spring의 경우엔 메소드 실행에만 join point가 존재한다.
  • target
    • 어드바이스를 받는 객체, 포인트컷으로 결정된다.
  • Aspect
    • advisor의 모듈을 모아 놓은 것을 의미한다. 
    • advisor의 모듈화
      • advice + pointcut
  • advisor
    • 하나의 어드바이스와 하나의 포인트컷으로 구성된 것을 어드바이저라고 한다.
    • 스프링 AOP에서만 사용되는 특별 용어이다. 
  • advice
    • 부가 기능
    • 특정 조인 포인트에서 Aspect에 의해 취해지는 조취
    • Advice 종류
      • Around
      • Before
      • After 
  • Pointcut
    • 조인 포인트 중에서 어드바이스 적용 위치를 선별하는 기능
    • 프록시를 사용하는 스프링 aop의 경우엔 메소드 실행 지점만 포인트컷 선별 가능
    • AspectJ 표현식을 사용해서 지정