HttpMessageConverter
- 스프링 제공 인터페이스
- HTTP 요청 본문 -> 객체 변환 (@RequestBody)
- 객체 -> HTTP 응답 본문 변환 (@ResponseBody)
- @RestController에서는 @ResponseBody 생략가능
깨달은 것 > @RequestBody / @ResponseBody 어노테이션이 없으면 HttpMessageConverter 사용 X
깨달은 것 > 위 어노테이션이 있으면 컨버터 , 없으면 View Resolver
만약, 리턴 객체를 HTTP 응답 본문으로 변환하지 않는다면?
- 즉, 컨트롤러 클래스가 @Controller일 때
- 즉, HttpMessageConverter를 사용하지 않고, ViewResolver를 이용할 때
- Controller가 View의 이름 반환 -> DispatcherServlet이 ViewResolver에게 해당 view객체를 리턴하라고 명령
HttpMessageConverter 종류 多
- 어떤 요청을 보냈는지, 어떤 응답을 보냈는지에 따라 달라짐
- HTTP 요청 응답은 모두 문자
- JSON으로 변환할 수 있는 것 : JSON 메세지 컨버터 (멤버 필드를 가지는 객체)
- 문자열로 변환할 수 있는 것 : String 메세지 컨버터 (String, int, ...)
JSON Convert 테스트해보기
JSON Converter는 org.springframework.http.converter.json의 Jackson2HttpMessageConverter를 이용
1. HTTP 요청, 응답에 담길 JSON이 될 User Class 작성
- 어떤 요청이든 getter는 필수
- POST 요청 시, setter는 존재하지 않아도 된다.
1
2
3
4
5
6
7
8
9
|
public class User {
private Long id;
private String userName;
private String password;
//getter
//setter
}
|
cs |
2. POST 요청 URI에 대해 Mapping하는 Controller 작성 (Handler)
- @RestController는 @ResponseBody를 생략 가능
- 파라미터의 @RequestBody는 생략 불가
1
2
3
4
5
6
7
8
|
@RestController
public class UserController {
@PostMapping("/user/create")
public User create(@RequestBody User user){
return user;
}
}
|
cs |
3. Controller Test Class 작성
- WebMvcTest에선 MockMvc를 통한 테스트
- post 요청(perform) -> contentType / accept로 HTTP Request Header -> content로 HTTP Response Body
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
MockMvc mockMvc; // WebMvcTest에서 필요한 MockMvc
@Test
public void createUser_JSON() throws Exception {
String userJson = "{\"userName\":\"kkambi\", \"password\":\"123123\"}";
mockMvc.perform(post("/user/create"))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(userJson) // HTTP Request Body
.andExpect(status().isOk())
.andExpect(jsonPath("$.userName", is(equalTo("kkambi")))) //jsonPath로 검증
.andExpect(jsonPath("$.password", is(equalTo("123123"))));
}
}
|
cs |
Accept 헤더가 XML일 때
- 오류! XML HttpMessageConverter가 없기 때문
- 이유? XML 컨버터인 MappingJackson2XmlHttpMessageConverter는 XmlMapper.class가 존재할 때만 빈 등록
- 해결! XML 컨버터 의존성 추가
- compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링 웹 MVC의 정적 리소스 지원 (0) | 2020.04.23 |
---|---|
[spring] 스프링 웹 MVC의 ViewResolver (0) | 2020.04.21 |
[spring] 스프링부트를 통한 스프링 웹 MVC 구축의 편리함 (0) | 2020.04.19 |
[spring] 스프링부트의 Spring-Boot-Devtools (0) | 2020.04.18 |
[spring] 스프링부트의 테스트 (0) | 2020.04.17 |
댓글