-
Spring Web MVC -HttpMessageConverters백기선(인프런 강의)/스프링 부트 개념과 활용 2020. 4. 22. 08:34반응형
https://docs.spring.io/spring/docs/5.0.7.RELEASE/spring-framework-reference/web.html#spring-web
HttpMessageConverters
Spring Framework에서 제공하는 인터페이스이며 Spring MVC의 일부분이다.
HTTP 요청 본문을 객체로 변경하거나, 객체를 HTTP 응답 본문으로 변경할 때 사용한다.
@RequestBody / @ResponseBody 와 함께 사용된다.
데이터 요청으로 들어올 때 요청의 본문에 그 데이터가 들어있을 때, 그걸 객체로 받고 싶으면 파라미터로 @ResquestBody를 붙여 객체로 받을 수 있다.(스프링이 알아서 conversion 해줌)
@Controller public class SrpingControllerTest { @PostMapping("/user") public @ResponseBody User create(@RequestBody User user) { return null; } }
지금 동안 만들었던 Controller부분이 나도 모르게 HttpMessageConverters을 사용하고 있었다.
HttpMessageConverters 을 알아보자
사용하는 HttpMessageConverters는 여러가지가 있고, 그 중에서 어떤 요청을 받았는지 또는 어떤 응답을 보내야하는지에 따라 사용하는 HttpMessageConverters가 달라진다.
예를 들어 요청이 json요청이고, json 본문이 들어온 경우(요청에는 contents type이라는 헤더가 있다. contents type도 json이고, 본문도 json) jsonMessageConverter가 사용이 되어, json 메세지를 User라는 객체로 컨버팅 해준다..
return할 때, User라는 객체를 return 할 것이다. http가 문자이므로, 객체 자체를 response로 내보낼 수는 없다. 따라서 HttpMessageConverters를 사용하여 변환해야한다.
컴포지션 타입(객체 안에 여러가지 프로퍼티를 가질 수 있는 타입)일 경우 기본적으로 jsonMessageConverter가 사용된다.
컴포지션 타입이 아닌 일반 String 객체나 int객체를 예로 들면 StringMessageConverter가 사용된다.(int도 toString을 사용하여 문자열로 변환할 수 있기때문)
클래스에 Controller가 아닌 @RestController가 붙어있으면 public 뒤에 @ResponseBody를 생략할 수 있다.
테스트 예제
Junit Test
package kr.co.root.study; import static org.hamcrest.CoreMatchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; 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(SrpingController.class) public class SrpingControllerTest { @Autowired MockMvc mockMvc; @Test public void createuser_JSON() throws Exception { String userJson = "{\"name\": \"jinseok\", \"age\": \"30\"}"; mockMvc.perform(post("/user/create") .contentType(MediaType.APPLICATION_JSON_UTF8) .accept(MediaType.APPLICATION_JSON_UTF8) .content(userJson)) .andExpect(status().isOk()) .andExpect(jsonPath("$.username", is(equals("jinseok")))) .andExpect(jsonPath("$.age", is(equals("30")))); } }
User
public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Controller
@Controller public class SrpingController { @PostMapping("/user/create") public @ResponseBody User create(@RequestBody User user) { return user; } }
반응형'백기선(인프런 강의) > 스프링 부트 개념과 활용' 카테고리의 다른 글
정적 리소스 지원 (0) 2020.05.05 Spring Web MVC - ViewResolver (0) 2020.04.22 Spring-Boot-Devtools (0) 2020.04.21 테스트 (0) 2020.04.16 스프링 부트 기본 로거 설정 (0) 2020.04.16