[๐Ÿ“ฐ ์œ„ํด๋ฆฌํŽ˜์ดํผ] ์›น API ๋ฐœ์ „๊ณผ์ • & RestController

han91ยท2026๋…„ 2์›” 23์ผ

[์œ„ํด๋ฆฌํŽ˜์ดํผ]

๋ชฉ๋ก ๋ณด๊ธฐ
7/11

๐Ÿ“Œ API๋ž€?

๐Ÿง ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ์˜ API

API๋Š” "Application Programming Interface"์˜ ์•ฝ์ž๋กœ, ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํ”„๋กœ๊ทธ๋žจ์ด ์„œ๋กœ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์–ธ์–ด์ด์ž ๋ช…์„ธ์„œ

๐Ÿ’ API์˜ ์—ญํ• ๊ณผ ํ•„์š”์„ฑ

  • ๊ธฐ๋Šฅ ๋…ธ์ถœ
    : ์™ธ๋ถ€์— ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋˜, ๋‚ด๋ถ€ ๋กœ์ง์€ ์ˆจ๊น€
  • ์‹œ์Šคํ…œ ๊ฒฝ๊ณ„ ๊ด€๋ฆฌ
    : ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ๊ตฌ์กฐ์  ๋…๋ฆฝ์„ฑ ํ™•๋ณด
  • ์•ˆ์ •์„ฑ ๋ณด์žฅ
    : ๋‚ด๋ถ€๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์™ธ๋ถ€์— ์˜ํ–ฅ ์—†์Œ
  • ํ˜‘์—… ์ˆ˜๋‹จ
    : API ๋ช…์„ธ์„œ๊ฐ€ ํŒ€ ๊ฐ„ ์•ฝ์†์ด์ž ๊ณ„์•ฝ์„œ ์—ญํ• 
  • ์žฌ์‚ฌ์šฉ์„ฑ ๊ฐ•ํ™”
    : ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿ’ป ์›น API์˜ ํŠน์ง•

๐Ÿ” ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ํ†ต์‹ 

์›น API๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ

GET /api/products/1 HTTP/1.1
Host: example.com
Accept: application/json

์žฅ์ 

  • URL๋งŒ ์•Œ๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋ธŒ๋ผ์šฐ์ €, ๋ชจ๋ฐ”์ผ ์•ฑ, ์™ธ๋ถ€ ์„œ๋น„์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ์ธํ”„๋ผ ์ œ์•ฝ์ด ์ ์Œ (HTTP 80/443 ํฌํŠธ ์‚ฌ์šฉ)

๐Ÿ” ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ

์›น API๋Š” ํŠน์ • OS๋‚˜ ์–ธ์–ด์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ํ‘œ์ค€ํ™”๋œ HTTP ์š”์ฒญ๊ณผ JSON/XML ๋“ฑ์˜ ํฌ๋งท๋งŒ ์ง€ํ‚ค๋ฉด ์–ด๋–ค ํ”Œ๋žซํผ์—์„œ๋“  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ

๐Ÿ” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ์˜ ์—ญํ• 

๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ฐ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ์กด์žฌ
-> ์ด๋“ค์€ ๊ฐ์ž์˜ API๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ ๋™์ž‘ํ•จ

ex) ์ฃผ๋ฌธ ์„œ๋น„์Šค์™€ ์ƒํ’ˆ ์„œ๋น„์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ

[์ฃผ๋ฌธ ์„œ๋น„์Šค] --(HTTP API)--> [์ƒํ’ˆ ์„œ๋น„์Šค] --(HTTP API)--> [ํšŒ์› ์„œ๋น„์Šค]

๐Ÿ” HTTP ํ”„๋กœํ† ์ฝœ ํ™œ์šฉ์˜ ์žฅ์ 

๐Ÿ“Œ ๋ฌด์ƒํƒœ์„ฑ (Statelessness)

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ด์ „ ์š”์ฒญ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Œ
  • ๊ฐ ์š”์ฒญ์€ ๋…๋ฆฝ์ ์ด๋ฉฐ, ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์š”์ฒญ ์•ˆ์— ํฌํ•จํ•ด์•ผ ํ•จ

๐Ÿ“Œ ๋น„์—ฐ๊ฒฐ์„ฑ (Connectionless)

  • HTTP๋Š” ์š”์ฒญ-์‘๋‹ต ํ›„ ์—ฐ๊ฒฐ์„ ๋Š์Œ
  • ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€ ์•Š์•„ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ์ค„์ž„
    ๐Ÿ‘‰ ์„œ๋ฒ„๋Š” ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿง SOAP?

SOAP(Simple Object Access Protocol)์€ HTTP, SMTP ๋“ฑ์˜ ํ”„๋กœํ† ์ฝœ ์œ„์—์„œ XML ํ˜•์‹์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ์‹์˜ API ํ†ต์‹  ํ”„๋กœํ† ์ฝœ
-> ์ฃผ๋กœ 2000๋…„๋Œ€ ์ดˆ๋ฐ˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์—์„œ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ์žก์œผ๋ฉฐ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ๊ฐ„ ์—ฐ๋™์— ์‚ฌ์šฉ๋จ

SOAP์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ์ด์œ 
๐Ÿ‘‰ ํ”Œ๋žซํผ๊ณผ ์–ธ์–ด์— ๋…๋ฆฝ์ ์ธ ํ†ต์‹  ๊ทœ์•ฝ์ด ํ•„์š”ํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ

๐Ÿ” SOAP์˜ ๊ตฌ์กฐ ์ดํ•ด

SOAP ๋ฉ”์‹œ์ง€๋Š” ํฌ๊ฒŒ Envelope, Header, Body ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ฐ ์š”์†Œ๋Š” XML๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ์—„๊ฒฉํ•œ ๊ตฌ์กฐ์™€ ๋ช…ํ™•ํ•œ ๋ช…์„ธ๋ฅผ ๋”ฐ๋ฆ„

<soapenv:Envelope xmlns:soapenv="<http://schemas.xmlsoap.org/soap/envelope/>">
   <soapenv:Header/>
   <soapenv:Body>
      <getUser>
         <id>1</id>
      </getUser>
   </soapenv:Body>
</soapenv:Envelope>
  • Envelope : SOAP ๋ฉ”์‹œ์ง€์˜ ๋ฃจํŠธ ์š”์†Œ, ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋Š” ์ด ์•ˆ์— ํฌํ•จ๋จ
  • Header : ์ธ์ฆ, ํŠธ๋žœ์žญ์…˜ ๋“ฑ์˜ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ณต๊ฐ„(์„ ํƒ์ )
  • Body : ์‹ค์ œ ํ˜ธ์ถœํ•˜๋ ค๋Š” ๋ฉ”์„œ๋“œ ์ •๋ณด์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ

๐Ÿ” SOAP์˜ ์ฃผ์š” ํŠน์ง•

  • ๊ณ„์•ฝ ๊ธฐ๋ฐ˜
    : WSDL(์›น ์„œ๋น„์Šค ๊ธฐ์ˆ  ๋ช…์„ธ)์„ ํ†ตํ•ด ์„œ๋น„์Šค ์ •์˜ -> ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ
  • ์—„๊ฒฉํ•œ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ
    : XSD ๊ธฐ๋ฐ˜ ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋ฆ„, ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฆฌํ„ด ๊ฐ’์˜ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋จ
  • ์ „์†ก ํ”„๋กœํ† ์ฝœ ์œ ์—ฐ์„ฑ
    : HTTP ์™ธ์—๋„ SMTP, FTP ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์—์„œ ๋™์ž‘ ๊ฐ€๋Šฅ
  • ๋ณด์•ˆ ๋ฐ ์‹ ๋ขฐ์„ฑ
    : WS-Security, WS-ReliableMessaging ๋“ฑ ๋‹ค์–‘ํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ํŠธ๋žœ์žญ์…˜ ๋ณด์žฅ
    : SOAP ๋ฉ”์‹œ์ง€ ๋‚ด๋ถ€์—์„œ ACID ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

๐Ÿ‘ SOAP์˜ ์žฅ์ 

  • ๊ฐ•๋ ฅํ•œ ํ‘œ์ค€ํ™”
    ๋ณด์•ˆ(WS-Security), ํŠธ๋žœ์žญ์…˜, ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ
  • ๊ธฐ์—… ํ™˜๊ฒฝ์— ์ ํ•ฉ
    ๊ธˆ์œต, ๊ณต๊ณต, ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ์•ˆ์ •์„ฑ ์ค‘์‹œ
  • ๋ช…ํ™•ํ•œ ๊ณ„์•ฝ(WSDL)
    ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—„๊ฒฉํ•ด ํ˜‘์—…์— ์œ ๋ฆฌ

๐Ÿ‘Ž SOAP์˜ ํ•œ๊ณ„

โŒ XML ๊ธฐ๋ฐ˜์ด๋ผ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฌด๊ฒ๊ณ  ๋ณต์žก
โŒ ๊ตฌํ˜„๊ณผ ๋””๋ฒ„๊น… ๋‚œ์ด๋„๊ฐ€ ๋†’์Œ
โŒ ์›น ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €, ๋ชจ๋ฐ”์ผ)์— ๋ถ€์ ํ•ฉ
โŒ ๋‹จ์ˆœํ•œ CRUD ์ž‘์—…์—๋„ ๊ณผํ•œ ์„ค๊ณ„

๐Ÿ‘‰ โ€œ์•ˆ์ •์ ์ด์ง€๋งŒ ๋„ˆ๋ฌด ๋ฌด๊ฒ๋‹คโ€๋Š” ํ‰๊ฐ€๋ฅผ ๋ฐ›๊ฒŒ ๋จ

๐Ÿ’ป RESTful API์˜ ๋ถ€์ƒ

๐Ÿง REST๋ž€?

REST(Representational State Transfer)๋Š” 2000๋…„์— Roy Fielding์ด ์ •์˜ํ•œ ์›น ์„œ๋น„์Šค ๊ตฌ์กฐ์˜ ์ด๋ฆ„์œผ๋กœ, ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋กœ ๋„์›€์„ ์ฃผ๋Š” API ์Šคํ‚ฌ์„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ์‹œ์Šคํ…œ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋จ

๐Ÿ‘‰ REST๋Š” ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹ˆ๋ผ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ

๐Ÿ’ REST์˜ ๊ธฐ๋ณธ ์กฐ๊ฑด

  • Client-Server ๊ตฌ์กฐ
    : UI๊ฐ€ ๋ฐ”๋กœ ๋ณ€๊ฒฝ ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , ๊ทœ์น™์  ๋ถ„๋ฆฌ
  • Stateless(๋ฌด์ƒํ™”)
    : ๊ฐ ํ˜ธ์ถœ์€ ๋ฐ˜๋ณต๋˜๋Š” ์ •๋ณด์™€ ๋ฌธ๋งฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ
  • Cacheable
    : ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • Layered System
    : ๊ฐ ๊ณ„์ธต์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ณ„์ธต์ด๋ผ๋„ ์•Œ ํ•„์š”๊ฐ€ ์—†์Œ
  • Uniform Interface
    : URI, HTTP method๋ฅผ ๊ฐ€์ง€๊ณ  ํ•œ๊ฐ€์ง€ ํด๋ฆญ์„ ํ†ต์œผ๋กœ ๊ฐ„๋‹จํžˆ ๊ฑด๋„ˆ์ฃผ๊ฒŒ ํ•œ๋‹ค

๐Ÿง SOAP -> REST๋กœ ์ „ํ™˜๋œ ์ด์œ 

๐Ÿ‘‰ ์›น, ๋ชจ๋ฐ”์ผ ์‹œ๋Œ€์—๋Š” REST๊ฐ€ ํ›จ์”ฌ ํšจ์œจ์ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ์›น API๊ฐ€ REST ๊ธฐ๋ฐ˜์œผ๋กœ ์ „ํ™˜๋˜์—ˆ์Œ

๐Ÿ’ REST์˜ ์žฅ๋‹จ์ 

๐Ÿ‘ REST์˜ ์žฅ์ 

  • ๊ฐ€๋ณ๊ณ  ์ง๊ด€์ ์ธ ๊ตฌ์กฐ
  • ๋น ๋ฅธ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜
  • ํ”„๋ก ํŠธ์—”๋“œ/๋ชจ๋ฐ”์ผ๊ณผ ๊ถํ•ฉ์ด ์ข‹์Œ
  • HTTP ์บ์‹œ ํ™œ์šฉ ๊ฐ€๋Šฅ

๐Ÿ‘Ž REST์˜ ๋‹จ์ 

  • ๊ณต์‹ ํ‘œ์ค€์ด ์—†์–ด ์„ค๊ณ„ ํ’ˆ์งˆ ํŽธ์ฐจ ๋ฐœ์ƒ
  • ๋ณด์•ˆ/ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘ ์„ค๊ณ„ํ•ด์•ผ ํ•จ
  • ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ํ‘œํ˜„์—๋Š” ํ•œ๊ณ„

๐Ÿ“Œ @RestController

๐Ÿง RestController?

@Restcontroller = @Controller + @ResponseBody
Spring MVC์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” @Controller๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด HTML View ํ…œํ”Œ๋ฆฟ์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ. But REST API ๊ฐœ๋ฐœ์—์„œ๋Š” JSON, XML, ํŒŒ์ผ ๋“ฑ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ @RestController ์‚ฌ์šฉ

@RestController
public class HelloRestController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, JSON!"; // View๊ฐ€ ์•„๋‹Œ HTTP ๋ณธ๋ฌธ์— ๊ทธ๋Œ€๋กœ ์‘๋‹ต๋จ
    }
}
  • @RestController๋Š” ํด๋ž˜์Šค ๋‹จ์œ„์— ์ ์šฉ๋˜๋ฉฐ, ๋‚ด๋ถ€ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” @ResponseBody ํšจ๊ณผ๋ฅผ ๊ฐ€์ง
  • ViewResolver๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  HttpMessageConverter๋ฅผ ํ†ตํ•ด ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ์ง๋ ฌํ™”๋จ
  • ๊ธฐ๋ณธ ์ถœ๋ ฅ ํ˜•์‹์€ application/json์ด๋ฉฐ, Accept ํ—ค๋”๋กœ ๋ช…์‹œ ๊ฐ€๋Šฅ

๐Ÿ’ป @RestController ๋™์ž‘ ๊ณผ์ •

1๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ -> DispatcherServlet (Front Controller)

  1. ํด๋ผ์ด์–ธํŠธ HTTP ์š”์ฒญ์„ ๋ณด๋ƒ„
POST /api/users
Content-Type: application/json
  1. ์š”์ฒญ์€ Spring MVC์˜ ์ง„์ž…์ ์ธ DispatcerServlet์ด ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•จ

2๏ธโƒฃ HandlerMapping - ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •

  1. DispatcherServlet์€ HandlerMapping๋“ค์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•จ
  • URL
  • HTTP Method(GET, POST ๋“ฑ)
  • @ResquestMapping, @GetMapping ๋“ฑ์˜ ์ •๋ณด
  1. ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์Œ
@PostMapping("/api/users")
public UserResponse create(@RequestBody UserRequest request)

3๏ธโƒฃ HandlerAdapter - ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ค€๋น„

  1. ์ฐพ์€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , HandlerAdapter๊ฐ€ ์‹คํ–‰์„ ๋‹ด๋‹นํ•จ
    ๐Ÿ‘‰ ์Šคํ”„๋ง์€ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ค‘๊ฐ„ ์–ด๋Œ‘ํ„ฐ ๊ณ„์ธต์„ ๋‘ 

4๏ธโƒฃ HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ (์š”์ฒญ ๋ฐ”์ธ๋”ฉ ์‹œ์ )

  1. ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ง์ „, HTTP ์š”์ฒญ ๋ฐ”๋”” -> ์ž๋ฐ” ๊ฐ์ฒด ๋ณ€ํ™˜์ด ํ•„์š”ํ•จ
public UserResponse create(
	@RequestBody UserRequest request
)
  1. ์—ฌ๊ธฐ์„œ HTTP Message Converter๊ฐ€ ์ž‘๋™ํ•จ

๐Ÿ“Œ ์—ญํ• 

  • HTTP Body(JSON, XML ๋“ฑ)๋ฅผ Java ๊ฐ์ฒด๋กœ ์ „ํ™˜
  • @RequestBody, @ResponseBody ์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ

๐Ÿ“Œ ๋™์ž‘ ๊ณผ์ •

  • Content-Type ํ™•์ธ (์˜ˆ: application/json)
  • ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปจ๋ฒ„ํ„ฐ ์„ ํƒ (MappingJackson2HttpMessageConverter)
  • JSON -> UserRequest ๊ฐ์ฒด๋กœ ์—ญ์ง๋ ฌํ™”

JSON

{
  "name": "kim",
  "age": 25
}

Java

new UserRequest("kim", 25)

5๏ธโƒฃ Controller ๋ฉ”์„œ๋“œ ์‹คํ–‰

  1. ๋ณ€ํ™˜๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰
UserResponse response = userService.create(request);
  1. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰ (Service -> Repository)

6๏ธโƒฃ HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ (์‘๋‹ต ๋ณ€ํ™˜ ์‹œ์ )

  1. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

  2. @RestController์˜ ์˜๋ฏธ
    @Controller + @ResponseBody
    ๋ฐ˜ํ™˜๊ฐ’์„ View๊ฐ€ ์•„๋‹ˆ๋ผ HTTP Body๋กœ ์ฒ˜๋ฆฌ

  3. ๋‹ค์‹œ HTTP Message Converter๊ฐ€ ๋™์ž‘
    Java ๊ฐ์ฒด -> HTTP Response Body

๐Ÿ“Œ ๋™์ž‘ ๊ณผ์ •

  • Accept ํ—ค๋” ํ™•์ธ (์˜ˆ: application/json)
  • ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ปจ๋ฒ„ํ„ฐ ์„ ํƒ
  • UserResponse -> JSON ์ง๋ ฌํ™”

7๏ธโƒฃ DispatcherServlet -> ํด๋ผ์ด์–ธํŠธ ์‘๋‹ต ๋ฐ˜ํ™˜

  1. DispatcherServlet ์ด
  • HTTP Status
  • Headers
  • Body

๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ์ƒ์„ฑ

  1. ์ตœ์ข…์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ HTTP ์‘๋‹ต ๋ฐ˜ํ™˜

๐Ÿš€ ์ •๋ฆฌ

Spring Boot์—์„œ @RestController ์š”์ฒญ์€ DispatcherServlet์„ ์ค‘์‹ฌ์œผ๋กœ HandlerMapping๊ณผ HandlerAdapter๋ฅผ ๊ฑฐ์ณ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „์—๋Š” ์š”์ฒญ ๋ฐ”๋””๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ํ˜ธ์ถœ ํ›„์—๋Š” ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋ฅผ HTTP ์‘๋‹ต ๋ฐ”๋””๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•จ

profile
์ฒœ๋ฐฉ์ง€์ถ•์–ด๋ฆฌ๋‘ฅ์ ˆ๋น™๊ธ€๋น™๊ธ€๋Œ์•„๊ฐ€๋Š”๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€