SPRING/스프링 MVC

HTTP 요청 맵핑하기 3부: 미디어 타입 맵핑

JUMP개발자 2021. 6. 26. 22:20

특정한 타입의 데이터를 담고 있는 요청만 처리하는 핸들러

 

- @RequestMapping(consumes=MediaType.APPLICATION_JSON_UTF8_VALUE)

- Content-Type 헤더로 필터링 

- 매치 되는 않는 경우에 415 Unsupported Media Type 응답

 

특정한 타입의 응답을 만드는 핸들러 

- @RequestMapping(produces=”application/json”) 

- Accept 헤더로 필터링

  (Accept Type 헤더에 아무 것도 없는 경우에는 produces에 어떤 타입을 맵핑하더라도 정상 동작)

- 매치 되지 않는 경우에 406 Not Acceptable 응답

 

 

@Controller
@RequestMapping(consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
// 위와 같이 Controller에 consumes이 맵핑되어 있고, 메서드에도 맵핑되어 있는경우에는
// 메서드에 되어 있는 맵핑이 우선시 된다.
public class SampleController3 {

    /* consumes = MediaType.APPLICATION_JSON_UTF8_VALUE  -> Content-Type 담긴 데이터가 JSON 타입일 경우
     * produces = MediaType.TEXT_PLAIN_VALUE             -> Response Type이 TEXT 타입일 경우에 return
     */
    @RequestMapping(value="/hello3",
                    consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
                    produces = MediaType.TEXT_PLAIN_VALUE)
    @ResponseBody
    public String hello() {
        return "hello";
    }

}

아래와 같이 accept Type을 JSON으로 설정하고 테스트를 실행할때는 406 에러가 발생한다.

@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void helloTest2() throws Exception {
        mockMvc.perform(get("/hello3")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .accept(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk());
    }


}