프로젝트에서 Rest Controller를 만들었을 때, ResponseEntity
를 사용해 반환하고 있었다.
@PostMapping("/member")
ResponseEntity<MemberCreateResponse> createMember(@RequestBody MemberCreateRequest request) {
Member member = memberService.createMember(memberMapper.toMember(request));
return new ResponseEntity<>(memberMapper.toMemberCreateResponse(member), HttpStatus.CREATED);
}
내가 개발하는 것은 API 서버이기도 하고, MessageConverter를 사용해보는 것이 어떻겠냐는 피드백을 받아서 관련 내용을 검색 후 정리해봤다.
HTTP 요청 본문과 HTTP 응답 본문을 통째로 메세지로 다루는 방식이다.
XML
이나 JSON
을 이용한 AJAX기능이나 웹 서비스를 개발할 때 사용된다.@RequestBody
와 @ResponseBody
를 통해 HTTP 메시지 컨버터를 자동 사용할 수 있다.@RequestBody
를 사용할 수 없고, 이 경우엔 @RequestParam
이나 @ModelAttribute
를 사용해야 한다.HTTP message converter는 다음과 같은 조건에서 실행된다.
즉, HTTP message converter는 HTTP message body를 사용한 요청과 응답을 처리할 때 사용된다.
@RequestBody, HttpEntity(= RequestEntity)
@ResponseBody, HttpEntity(= ResponseEntity)
스프링 부트를 사용할 경우, 메시지 컨버터는 자동 생성된다.
BackgroundPreinitializer
클래스: 내부적으로 MessageConverter를 생성하여 실행시킨다.@RequestBody
byte[] param
과 같이 작성하면 모든 요청을 다 byte배열로 받을 수 있다는 말이다.byte[]
로 했을 경우 Content-Type
이 applcation/octet-stream
으로 설정되어 전달된다.HTTP 본문을 그대로 String
으로 가져올 수 있다.Content-Type
은 text/plain
Content-Type
이 application/octet-stream
를 지원한다. 알려지지않은 파일 타입은 이타입을 사용한다.MediaType.APPLICATION_FORM_URLENCODED
, MediaType.MULTIPART_FORM_DATA
,MediaType.MULTIPART_MIXED
이다.MediaType.APPLICATION_JSON
만 지원한다.@ResponseBody
를 사용하면, 반환하는 것이 객체일 경우 JSON으로 반환된다고 한다.
따라서, 나는 @ResponseBody
어노테이션을 사용하도록 수정했다.
@PostMapping("/member")
@ResponseBody
MemberCreateResponse createMember(@RequestBody MemberCreateRequest request) {
Member member = memberService.createMember(memberMapper.toMember(request));
return memberMapper.toMemberCreateResponse(member);
}
SpringMVC 에서 말하는 MessageConverter 코드로 이해하기