대머리개발자

armeria aop 본문

개발이야기/코틀린

armeria aop

대머리개발자 2024. 9. 10. 12:49
728x90

 

aop 는 관심사를 횡단으로 보는 것이다.

모든 로직은 위에서 아래로 흘러간다. 근데 이것을 옆에서 보자는 것 이쥬.

 

옆으로 본다는 것에 대한 느낌을 가져야 한다.

 

위에서 아래로 내려가는 로직에.. 옆에서 갑자기 깜빡이 키고 새치기 해서 자기 할 일 하는 것이다.

 

암튼 하고자하는 바는 공통의 로직을 필요한 로직에 때려 받기 위함이다. (물론 모든 로직이 될 수도 있고)

 

예들들어 모든(필요한) 도메인 로직을 태우기 전에 JWT 체크를 하다던지... 로깅을 하다던지... 하는 작업일 때 깜빡이 키고 진행s!

 

어떤(유**) 회사의 리소스를 본적이 있었는데 ㅎㄷㄷ

모든 EndPoint에서 시작하는 3줄의 로직이 무조건 똑같았다. (로깅을 하는 로직)

 

누군가는 처리 했어야 했는데.. 그니께.. 주식 상장을 해도..

아웃풋이 똑같다고 개발자가 아니닷!! 개똥 철학을...

 

 

일반적으로는 아래처럼

수행하는 시점메서드만  어노테이션으로 적용하면 AOP 처리를 할 수 있다.

@Before("execution(* com.*.*.*EndPoint.*(..))")
@After("execution(* com.community.*.*EndPoint.delete*With*(..))")
@Around(..)

 

근데 우리 아르메리아는 단지 데코레이션을이용하면 된다야!!

 

serverBuilder.decorator { delegate, ctx, req ->
    if (!setUserInfoIfPossible(req)) {
        return@decorator HttpResponse.of(HttpStatus.UNAUTHORIZED)
    }
    delegate.serve(ctx, req).also {
        it.whenComplete().thenRun { RequestContext.remove() }
    }
}

 

모든 요청에.. setUserInfoIfPossible 태우고 (@Before)

요청이 끝나면(@After) ThreadLocal에 가지고 있는 userInfo 제거 하고!!!

 

whenComplete().... // 즨짜 명시적이다 ㅋㅋ 네이밍의 중요성!!

 

고맙습니다.

728x90