인프런 커뮤니티 질문&답변

just kim님의 프로필 이미지
just kim

작성한 질문수

코드로 배우는 React with 스프링부트 API서버

부록_AWS 빈즈톡, RDS, S3 자료

안녕하세요. 공부하다가 막히는 부분이 있어서 질문드리는데 질문 내용이 ...

작성

·

50

·

수정됨

1

안녕하세요. 이 강의를 마치고 비동기 spring boot를 공부 하고 있습니다. Reactor이라고 부르던데 mvc와 크게 다른거 같지 않는거 같은데 코딩이 생각 보다 어렵네요....

mvc랑 코딩 자체가 틀림 ...

 

솔직히 질문드리기가 너무 죄송합니다. 근데 답변 해줄 분이 안계셔서 ..여기에 질문 드리네요

..

.

.

.

.

 

질문 내용은 @Aspect 이딴걸 왜 하는거냐 입니다.

 

class A

아래 함수에 주석을 원래 하는거지만 주석을 제거 하려면 이걸 Aspect를 해야한다고 하네요....

@GetMapping("/test/mdc")
suspend fun testRequestTxid() {
//    withContext(MDCContext()) { 
        logger.debug { "start MDC TxId" }
        delay(100)
        service.mdc()
        logger.debug { "end MDC TxId" }
//    }
}

이과정이 꽤나 복잡합니다. class B처럼요

 

class B

Mapping을 대신할 어노 테이션을 만드는거 내용이라고 생각 됩니다.

classA에 @GetMapping을 하면 아래 class의 hindMdcContext를 사용하게끔 하는거 같아요...

질문 드릴껀 이 과정이 왜 필요한거죠???

의도가 잘 파악이 안되서요...

trance id를 생성하고 class A가 완전히 처리 될때까지 블러킹 하기 위해서 그런거 같은데 이렇게 까지 해야되나 싶네요...

 

내용은 아직도 파악 중입니다. ^^ 현제 ProceedingJoinPoint가 뭔지 파악 중에 있고요 ...

 

@Aspect
class AspectConfig {
    @Around("""
        @annotation(org.springframework.web.bind.annotation.GetMapping)
    """)
    fun hindMdcContext(jp: ProceedingJoinPoint): Any? {
        return if(jp.hasSuspendFunction) {
            val continuation = jp.args.last() as Continuation<*>
            val newContext = continuation.context + MDCContext()
            val newContinuation = Continuation(newContext) { continuation.resumeWith(it)}
            val newArgs = jp.args.dropLast(1) + newContinuation
            jp.proceed(newArgs.toTypedArray())
        } else {
            jp.proceed()
        }
    }

    private val ProceedingJoinPoint.hasSuspendFunction: Boolean
        get() {
            val method = (this.signature as MethodSignature).method
            return KotlinDetector.isSuspendingFunction(method)
        }
}

빨리 비동기 강의좀 내주세요 ㅠ.ㅠ 수없는 인강을 들었지만 강사님 만큼 강의 잘하는 강의 못봤어요 ㅠ.ㅠ

답변 2

1

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

 

^^좋게 봐 주셔서 감사합니다.

질문하시는 내용의 핵심은 AOP가 필요한가?

라는 것으로 생각됩니다.

코드에서 구현하시는 기능은 @Around이고 메소드 실행시에 컨텍스트에 데이터를 추가하시는 것 같습니다.

----------------------------

AOP에서 횡단 관심사(혹은 공통 관심사)라고 표현하는 것은 쉽게 말해서 중복적인 코드입니다.

핵심로직은 아닌데 매번 중복적인 코드를 작성해야 하지 말고 분리해 둔 후에

나중에 자동으로 결합시키도록 구성하자는 생각이라고 보시면 됩니다.

과거에도 템플릿 메서드 패턴이라든가 프록시 패턴 등을 이용해서 이런 문제들을 해결해 왔지만

이런 해결책은 개발자가 직접 마지막에 처리를 해야만 하는 반면에 AOP를 이용하면 설정을 분리해 두어서

별도의 처리없이 개발자는 자신이 필요한 로직에만 집중할 수 있습니다.

Spring의 경우 자동으로 Proxy객체를 만들수 있으므로 수백번의 공통 코드를 없앨 수 있습니다. 스프링 초기에는

직접 만들었습니다. ㅠㅠ

다만 @Around의 경우는 ProceedingJoinPoint를 이용하는데 이는 직접적으로 해당 메소드의 실행(proceed)

를 할 수 있기 때문에 메소드의 실행전, 후 , 예외 등 모든 상황에 대해서 대처할 수 있습니다.

ProceedingJoinPoint는 Java의 Reflection과 유사하므로 해당 내용을 공부하시면 도움이 되실 겁니다.

just kim님의 프로필 이미지
just kim
질문자

와 감사합니다. 인프런 강사님들은 진짜 답변이 빠르네요 ...

감사합니다.

답변도 이해하기 쉽고 너무 좋아용 ^^

0

안녕하세요, 인프런 AI 인턴입니다. just kim님.

Aspect를 사용하는 이유와 관련하여 질문해 주셨군요. 이와 관련하여 도움될 수 있는 기존 답변들을 모아 보았습니다.

  1. Aspect와 비동기 처리:
    Aspect는 횡단 관심사를 모듈화하여 코드 중복을 줄이고 유지보수를 용이하게 합니다. 특정 메소드 실행 전후에 트랜잭션 관리, 로깅, 인증 등의 작업을 진행할 수 있습니다. 비동기 처리를 더 유연하게 할 수 있도록 도와줍니다.

  2. 비동기 처리와 Reactor:
    Reactor와 Spring MVC의 차이점을 설명하는 기존 답변을 활용해 보세요.
    스프링 비동기 처리에 대한 질문

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

just kim님의 프로필 이미지
just kim

작성한 질문수

질문하기