스프링 MVC 활용(4) : HTTP 요청 맵핑하기 3부 - 미디어 타입

de_sj_awa·2021년 7월 3일
0

4. HTTP 요청 맵핑하기 3부 - 미디어 타입

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

  • @RequestMapping(consumes=MediaType.APPLICATION_JSON_UTF8_VALUE)
  • Content-Type 헤더로 필터링
  • 매치 되는 않는 경우에 415 Unsupported Media Type 응답

기존 코드

@Controller
public class SampleController {

    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "hello";
    }
}
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;
	
    @Test
    public void helloTest() throws Exception{
        mockMvc.perform(get("/hello"))
               .andDo(print())
               .andExpect(status().isOk());
            
    }
}

핸들러가 json을 보내는 경우만 요청을 처리하고 싶다.

@Controller
public class SampleController {

//    @RequestMapping(value = "/hello", consumes = "applications/json")
  @RequestMapping(value="/hello", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    public String hello(){
        return "hello";
    }
}

문자열로 입력하면 에러가 날 소지가 많으므로 문자열을 입력하는 대신 MediaType을 사용하면 상수를 (IDE에서) 자동 완성으로 사용할 수 있다.

Content-Type 헤더가 요청 본문이 어떤 형식의 데이터인지 알려준다.

테스트 코드

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

    @Autowired
    MockMvc mockMvc;
	
    @Test
    public void helloTest() throws Exception{
        mockMvc.perform(get("/hello")
               .contentType(MediaType.APPLICATION_JSON_UTF8))
               .andDo(print())
               .andExpect(status().isOk());
    }
}

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

  • @RequestMapping(produces=”application/json”)
  • Accept 헤더로 필터링 (하지만 살짝... 오묘함 : Accept 헤더를 설정하지 않는 경우에는 아무거나 받겠다는 뜻)
  • 매치 되지 않는 경우에 406 Not Acceptable 응답

요청을 보내는 쪽에서 Accept 헤더를 설정할 수 있다.

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

    @Autowired
    MockMvc mockMvc;
	
    @Test
    public void helloTest() throws Exception{
        mockMvc.perform(get("/hello")
               .contentType(MediaType.APPLICATION_JSON_UTF8)
               .accept(MediaType.APPLICATION_JSON_UTF8))
               .andDo(print())
               .andExpect(status().isOk());
    }
}

만약 plain text를 produce하겠다고 명시하면 테스트는 실패한다.

@Controller
public class SampleController {

    @RequestMapping(value="/hello", 
  		consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
  		produces = MediaType.TEXT_PLAIN)
    @ResponseBody
    public String hello(){
        return "hello";
    }
}

클래스에 선언한 @RequestMapping에 사용한 것과 조합이 되지 않고 메소드에 사용한 @RequestMapping의 설정으로 덮어쓴다.

@Controller
@RequestMapping(consumes = MediaType.APPLICATION_XML_VALUE)
public class SampleController {

    @RequestMapping(value="/hello", 
  		consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
  		produces = MediaType.TEXT_PLAIN)
    @ResponseBody
    public String hello(){
        return "hello";
    }
}

URL value와 달리, 서로 조합되는 관계가 아니라 메소드가 클래스의 설정을 오버라이딩 한다. 따라서 클래스의 설정은 적용되지 않고 메소드의 설정만 적용된다.

Not (!)을 사용해서 특정 미디어 타입이 아닌 경우로 맵핑 할 수도 있다.

참고

  • 인프런 : 스프링 웹 MVC(백기선)
profile
이것저것 관심많은 개발자.

0개의 댓글