본문 바로가기
학습/Spring

[spring] 스프링 웹 MVC의 HttpMessageConverter

by KKambi 2020. 4. 20.

HttpMessageConverter

  • 스프링 제공 인터페이스
  • HTTP 요청 본문 -> 객체 변환 (@RequestBody)
  • 객체 -> HTTP 응답 본문 변환 (@ResponseBody)
  • @RestController에서는 @ResponseBody 생략가능

 

깨달은 것 > @RequestBody / @ResponseBody 어노테이션이 없으면 HttpMessageConverter 사용 X

깨달은 것 > 위 어노테이션이 있으면 컨버터 , 없으면 View Resolver

 

만약, 리턴 객체를 HTTP 응답 본문으로 변환하지 않는다면?

  • 즉, 컨트롤러 클래스가 @Controller일 때
  • 즉, HttpMessageConverter를 사용하지 않고, ViewResolver를 이용할 때
  • Controller가 View의 이름 반환 -> DispatcherServlet이 ViewResolver에게 해당 view객체를 리턴하라고 명령

스프링 웹 MVC 동작 구조

 

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'

댓글