RequestEntity

Http ์š”์ฒญ ๋ณธ๋ฌธ ์ฒ˜๋ฆฌ ์ดํ•ด

  • HTTP ์š”์ฒญ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ํผ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์š”์ฒญ ๋ณธ๋ฌธ(body)์ผ ๊ฒฝ์šฐ @RequestParam์ด๋‚˜ @ModelAttribute๋Š” ์š”์ฒญ์„ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์—†๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ—ค๋” ์ •๋ณด๊ฐ€ Content-Tpye = application/json์ธ ๊ฒฝ์šฐ HTTP ๋ณธ๋ฌธ ์š”์ฒญ์€ getParameter()๋กœ ์ฝ์„ ์ˆ˜ ์—†์œผ๋ฉฐ ์ง์ ‘ HttpServletRequest์˜ InputStream ๋˜๋Š” Reader๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.


HttpEntity

  • HttpEntity๋Š” ๊ธฐ์กด HttpServletRequest๋‚˜ HttpServletResponse๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ๋‹ค.

  • HttpHeaders์™€ Body ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ํ†ตํ•ฉํ•˜์˜€๊ณ  JSON, XML, ๋ฌธ์ž์—ด, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.

  • ๋‚ด๋ถ€์ ์œผ๋กœ HttpMessageConverter ๊ฐ์ฒด๊ฐ€ ์ž‘๋™๋˜์–ด ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

img.png
img_1.png

RequestEntity

  • HttpEntity์˜ ํ™•์žฅ ๋ฒ„์ „์œผ๋กœ HTTP ๋ฉ”์„œ๋“œ์™€ ๋Œ€์ƒ URL๋„ ํฌํ•จํ•˜์—ฌ RestTemplate์—์„œ ์š”์ฒญ์„ ์ค€๋น„ํ•˜๊ฑฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ ์š”์ฒญ ์ž…๋ ฅ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

img_2.png

ํ๋ฆ„๋„

img_3.png

@RequestBody

  • @RequestBody๋Š” HTTP ์š”์ฒญ ๋ณธ๋ฌธ(body)์„ ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ HttpMessageConverter ๊ฐ์ฒด๋กœ ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • HttpEntity ๋˜๋Š” RequestEntity๋„ ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ฒ˜๋ฆฌํ•ด ์ฃผ์ง€๋งŒ ์ง€์ •๋œ ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘์„ ํ•ด์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค.

  • @Valid ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์œ ํšจ์„ฑ์„ ์‰ฝ๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

  • @RequestBody๋Š” ๋ฐ˜๋“œ์‹œ ์š”์ฒญ ๋ณธ๋ฌธ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์š”์ฒญ ๋ณธ๋ฌธ์ด ์—†์„ ๊ฒฝ์šฐ HttpMessageNotReadableException ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • required = false ์„ค์ •์œผ๋กœ ์š”์ฒญ ๋ณธ๋ฌธ์ด ์—†์„ ๋•Œ null์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

img_4.png

@RequestBody์™€ HttpEntity(RequestEntity)

img_5.png
  • @RequestBody๋Š” ์š”์ฒญ์˜ Content-Type ํ—ค๋”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ ˆํ•œ HttpMessgaeConverter๋ฅผ ์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— Content-Type ํ—ค๋”๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์„ค์ •๋˜์–ด์•ผ ํ•œ๋‹ค.

  • @RequestBody๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค. ์ƒ๋žตํ•  ๊ฒฝ์šฐ ๊ธฐ๋ณธํ˜•์€ @RequestParam, ๊ฐ์ฒด ํƒ€์ž…์€ @ModelAttribute๊ฐ€ ์ž‘๋™ํ•˜๋ฉฐ ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.

ํ๋ฆ„๋„

img_6.png

HttpMessageConverter

  • HttpMessageConverter๋Š” HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ๋ณธ๋ฌธ(body) ๋‚ด์šฉ์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ฐ˜๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ HTTP ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

  • HttpMessageConverter๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜์—ฌ ์ฃผ๋กœ JSON, XML, Plain Text์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํฌ๋งท์„ ์ง€์›ํ•œ๋‹ค.

  • HttpMessageConverter๋Š” ์ฃผ๋กœ Rest API ํ†ต์‹ ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

img_7.png
img_8.png
  • canRead() : ์ฃผ์–ด์ง„ ๊ฐ์ฒด ํƒ€์ž…๊ณผ ๋ฏธ๋””์–ด ํƒ€์ž…(Content-Type)์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • canWrite() : ์ฃผ์–ด์ง„ ๊ฐ์ฒด ํƒ€์ž…๊ณผ ๋ฏธ๋””์–ด ํƒ€์ž…(Content-Type)์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • read() : HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

  • getSupportedMediaTypes() : ํŠน์ • ํด๋ž˜์Šค ๋˜๋Š” ์ด ์ปจ๋ฒ„ํ„ฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฏธ๋””์–ด ํƒ€์ž…์˜ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • write() : ๊ฐ์ฒด๋ฅผ HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

HttpMessageConverter ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„

img_9.png
  1. ํด๋ผ์ด์–ธํŠธ Content-Type ํ—ค๋”

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ์ด๋•Œ HTTP ํ—ค๋”์— Content-Type์„ ํฌํ•จํ•˜์—ฌ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์•Œ๋ฆฐ๋‹ค.

  2. ArgumentResolver ์‹คํ–‰

    • ์Šคํ”„๋ง์€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์— @RequestBody ๋˜๋Š” HttpEntity ๋“ฑ์ด ์„ ์–ธ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    • ์„ ์–ธ ๋˜์—ˆ๋‹ค๋ฉด HTTP ์š”์ฒญ ๋ณธ๋ฌธ ArgumentResolver๊ฐ€ ์„ ํƒ๋˜๊ณ  ArgumentResolver๋Š” HttpMessageConverter๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  3. HttpMessageConverter ์ž‘๋™

    • HttpMessageConverter๋Š” ํด๋ผ์ด์–ธํŠธ์˜ Content-Type ํ—ค๋”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์š”์ฒญ ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด Text๋Š” StringHttpMessageConverter, JSON์€ MappingJackson2HttpMessageConverter๊ฐ€ ์ž‘๋™๋œ๋‹ค.

HttpMessageConverter ์‘๋‹ต ์ฒ˜๋ฆฌ ํ๋ฆ„

img_10.png
  1. ํด๋ผ์ด์–ธํŠธ Accept ํ—ค๋”

    • ํด๋ผ์ด์–ธํŠธ๋Š” Accept ํ—ค๋”๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…์‹œํ•œ๋‹ค.

  2. ReturnValueHandler ์‹คํ–‰

    • ์Šคํ”„๋ง์€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์— @ResponseBody ๋˜๋Š” ResponseEntity ๋“ฑ์ด ์„ ์–ธ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    • ์„ ์–ธ ๋˜์—ˆ๋‹ค๋ฉด HTTP ์‘๋‹ต ๋ณธ๋ฌธ ReturnValueHandler๊ฐ€ ์„ ํƒ๋˜๊ณ  ReturnValueHandler๋Š” HttpMessageConverter๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  3. HttpMessageConverter ์ž‘๋™

    • HttpMessageConverter๋Š” ํด๋ผ์ด์–ธํŠธ์˜ Accept ํ—ค๋”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต ๋ณธ๋ฌธ์— ๊ธฐ๋กํ•œ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด Text๋Š” StringHttpMessageConverter, JSON์€ MappingJackson2HttpMessageConverter๊ฐ€ ์ž‘๋™๋œ๋‹ค.

HttpMessageConverter ์š”์ฒญ ๋ฐ ์‘๋‹ต ๊ตฌ์กฐ

img_11.png

HttpMessageConverter๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ

  1. GET ์š”์ฒญ๊ณผ ๊ฐ™์€ ๋ณธ๋ฌธ์ด ์—†๋Š” ์š”์ฒญ

    • GET, DELETE์™€ ๊ฐ™์€ HTTP ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋•Œ HttpMessageConverter๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  2. Content-Type ํ—ค๋”๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ์š”์ฒญ

    • POST, PUT ๋“ฑ์˜ ๋ณธ๋ฌธ์ด ํฌํ•จ๋œ HTTP ์š”์ฒญ์ด๋ผ๋„ Content-Type ํ—ค๋”๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฏธ๋””์–ด ํƒ€์ž…์ผ ๊ฒฝ์šฐ HttpMessageConverter๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  3. @RequestParam, @ModelAttribute๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

    • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ application/x-www-form-urlencoded ํ˜•์‹์˜ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ HttpMessageConverter๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  4. ํŒŒ์ผ ์—…๋กœ๋“œ ์š”์ฒญ ์ค‘ @RequestPart ๋˜๋Š” MultipartFile์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

    • multipart/form-data ์š”์ฒญ์—์„œ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•  ๋•Œ, MultipartFile์ด๋‚˜ @RequestPart๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” MultipartResolver๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  5. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‹จ์ˆœ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜ ์‹œ @ResponseBody๋‚˜ @RestController๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

    • ๋ฐ˜ํ™˜๋œ ๋ฌธ์ž์—ด์€ ๋ทฐ ์ด๋ฆ„์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ์ด ๊ฒฝ์šฐ์—๋Š” ViewResolver๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Last updated