DevBoi

[Spring] AOP 관련 공부 및 간단한 AroundAdvice 인터셉터 구현 본문

Develop/[Spring]

[Spring] AOP 관련 공부 및 간단한 AroundAdvice 인터셉터 구현

HiSmith 2022. 3. 2. 20:15
반응형

AOP 관련된 지식에 대해서 공부해보자

 

주 업무 비즈니스 로직의 전, 후, 전+후에 필요한 개발자 관점, 운영자 관점에서 필요한 업무가 있다 (로깅, 사용자 체크 등등)

 

 

해당 비즈니스 로직에 대한 처리 이후에 이런 공통된 작업을 해주는 것을

하는 행위를 AOP라고 한다.

 

 

이제 스프링 관련 AOP의 소스코딩을 해보자

우선 스프링 AOP를 사용하지 않았을때의 코딩 방법이다.

 

결과를 출력해주기 전에, 해당 과같이 작업을 해준다고 생각해보자

아니면 클래스 내에서 해당 소스를 나눴다고 생각해보자,

해당 AOP는 좋은 예로, 테스트에 대한 수행시간이다.

해당 과 같이 AOP적인 로직을 수행한다고 하면 모든 함수에, 작성해야한다.

 

소스를 나눈다고해도, 시점, 범위에 대한 일일히 설정하는 건 운영자로써 말도안되는 짓이다.

 

 

 

뭐 이렇게 직접 프록시를 구현해서, InvocationHandler를 달아줄수도있지만, 무튼 일일히 로깅 달아주는 건 미친짓이긴하다

그래서 스프링에서는 이러한 aop를 구현해준다.

 

우선 간단하게, AroundAdvice를 구현해보자

Advice는, 다른 포스팅에서 다뤘듯이, 해당 aop가 동작하는 시점을 이야기한다.

해당 과 같이, target에 대한 빈을 AopTest를 target이라는 빈으로 생성하고, aop 클래스를 빈으로 등록한다.

그리고 프록시 빈을 생성해서, 이 프록시에, 타겟 및 interceptorNames에 해당 인터셉터를 꽂아주면,

target메소드가 실행될때, 인터셉터가 돌게된다.

 

Advice는 아래와 같이 4가지 종류가 있고, 

AOP 관련 용어에 대한 개념은 아래와 같다.

 

 

  • Aspect :  흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
  • Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음


쉽게말하면, Aspect부분들을 특정 Target에서 범위를 결정하는 JoinPoint를 기점으로, Advice가 실행이된다.

PointCut는 JointPoint의 상세, 특정 지점에 대한 스펙을 정의한것이다.(상세 JointPoint지정을 PointCut으로 이해하면된다.)

 

반응형