inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 기반 REST API 개발

스프링 REST Docs 각종 문서 조각 생성하기

질문있습니다.

해결된 질문

693

OMG

작성한 질문수 38

4

좋은 강의 만들어주셔서 많이 배우고 있습니다. 감사합니다.

다름이 아니라 강의 수강 중 테스트가 실패하여 문의드립니다.

해당 강의 전까지는 메이븐 프로젝트로 생성하여 의존성 추가해서 강의의 스프링부트 버전(2.1.0.RELEASE)로 진행하여 문제 없이 진행하였는데 
EventControllerTests - createEvent 테스트코드 작성시

mockMvc.perform(post("/api/events/")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(event)))
.andDo(print())
.andExpect(status().isCreated())
.andExpect(jsonPath("id").exists())
.andExpect(jsonPath("$.id").exists())
.andExpect(header().exists(HttpHeaders.LOCATION))
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(jsonPath("free").value(false))
.andExpect(jsonPath("offline").value(true))
.andExpect(jsonPath("eventStatus").value(EventStatus.DRAFT.name()))
.andExpect(jsonPath("_links.self").exists())
//.andExpect(jsonPath("$._links.self").exists())
.andExpect(jsonPath("_links.query-events").exists())
.andExpect(jsonPath("_links.update-event").exists())
.andDo(document("create-event",
links(
linkWithRel("self").description("link to self"),
linkWithRel("query-events").description("link to query events"),
linkWithRel("update-event").description("link to update an existing event")
)
))
;

위와 같이 작성하면 실패하고

org.springframework.restdocs.snippet.SnippetException: Links with the following relations were not found in the response: [self, update-event, query-events]

.andDo(document("create-event",
links(halLinks(),
linkWithRel("self").description("link to self"),
linkWithRel("query-events").description("link to query events"),
linkWithRel("update-event").description("link to update an existing event")
)
))
;

links의 첫번째 인자로 haLinks()를 주면 테스트가 성공하는 것을 확인하였습니다. 
원인을 파악하기 위해 검색도 해보고 강의도 다시 보던 중에 KSUG에서 발표하셨다고 하던 이전 자료(해당 강의의 시작)를 보니 halLinks()가 있는 것을 보았고 해당 코드가 있는 깃랩(https://gitlab.com/whiteship/natural/-/blob/master/src/test/java/me/whiteship/natural/event/EventControllerTests.java)에서도 보니 halLinks()가 있는 것을 확인하였습니다.  메이븐 프로젝트로 생성해서 버전이랑 의존성 꼬이는 문제는 없을것 같은데

<artifactId>asciidoctor-maven-plugin</artifactId>
<version>1.5.8</version>

asciidoctor-maven-plugin의 버전이 제가 작성한 버전은 1.5.8이고 기선님이 사용한 버전은 1.5.3인 차이만 확인하였습니다.

무슨 차이로 인해 테스트가 실패하는 것인지 감이 안잡히는데 기선님은 두 가지 방식 다 진행하였고 성공하여서 질문드립니다.

테스트 실패 시 출력하는 요청,응답 헤더

MockHttpServletRequest:

 Headers = {Content-Type=[application/json;charset=UTF-8], Accept=[application/json]}

MockHttpServletResponse:

Headers = {Location=[http://localhost:8080/api/events/1], Content-Type[application/json;charset=UTF-8]}

json 출력결과도 첨부합니다.

{

}

깃헙 링크도 첨부합니다!
https://github.com/rshak8912/rest

spring rest-api java

답변 3

0

OMG

제가 HAL 방식을 사용하지 않은 것은

IDE 내에서 HAL 을 불러오지 못하여서 인데 설명이 미흡했었나봅니다. 보통 이럴 경우 먼저 의존성 버전을 바꿔보거나 프로젝트 새로 만들어 보는데 놓쳤습니다..

제가 그럴것이다 라고 가정하고 넘어가기 일쑤였는데 확답을 해주시니 마음의 안정이 오네요..ㅋㅋ
답변 감사합니다 !!

============

알려주신 키워드로 테스트 해봤는데
MediaType이 아니라 MediaTypes로 하니까 되네요...ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
저의 무지함에 다시 한번 반성하며 기선님의 친절함과 강의에 감사함을 느낍니다..ㅠㅠ

0

백기선

네 Content Type하고 관련이 있습니다. produces에 MediaTypes.HAL_JSON_VALUE을 쓰지 않은 경우에는  halLinks()를 추가해서 문서를 생성해야 hal 링크를 추출할 수 있습니다.

HAL_JSON 등은 스프링 MVC가 제공하는 MediaType이 아니라 스프링 HATEOAS가 제공하는 MediaTypes에 들어있습니다.

컨트롤러에서 MediaTypes.HAL_JSON_VALUE를 사용하시고, 테스트 코드에서 contentType, accept, andExpect에서 기대하는 헤더값을 적절히 변경핫시면 halLinks() 없이도 테스트가 동작하게 고칠 수 있습니다.

@RequestMapping(value="/api/events", produces = MediaTypes.HAL_JSON_VALUE)

.contentType(MediaTypes.HAL_JSON)
.accept(
MediaTypes.HAL_JSON)
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE))

.andDo(document("create-event",
links(
linkWithRel("self").description("link to self"),
linkWithRel("query-events").description("link to query events"),
linkWithRel("update-event").description("link to update an existing event")
)

0

OMG

추가 질문입니다.

질문하다 생각난 것인데, 제가 강의 실습 시 MediaType.HAL_JSON이 불러와지지 않아서 EventController의 RequestMapping의 produces를 APPLICATION_JSON_VALUE로 진행하였습니다. 이 점 때문에 발생한 문제일까요? 

(질문 후 계속 찾아보다 https://docs.spring.io/spring-restdocs/docs/current/reference/html5/#documenting-your-api-hypermedia-link-formats

여기에서 두 가지 링크 포맷(atom, hal)에 대해서 알게 되었습니다. 강의와 KSUG에서 사용한 스프링부트 버전은 2.1.0으로 동일한데 다른 방식의 링크 포맷을 이용하신 이유가 있을까요?)

HAL_JSON은 비표준이라고 설명하셔서 해당 코드 작성시에 APPLICATION_JSON으로 작성한 것인데

같은 스프링부트 버전이면 관리하는 다른 의존성 버전은 같기에 MediaType의 값들도 같아야 될것같은데  HAL_JSON을 불러오지 못하는 이유가 있을까요?

수강 중에 그러려니하고 넘어갔는데 추가적인 문제가 발생하여 질문이 많아진 점 죄송합니다

Spring 시큐리티 관련해서 WebSecurityConfigurationAdapter

0

73

1

junit5 사용하시는 분들

0

87

1

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

0

234

2

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

0

241

1

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

0

188

1

java.lang.AssertionError: Status

0

528

2

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

0

285

1

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

0

738

1

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

0

474

1

연동 DB문의

0

357

1

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

0

503

1

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

0

378

0

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

0

621

1

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

0

511

1

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

-1

392

1

psql 적용 후 에러

0

817

2

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

0

761

2

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

0

273

1

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

1

472

1

asciidoc 추가 스니펫 에러 해결법

0

398

1

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

0

420

3

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

0

329

1

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

0

331

1

부트 + jupiter 인 경우 설정법

0

340

1