inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 기반 REST API 개발

이벤트 목록 조회 API 구현

WebLinkBuilder .linkTo( .. ) 사용 시, Class<?> 인수 리팩토링 관련 질문입니다 - feat JAVA9+ StackWalker

해결된 질문

285

Truestar

작성한 질문수 68

0

안녕하세요 강사님. 
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"))
);
}

 

    1. 과연, 이런 방식이 토이프로젝트 외적으로 사용될 수 있을까? 이 방법은, 운영 시 믿을만 한 코드인가?

    2. `of() {...}`메서드가 많아지면,
      callerLinkBuilder = linkTo(STACK_WALKER.getCallerClass())
      이 코드가 매번 들어가야 하는데, 이것을 메서드 추출하면, HalModel 클래스가 Caller 클래스로 얻어지는데, 리팩토링 할 방법이 없음.

      : Proxy 적용도 힘들고, of 메서드 마다 박혀 있어야 Controller.class 를 얻어오기때문

      : 위에서 비효율적인 Thread.currentThread()  를 통해 구현할 수도 있지만, 과부하는 피해야 함.

 

이런 부분에 대해 조언을 얻을 수 있을까요?

읽어주셔서 감사드립니다!

StackWalker spring EntityModel java resource rest-api

답변 1

1

백기선

음.. 글쎼요. 저라면 굳이 복잡하게 알아오기 보단 명시적으로 클래스 타입을 넘길 것 같네요. HalModel.of(dto, EventController.class)처럼요. 알려주신 방법대로 하면 매개변수를 하나 줄일 수 있지만.. 그대신 코드를 복잡하게 만드는게 아닌가 싶어요. 그리고 아마도 그냥 class를 매개변수로 받도록 수정하시면 리팩토링에도 조금 유리하지 않을까 싶습니다.

 

0

Truestar

오 그렇군요.. 역시 명시적인 것이, 감춰진것보다 낫다는 거군요!!
좋은 방향을 잡아주셔서 감사드립니다^^

Spring 시큐리티 관련해서 WebSecurityConfigurationAdapter

0

84

1

junit5 사용하시는 분들

0

99

1

자바 빈 스펙을 준수하는지 체크하는 테스트

0

255

2

REST API 개발 중 비즈니스 로직 적용 부분의 JSON 에러

0

257

1

스프링 부트 3버전에서의 실습

0

196

1

java.lang.AssertionError: Status

0

541

2

spring doc 관련 파일 생성 관련 배포 관련 질문 드립니다.

0

292

1

섹션2 201응답받기 부분 테스트 404에러 질문입니다

0

744

1

강의 자료가 404입니다 확인 부탁 드려요!

0

482

1

연동 DB문의

0

368

1

이벤트 Repository강의 중 Event 클래스에 private Integer Id; 위치 질문

0

509

1

(Mac) postgressql 관련하여 port kill 해도 다시 살아나는 경우

0

386

0

maven으로 생성한 docs파일(index.html)에서의 not found 오류 질문

0

636

1

테스트 오류 질문드립니다.

0

518

1

docs 요청값이 반영이 안되네요... (해결)

-1

399

1

psql 적용 후 에러

0

825

2

mvn package 시 다음과 같은 에러가 나시면

0

769

2

Event에 Account manager를 추가했으면 문서화 필요

0

277

1

2년 훨씬 전 부터 Restlet-> Talend API 로 바뀌었습니다~

1

475

1

asciidoc 추가 스니펫 에러 해결법

0

403

1

_links 는 현재 fieldWithPath 를 해주지 않아도 됩니다.

0

431

3

깃랩 처음 사용자를 위한 index.adoc raw 보는 법

0

338

1

eclipse 쓰시는 분을 위한 maven-resources-plugin 팁

0

342

1

부트 + jupiter 인 경우 설정법

0

346

1