프로젝트 테스트 도중 에러를 만났다.
@Test
@DisplayName("delete - /api/users/followings 팔로우 취소 하기")
@WithMockCustomUser(userId = 1,nickname = "바다람사", socialId = "testuser",roles = "ROLE_USER")
void deleteFollow() throws Exception {
//given
UserRequest.FollowDeleteDTO followDeleteDTO = new UserRequest.FollowDeleteDTO();
followDeleteDTO.setUserId(2L);
String requestBody = om.writeValueAsString(followDeleteDTO);
System.out.println("테스트 requestBody: "+requestBody);
//stub
//when
ResultActions result = mvc.perform(
MockMvcRequestBuilders
.delete("/api/users/followings")
.content(requestBody)
.contentType(MediaType.APPLICATION_JSON)
);
String responseBody = result.andReturn().getResponse().getContentAsString();
System.out.println("테스트 responseBody: "+responseBody);
//then
result.andExpect(MockMvcResultMatchers.jsonPath("$.success").value("true"));
}
이 부분인데 이유를 생각해보니 delete는 request body 통신을 지원하지 않는다.
포스트맨을 썼을 때는 됐는데.. 테스트코드에서는 되지 않는다. 하지만 일반적으로 request body를 안쓰는 것이 규칙이니 다른 방법을 찾아야 했다.
처음에는 post 방식이나 put 방식으로 바꿀까 생각했지만, 전체적인 url의 통일성이 없다고 느껴졌다..
그래서 고안한 방식은 아래와 같은 방식이다.
delete - /api/users/followings/{id},{id},...
, 로 구분을 지어 받아 서버 컨트롤러 레이어에서 파싱하는것으로 정하였다. 서버에서 파싱이 필요하다는 게 조금 많이 불편하지만.. ( 디비 정규화가 떠오르기도 하고...), 파라미터로 받거나, post,put으로 받는것 보다는 깔끔하다는 생각이 들었다. 데이터가 하나일경우에는 rest하게 표현되니..
다른 사람들은 어떻게 처리를 하나 검색해보았는데 대부분 위의 가지 방식을 사용하고 있다.
이미 논쟁거리인 내용 인것 같다.
이러한 문제에 대한 결론은 애매한 것들은 post로 처리하고 action을 url에 드러내자가 많았다.
'Project > BDSR로그북(App,BackEnd)' 카테고리의 다른 글
Request DTO에 null값이 담긴다.. (0) | 2023.05.16 |
---|