본문 바로가기
Spring

스프링 HttpMessageConverters

by 스르나 2021. 1. 27.

HttpMessageConverters

 

스프링 부트로 앱을 개발하다가 Get,Post방식으로 클라이언트쪽에서 보낸 데이터를 자동으로 자바빈으로 매핑을 해주는 것이 어떠한 방식으로 해주는지 문득 궁금해서 이번에 알아보았다.

 

Spring MVC uses the HttpMessageConverter interface to convert HTTP requests and responses. Sensible defaults are included out of the box. For example, objects can be automatically converted to JSON (by using the Jackson library) or XML (by using the Jackson XML extension, if available, or by using JAXB if the Jackson XML extension is not available). By default, strings are encoded in UTF-8.

 

위의 설명은 스프링 부트의 공식 문서에서의 HttpMessageConverters부분의 내용인데 내용은 "HttpMessageConverters는 Http요청의 본문은 객체로 변환하거나, 객체를 Http본문으로 변환하는데 사용되는 인터페이스이다."라고 설명이 되어있다.

 

가령 예를 들어 클라이언트에서 form태그를 통해 아이디,패스워드를 보내는 경우를 생각해보자.

 

<form action="/login" method="post">
    <input type="text" name="id">
    <input type="text" name="pwd">
    <input type="submit" value="입력">
</form>

name속성을 통해 입력받는 것의 이름을 정해주고 입력받은 것을 컨트롤러로 보내주면 컨트롤러에서는 아이디,패스워드를 따로따로 받지 않고 미리 만들어둔 자바객체에 한번에 매핑을 시킨다.

 

@PostMapping("/login")
public String login(Model model, @ModelAttribute UserDto userDto){
    System.out.println(userDto); //입력받은 아이디와 패스워드가 나온다
    model.addAttribute("userInfo",userDto);
    return "login";
}

 

이렇게 자동으로 변환해주는 것이 HttpMessageConverters의 역할이다.

이렇게 보면 별거 아닌것 처럼 보이겠지만 곰곰히 생각해주면 우리가 간단하게 어노테이션을 하나 붙임으로서 생각보다 많은 일이 일어난다.

 

우선 자바는 타입이 존재하는 언어이다. 그렇다는 것은 클라이언트에서 보낸 값들이 자바객체의 변수 타입과 일치해야한다. 두번째는 클라이언트에서 보낸 데이터의 이름과 같은 변수에 자동으로 매핑을 시켜주는 것이다.

 

이렇게 다양하게 매핑을 시켜줄 수 있는 이유는 HtttpMessageConverters인터페이스를 구현하는 구현체가 다양하기 때문이다.

 

Json을 객체로 바꾸는 컨버터, 객체를 Json으로 바꾸는 컨버터등 다양한 컨버터가 존재하기 때문에 서버와 클라이언트의 http통신의 헤더에서 컨텐츠 헤더를 보고 적절히 바꿀 수 있는 것이다.

 

응답 헤더를 보면 아래와 같다

 

위 그림은 html의 form으로 스프링 restcontroller로 요청을 보내고 응답을 자바 객체로 한것인데 여기서 응답 헤더를 보면 컨텐츠 타입이 json임을 알 수 있다. 그렇다는 것은 컨트롤러에서 보낼때 자동으로 자바 객체를 json으로 바꾼 것을 알 수 있다.

 

또한 html form으로 보낸 요청을 json이 아닌 페이지로 받을때는 아래와 같이 나타난다.

보면 응답 컨텐츠가 html이다.

 

그렇다면 이런 HttpMessageConverters의 구현체중 자주 사용하는 것을 보자

 

@RequestBody

- Http요청의 Body내용의 JSON을 자바 객체로 변환시킴 반드시 POST에서만 사용

 

@ResponseBody

- 자바 객체를 Http응답의 Body에 맞게 변환시킴

 

@ModelAtrribute

-RequestBody와 비슷하게 객체로 매핑시키지만 Mvc패턴에서 사용된다. form태그로 전송한는것을 모두 이거로 받는다. 정확히는 HttpMessageConverters가 아니다

 

@RequestPara

-ModelAttribute와 비슷한데, 객체로 매핑시키지 않는다.

 

ResponseBody는 응답을 응답 body에 json으로 넣어주는 것인데 RequestBody와 Modelattribute는 좀 헷갈렸다.

 

두개의 차이점을 간단히 설명하면 RequestBody는 Json으로 온 요청을 처리하는데 사용하고 ModelAtrribute는 서블릿에서 온 요청을 처리하는데 사용한다고 생각하면 편하다.

'Spring' 카테고리의 다른 글

Spring 단위테스트 - 1  (0) 2021.02.28
InMemory-H2  (0) 2021.02.23
Autowired  (0) 2020.05.11
Environment  (0) 2020.05.11
Scope  (0) 2020.05.11