WebLinkBuilder .linkTo( .. ) 사용 시, Class<?> 인수 리팩토링 관련 질문입니다 - feat JAVA9+ StackWalker
해결됨
스프링 기반 REST API 개발
안녕하세요 강사님. linkTo() 를 호출하는 시점에 컨트롤러 Class<?> 를 자동으로 알아와 적용하고자 한 동기에서 질문이 시작되었습니다. 아래의 Thread .currentStackTrace() 는 Caller 클래스를 알아오는 기막힌 기능이죠. 그런데 과부하가 걸린다는 단점이 있다고 알게되었습니다. Thread . currentThread () . getStackTrace ()[1 ] . getClass () 그래서 스텍을 층층히 뒤져서 찾지않는 과부하가 개선된 Java9+ StackWalker 를 알게되었습니다. StackWalker . getInstance ( StackWalker . Option . RETAIN_CLASS_REFERENCE ) . getCallerClass (); 이것을 아래 코드처럼 WebLinkBuilder .linkTo( ? ) 에 적용하도록 HalModel < T > .of(..) 실행시점 으로 옮겼습니다. ( HalModel < T > 은 커스텀 EntityModel- 구: Resource<T> 입니다 ) public static < T > HalModel < T > of ( T content ) { /* Java9+ 이상 : getCallerClass() 호출자 @Controller @RestController 클래스를 동적으로 얻어옵니다 . */ callerLinkBuilder = linkTo ( STACK_WALKER . getCallerClass ()) ; return new HalModel <> ( content , Collections . emptyList ()) ; } 2가지 질문 입니다 이렇게 적용 하고보니, 2가지 걸리는 문제가 있었습니다. 아래는 HalModel 이 적용된 Controller 메서드 예제 입니다. @PostMapping public ResponseEntity createEvent ( @RequestBody @Valid EventDto eventDto , Errors errors ) { HalModel < EventDto > model = HalModel . of ( eventDto ) ; return ResponseEntity . created ( model . contentUri ()) . body ( model . addSelfContentLink () . addSelfContentLink ( "update-event" ) . addSelfLink ( "query-events" ) . add ( Link . of ( "/docs/index.html#resources-events-create" , "profile" )) ) ; } 과연, 이런 방식이 토이프로젝트 외적으로 사용될 수 있을까? 이 방법은, 운영 시 믿을만 한 코드인가? `of() {...}`메서드가 많아지면, callerLinkBuilder = linkTo ( STACK_WALKER . getCallerClass ()) 이 코드가 매번 들어가야 하는데, 이것을 메서드 추출하면, HalModel 클래스가 Caller 클래스로 얻어지는데, 리팩토링 할 방법이 없음. : Proxy 적용도 힘들고, of 메서드 마다 박혀 있어야 Controller.class 를 얻어오기때문 : 위에서 비효율적인 Thread . currentThread () 를 통해 구현할 수도 있지만, 과부하는 피해야 함. 이런 부분에 대해 조언을 얻을 수 있을까요? 읽어주셔서 감사드립니다!
- StackWalker
- spring
- EntityModel
- java
- resource
- rest-api





