API 문서화 과제를 진행하던 도중 이상한 에러를 만났다.
urlTemplate을 찾을수 없다는 말과 함께 RestDocumentationRequestBuilders
를 사용하라고 한다.
그래서 나는 에러메세지를 그대로 따라했다.
먼저 실제 테스트 코드에서는 문제가 없어보였다.
그래서 helper 인터페이스를 확인해보았다.
위 코드를
이렇게 고쳐서 테스트를 실행해봤지만 여전히 같은 에러메세지를 뱉어냈다.
이런식으로 해결하는것보단 원인부터 파악하고 싶었다.
먼저 실행 후 콘솔창을 확인해 본 결과, URI가 인식은 된것으로 보였다.
urlTemplate를 찾을 수 없다는게 정확하게 어떤 뜻인지 몰라 알아본 결과,
URI에서 {}
에 속하는 부분이 템플릿인것으로 파악됐다.
그렇다면 즉,
/v11/members/{member-id}
이 부분을 찾지 못한다는 이야기였다.
분명 그 전까진 제대로 작동했으나 갑자기 못찾는다는게 이해가 안가 열심히 알아보았더니 RestDocumentationRequestBuilder
와 관련이 있어보였다.
Spring REST DOCs에서 pathParameters를 사용하는 경우 MockMVCBuilder
가 아닌 RestDocumentationRequestBuilder
의 메소드를 사용해야 한다.
나는 변경해주었는데도 오류가 나는 이유를 정확하게 찾지는 못했지만 예상하는건 하나 있다.
RestDocumentationRequestBuilder 안에 들어보니 여러 글들이 보였지만 그 중에서 눈에 띈건 이 부분이다.
보면 uri는 URL로 인식하고 urlTemplate를 지정해줘야 template이라는 것을 알아본다는 것처럼 보인다.
현재 발생한 에러가 urlTemplate을 찾지 못한다는 에러이고, 나는 RestDocumentationRequestBuilder의 매개변수로 URI타입의 uri를 넣어준 상태였다.
즉, 내가 이해한 바로는
pathParameters
를 사용할땐RestDocumentationRequestBuilder
를 사용해야하지만,
RestDocumentationRequestBuilder
를 사용하면pathParameters
는 URI타입의 uri의 템플릿을 인식하지 못한다.
라는 것이었고 그에 맞게 다시 구현해보았다.
public interface ControllerTestHelper<T> {
default RequestBuilder getRequestBuilder(String uri, long memberId) {
return RestDocumentationRequestBuilders
.get(uri, memberId)
.accept(MediaType.APPLICATION_JSON);
}
}
public interface MemberControllerTestHelper extends ControllerTestHelper {
default URI getURI(long memberId) {
return createURI( "/v11/members/{member-id}", memberId);
}
}
helper 인터페이스에서 URI를 String 타입으로 지정해주었고, 템플릿에 들어갈 값을 따로 할당해주었다.
그리고 실제 테스트 로직은 이렇게 변경해주었다.
그리고 테스트를 실행시켜본 결과 에러없이 완벽하게 실행되었다.
사실 내가 생각하는 이 이유가 맞는건지 확신이 있지는 않다.
더 알아보고 알게되는만큼 다시 정리해두어야겠다
+ 엔지니어님께 여쭤보니 맞다고 한다!!! 야호!!!!