-
HTTP Message Converter ์ด์ผ๊ธฐ(1)๊ฐ๋ฐ/Spring Boot 2022. 7. 7. 03:14
๋ทฐ ํ ํ๋ฆฟ์ผ๋ก HTML์ ์์ฑํด์ ์๋ตํ๋ ๊ฒ์ด ์๋๋ผ,HTTP API์ฒ๋ผ JSON ๋ฐ์ดํฐ๋ฅผ HTTP ๋ฉ์์ง ๋ฐ๋์์ ์ง์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๊ฒฝ์ฐ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๋ค.
์คํ๋ง MVC๋ ๋ค์์ ๊ฒฝ์ฐ์ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ ์ฉํ๋ค.
HTTP ์์ฒญ : @RequestBody , HttpEntity(RequestEntity)
HTTP ์๋ต : @ResponseBody , HttpEntity(ResponseEntity)HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ ์ธํฐํ์ด์ค
org.springframework.http.converter.HttpMessageConverter
package org.springframework.http.converter; public interface HttpMessageConverter<T> { boolean canRead(Class<?> clazz, @Nullable MediaType mediaType); boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType); List<MediaType> getSupportedMediaTypes(); T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException; void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException; }
HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ HTTP ์์ฒญ, HTTP ์๋ต ๋ ๋ค ์ฌ์ฉ๋๋ค.
canRead() , canWrite() : ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ํด๋น ํด๋์ค, ๋ฏธ๋์ดํ์ ์ ์ง์ํ๋์ง ์ฒดํฌ
read(), write() : ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ํตํด์ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ธฐ๋ฅ์คํ๋ง ๋ถํธ ๊ธฐ๋ณธ ๋ฉ์์ง ์ปจ๋ฒํฐ
์คํ๋ง ๋ถํธ๋ ๋ค์ํ ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ์ ๊ณตํ๋๋ฐ, ๋์ ํด๋์ค ํ์ ๊ณผ ๋ฏธ๋์ด ํ์ ๋์ ์ฒดํฌํด์ ์ฌ์ฉ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ๋ง์ฝ ๋ง์กฑํ์ง ์์ผ๋ฉด ๋ค์ ๋ฉ์์ง ์ปจ๋ฒํฐ๋ก ์ฐ์ ์์๊ฐ ๋์ด๊ฐ๋ค.
(์ผ๋ถ ์๋ต)
0 = ByteArrayHttpMessageConverter 1 = StringHttpMessageConverter 2 = MappingJackson2HttpMessageConverter
์์ ๋ช๊ฐ์ง ์ฃผ์ํ ๋ฉ์์ง ์ปจ๋ฒํฐ๋ค์ ๋ํด ์์๋ณด์.
ByteArrayHttpMessageConverter
byte[] ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
ํด๋์ค ํ์ : byte[] , ๋ฏธ๋์ดํ์ : */* ์์ฒญ
์) @RequestBody byte[] data ์๋ต
์) @ResponseBody return byte[] ์ฐ๊ธฐ ๋ฏธ๋์ดํ์ application/octet-stream
StringHttpMessageConverter
String ๋ฌธ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
ํด๋์ค ํ์ : String , ๋ฏธ๋์ดํ์ : */* ์์ฒญ
์) @RequestBody String data ์๋ต
์) @ResponseBody return "ok" ์ฐ๊ธฐ ๋ฏธ๋์ดํ์ text/plain
MappingJackson2HttpMessageConverter
application/json
ํด๋์ค ํ์ : ๊ฐ์ฒด ๋๋ HashMap , ๋ฏธ๋์ดํ์ application/json ๊ด๋ จ์์ฒญ
์) @RequestBody HelloData data ์๋ต
์) @ResponseBody return helloData ์ฐ๊ธฐ ๋ฏธ๋์ดํ์ application/json ๊ด๋ จ์์ ์ ์๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ดํด ํด๋ณด์.
StringHttpMessageConverter
// content-type: application/json @RequestMapping void hello(@RequetsBody String data) {}
๋จผ์ ํด๋์ค ํ์ ์ String์ด๋ค. ๊ทธ๋ผ 0์์๋ฅผ ์ง๋ 1์์๋ก ๋์ด์๋ StringHttpMessageConverter๋ก ๊ฐ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๊ณ ๋์ ํด๋น ์ปจ๋ฒํฐ์ ๋ฏธ๋์ด ํ์ ์ ํ์ธํด๋ณด๋ */* (๋ชจ๋ ํ์ ์ ํ์ฉ) ์ผ๋ก ๋์ด ์๋ค. ์ฆ, content-type ์ด application/json์ผ๋ก ๋์ด ์๋ ํด๋น ์์ฒญ์ ํ์ฉ์ด ๋๋ค. ๋ฐ๋ผ์ StringHttpMessageConverter๊ฐ ์ฌ์ฉ ๋จ์ ์ ์ ์๋ค.
MappingJackson2HttpMessageConverter
//content-type: application/json @RequestMapping void hello(@RequetsBody HelloData data) {}
์ด๋ฒ์๋ ํด๋์ค ํ์ ์ด ๊ฐ์ฒด์ด๋ค. ๊ทธ๋ผ 0์์๋ฅผ ์ง๋๊ณ , ๋ค์ 2์์๋ ์ง๋, ๋ง์ง๋ง 3์์ MappingJackson2HttpMessageConverter๋ก ๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค. ํด๋น ์ปจ๋ฒํฐ์ ๋ฏธ๋์ด ํ์ ์ application/json ๊ด๋ จ์์ฒญ์ด๋ผ๊ณ ์ ํ ์๋ค. ์์ ์ฝ๋์์ ์ค์ ํ content-type๊ณผ ์ผ์นํ๋ค. ๋ฐ๋ผ์ MappingJackson2HttpMessageConverter ๊ฐ ์ฌ์ฉ ๋ ๊ฒ์ด๋ค.
???
//content-type: text/html @RequestMapping void hello(@RequetsBody HelloData data) {}
์ด๋ฒ์๋ ์ญ์ ๊ฐ์ฒด ํ์ ์ด๋ค. MappingJackson2HttpMessageConverter ๋ก ๊ฐ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋ฏธ๋์ด ํ์ ์ด application/json ๊ด๋ จ์์ฒญ์ด์ด์ผ ํ๋๋ฐ, ์์ ์ฝ๋์์๋ text/html ํ์ ์ด๋ค. ๋ฐ๋ผ์ ์ด ์ํฉ์ ํ๋ฝ์ด๋ผ๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
HTTP ์์ฒญ ๋ฐ์ดํฐ ์ฝ๊ธฐ
1. HTTP ์์ฒญ์ด ์ค๊ณ , ์ปจํธ๋กค๋ฌ์์ @RequestBody , HttpEntity ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ค.
2. ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ๋ฉ์์ง๋ฅผ ์ฝ์ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด canRead() ๋ฅผ ํธ์ถํ๋ค.
: (1) ๋์ ํด๋์ค ํ์ ์ ์ง์ํ๋๊ฐ.
์) @RequestBody ์ ๋์ ํด๋์ค ( byte[] , String , HelloData )(2) HTTP ์์ฒญ์ Content-Type ๋ฏธ๋์ด ํ์ ์ ์ง์ํ๋๊ฐ.
์) text/plain , application/json , */*
3. canRead() ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด read() ๋ฅผ ํธ์ถํด์ ๊ฐ์ฒด ์์ฑํ๊ณ , ๋ฐํํ๋ค.
HTTP ์๋ต ๋ฐ์ดํฐ ์์ฑ
1. ์ปจํธ๋กค๋ฌ์์ @ResponseBody , HttpEntity ๋ก ๊ฐ์ด ๋ฐํ๋๋ค.
2. ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ๋ฉ์์ง๋ฅผ ์ธ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด canWrite() ๋ฅผ ํธ์ถํ๋ค.: (1) ๋์ ํด๋์ค ํ์ ์ ์ง์ํ๋๊ฐ.
์) return์ ๋์ ํด๋์ค ( byte[] , String , HelloData )(2) HTTP ์์ฒญ์ Accept ๋ฏธ๋์ด ํ์ ์ ์ง์ํ๋๊ฐ.
(๋ ์ ํํ๋ @RequestMapping ์ produces )
์) text/plain , application/json , */*
3. canWrite() ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด write() ๋ฅผ ํธ์ถํด์ HTTP ์๋ต ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
'๊ฐ๋ฐ > Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
API ์์ธ ์ฒ๋ฆฌ - HandlerExceptionResolver(1) (0) 2022.07.07 Http Message Converter ์ด์ผ๊ธฐ(2) (0) 2022.07.07 HTTP API ์๋ต ์ ๋ฆฌ (0) 2022.07.07 ์คํ๋ง์ด ์ฌ๋ํ ๋์์ธ ํจํด (0) 2022.05.31 ๊ฐ์ฒด ์งํฅ ์ค๊ณ 5์์น - SOLID (0) 2022.05.24