본문으로 바로가기

[Spring MVC] 미디어 타입 ( MediaType )

category Spring/SpringMVC 2019. 7. 25. 01:17

웹의 동작은 request , response의 결과로 동작하게 된다.

클라이언트에서 request를 하면 서버에서는 response로 응답을 하게 된다.

 

Spring의 관점에서 말하자면 Controller가 존재하고 GetMapping or RequestMapping등으로 요청을 받을수 있다.

그때 핸들러가 요청과 응답을 보낼때 특정 타입에만 응답하도록 만들수 있다.

request에는 consumes, response에는 produces를 통해서 가능하다.

 

<Request>

package com.example.demo;


import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SampleController {
	@GetMapping(value = "/hello" , consumes = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public String hello() {
		return "hello";
	}
}

consumes = MediaType.APPLICATION_JSON_VALUE ( application/json )

=> 요청을 JSON TYPE의 데이터만 담고있는 요청을 처리하겠다는 의미가 된다.

 

<테스트>

package com.example.demo;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

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

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

 

테스트 결과를 보면 정상적으로 잘 돌아간다.

자세히 테스트 request 코드를 보면 MediaType.APPLICATION_JSON_UTF8을 했지만

핸들러에서는 MediaType.APPLICATION_JSON_VALUE로 지정되어 있다.

content-Type은 http의 스펙이지만 charset는 스펙이 아니고 특정 브라우저에서 지원해주는 기능이다.

그렇기 때문에 UTF-8로 에러가 나진 않는다.

 


<Request & Response>

 

package com.example.demo;


import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SampleController {
	@GetMapping(
			value = "/hello" ,
			consumes = MediaType.APPLICATION_JSON_VALUE,
			produces = MediaType.TEXT_PLAIN_VALUE
	)
	@ResponseBody
	public String hello() {
		return "hello";
	}
}

 

<테스트>

 

package com.example.demo;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

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

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

Response는 조끔 애매?하다고 할수있는것이 테스트에 .accept라고 특정 값을 받길 원한다고 했지만 

만약 accept를 적지 않으면 핸들러 produces에서 어떤값을 주더라도 받게 되어있다.(에러가 안남)

아무거나 달랬으니 주는대로 받는거라고 이해하면 될듯하다.

 

또한 클래스에 consumes와 핸들어에 consumes 두개가 있다면 두개다 되는것이 아니라

핸들러의 consumes가 오버라이딩 된다(덮어쓰게 된다). produces 또한 같다.

 

참고로 consumes 때문에 에러가 나면 415 ,produces 때문에 에러가 나면  406 에러가 발생한다.

'Spring > SpringMVC' 카테고리의 다른 글

[Spring MVC] @SessionAttributes  (0) 2019.08.15
[Spring MVC] @Valid vs @Validated  (1) 2019.08.13
[Spring MVC] @ModelAttribute  (0) 2019.08.13
[Spring MVC] 요청 매개변수 ( @RequestParam)  (0) 2019.08.13
[Spring MVC] URI 패턴  (0) 2019.07.19