Skip to content

Latest commit

ย 

History

History
224 lines (142 loc) ยท 12.3 KB

REST.md

File metadata and controls

224 lines (142 loc) ยท 12.3 KB

REST

REST

REST API


REST(Representational State Transfer)

์ž์›์„ ์ด๋ฆ„(์ž์›์˜ ํ‘œํ˜„)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. -> ์ž์›(resource)์˜ ํ‘œํ˜„(representation) ์— ์˜ํ•œ ์ƒํƒœ ์ „๋‹ฌ

REST(Representational State Transfer)๋Š” ์›”๋“œ ์™€์ด๋“œ ์›น(www)๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ ํ˜•์‹.

  • HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ์žฅ์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ์ด๋‹ค.

  • REST๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ Client์™€ Server ์‚ฌ์ด์˜ ํ†ต์‹  ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.


๊ตฌ์„ฑ์š”์†Œ

์ž์›, ์กฐ์ž‘, ํ‘œํ˜„

์ž์›(Resource)

  • ์„œ๋ฒ„์— ์žˆ๋Š” ๊ฒƒ. DB ์•ˆ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋˜๋Š” ์ด๋ฏธ์ง€ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ex) ์œ ์ €, ์ฃผ๋ฌธ, ์ด๋ฏธ์ง€์ฃผ์†Œ ๋“ฑ

  • URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์กฐ์ž‘(Verb; ํ–‰์œ„)

  • ํด๋ผ์ด์–ธํŠธ๋Š” HTTP Method๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง€์ •ํ•œ ์ž์›์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ์š”์ฒญํ•œ๋‹ค.

ํ‘œํ˜„(Representation of Resource)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์ž์›์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

  • REST์—์„œ ํ•˜๋‚˜์˜ ์ž์›์€ JSON, XML ๋“ฑ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ Representation์œผ๋กœ ๋‚˜ํƒ€๋‚ด์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.


REST ํŠน์ง•

  1. Server-Client(์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ)

    • REST Server: API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅ์„ ์ฑ…์ž„์ง„๋‹ค.
    • Client: ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ context(์„ธ์…˜, ๋กœ๊ทธ์ธ ์ •๋ณด) ๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ณ  ์ฑ…์ž„์ง„๋‹ค.
    • ์„œ๋กœ ๊ฐ„ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ ๋‹ค.
  2. Stateless(๋ฌด์ƒํƒœ)

    • Client์˜ context๋ฅผ Server์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. -> ์„ธ์…˜๊ณผ ์ฟ ํ‚ค์™€ ๊ฐ™์€ context ์ •๋ณด๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด์ง„๋‹ค.
    • Server๋Š” ๊ฐ๊ฐ์˜ ์š”์ฒญ์„ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค. -> ๊ฐ API ์„œ๋ฒ„๋Š” Client์˜ ์š”์ฒญ๋งŒ์„ ๋‹จ์ˆœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด์ „ ์š”์ฒญ์ด ๋‹ค์Œ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ์— ์—ฐ๊ด€๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
  3. Cacheable(์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)

    • ์บ์‹œ ์‚ฌ์šฉ์„ ํ†ตํ•ด ์‘๋‹ต์‹œ๊ฐ„์ด ๋นจ๋ผ์ง€๊ณ  REST Server ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์‘๋‹ต์‹œ๊ฐ„, ์„ฑ๋Šฅ, ์„œ๋ฒ„์˜ ์ž์› ์ด์šฉ๋ฅ ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • HTTP ํ”„๋กœํ† ์ฝœ ํ‘œ์ค€์—์„œ ์‚ฌ์šฉํ•˜๋Š” LAST-Modified ํƒœ๊ทธ๋‚˜ E-Tag๋ฅผ ์ด์šฉํ•ด ์บ์‹ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  4. Layered System(๊ณ„์ธตํ™”)

    • Client๋Š” REST API Server๋งŒ ํ˜ธ์ถœํ•œ๋‹ค.
    • REST Server๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณด์•ˆ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•ด ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ๋‘˜ ์ˆ˜ ์žˆ๊ณ  PROXY, ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋Š” ๋ฐ”๋กœ ๋๋‹จ์˜ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€, ์ค‘๊ฐ„์˜ ํ”„๋ก์‹œ๋‚˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฒน์˜ ์„œ๋ฒ„๋‚˜ ํ†ต์‹ ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ์„œ๋ฒ„๋„ ์‘๋‹ต์„ ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„  ์ฒ ์ €ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘์ ์œผ๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐ๋œ ์ชฝ๊ณผ์˜ ์—ฐ๊ฒฐ๋งŒ ์‹ ๊ฒฝ ์จ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  5. Uniform Interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)

    • HTTP ํ‘œ์ค€์—๋งŒ ๋”ฐ๋ฅธ๋‹ค๋ฉด, ์–ด๋–ค ํ”Œ๋žซํผ์ด๋“  ํŠน์ • ์–ธ์–ด๋‚˜ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ํ”Œ๋žซํผ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, URI๋กœ ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • URI๋กœ ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ Http Method๋ฅผ ํ†ตํ•ด์„œ ํ‘œํ˜„ํ•˜๊ณ  ๊ตฌ๋ถ„ํ•œ๋‹ค.
    • Self-Descriptiveness(์ž์ฒดํ‘œํ˜„ ๊ตฌ์กฐ)
      • REST API ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ ๋„ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค.
    • HATEOAS(Hypermedia As The Engine Of Application State)
      • ๋งํฌ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ URL์„ ๋ฆฌ์†Œ์Šค๋กœ ์ „๋‹ฌํ•˜์—ฌ client๊ฐ€ ์ฐธ๊ณ ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ
      • RESTful API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์ ์œผ๋กœ ์„œ๋ฒ„์— ์˜ํ•ด ๋™์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์‹œ ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ์˜์กด๋˜๋Š” URI๋ฅผ Response์— ํฌํ•จ์‹œ์ผœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • ๋™์ ์ธ API๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.(๋ชจ๋“  ๊ด€๋ จ๋œ ๋™์ž‘์„ URI๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์ค๋‹ˆ๋‹ค.) ์ฆ‰, ํด๋ผ์ด์–ธํŠธ๊ฐ€ API์˜ ๋ณ€ํ™”์— ์ผ์ผ์ด ๋Œ€์‘ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
      • Hypermedia (๋งํฌ)๋ฅผ ํ†ตํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ์ „์ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. (Hypermedia (๋งํฌ)์— ์ž๊ธฐ ์ž์‹ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์•ผ ํ•œ๋‹ค.)
      • ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ํŠน์ • ๋ฉ”์†Œ๋“œ๋กœ๋ถ€ํ„ฐ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ ๋™์ž‘์— ๋Œ€ํ•ด ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ , API๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ‚ค๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ URI๋กœ ์ฃผ์–ด์ง„ ๋งํฌ(link)๋งŒ ์œ ์ง€ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋ณ„๋„์˜ ๋Œ€์‘์ด ์š”๊ตฌ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
  6. Code-On-Demand

    • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • Client์— ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์„œ ์ด๊ฒƒ์„ Client์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
    • optional

์žฅ์ 

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ REST API ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ํ‘œ์ค€์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ถ”๊ฐ€์ ์ธ ์žฅ์ ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

  • HTTP ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • REST API ๋ฉ”์‹œ์ง€๊ฐ€ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค.

๋‹จ์ 

  • ํ‘œ์ค€์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. -> ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค.

  • HTTP Method ํ˜•ํƒœ๊ฐ€ ์ œํ•œ์ ์ด๋‹ค. -> ๋‹จ์ˆœํžˆ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์„ธ๋ถ€ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์ œ์•ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•  ์ผ์ด ๋งŽ์€ ์„œ๋น„์Šค๋ผ๋ฉด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” URL๋ณด๋‹ค Header ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ ์ „๋ฌธ์„ฑ์ด ์š”๊ตฌ๋œ๋‹ค.


REST๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ„๋ฆฌ ๋ฐ ํ†ตํ•ฉ
    • ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋“ˆ, ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์กŒ๋‹ค. RESTful API๋ฅผ ์„œ๋น„์Šคํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์–ด๋–ค ๋‹ค๋ฅธ ๋ชจ๋“ˆ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด๋ผ๋„ RESTful API๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ๊ฐ„์— ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ๋“ฑ์žฅ
    • ์›น ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ HTML ๋ฐ ์ด๋ฏธ์ง€๋“ฑ์„ ๋ณด๋‚ด๋˜ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ์ด์ œ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋‚ด๋ฉด ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ html๊ฐ™์€ ํŒŒ์ผ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋ฌด๊ฒ๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“  ์•ฑ์— ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๋งž์ง€ ์•Š์•˜๋Š”๋ฐ RESTful API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์œ ๋กญ๊ณ  ๋ถ€๋‹ด์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„๋„ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊น”๋”ํ•˜๊ฒŒ ๋ณด๋‚ด์ฃผ๋ฉด๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ฒผ์›Œ์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ๋„ ์ข‹์•„์กŒ๋‹ค.

REST API

  • REST API์˜ ์ •์˜

    • REST ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค API๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ
  • REST API์˜ ํŠน์ง•

    • ์‚ฌ๋‚ด ์‹œ์Šคํ…œ๋“ค๋„ REST ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์Šคํ…œ์„ ๋ถ„์‚ฐํ•ด ํ™•์žฅ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ์šด์šฉ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • REST๋Š” HTTP ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ, HTTP๋ฅผ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋กœ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฆ‰, REST API๋ฅผ ์ œ์ž‘ํ•˜๋ฉด ๋ธํŒŒ์ด ํด๋ผ์ด์–ธํŠธ ๋ฟ ์•„๋‹ˆ๋ผ, ์ž๋ฐ”, C#, ์›น ๋“ฑ์„ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • REST API ์„ค๊ณ„ ๊ธฐ๋ณธ ๊ทœ์น™

    1. URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
      • resource๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
      • resource๋Š” ์˜์–ด ์†Œ๋ฌธ์ž ๋ณต์ˆ˜ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.
      • Ex) GET /Member/1 -> GET /members/1
    2. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method(GET, PUT, POST, DELETE ๋“ฑ)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
      • URI์— HTTP Method๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.
      • Ex) GET /members/delete/1 -> DELETE /members/1
      • URI์— ํ–‰์œ„์— ๋Œ€ํ•œ ๋™์‚ฌ ํ‘œํ˜„์ด ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.
      • Ex) GET /members/show/1 -> GET /members/1
      • Ex) GET /members/insert/2 -> POST /members/2
  • REST API ์„ค๊ณ„ ๊ทœ์น™

    1. ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž(/ )๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
      • Ex) http://restapi.example.com/houses/apartments
    2. URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ(/ )๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • URI์— ํฌํ•จ๋˜๋Š” ๋ชจ๋“  ๊ธ€์ž๋Š” ๋ฆฌ์†Œ์Šค์˜ ์œ ์ผํ•œ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ URI๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์—ญ์œผ๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค๋ฅด๋ฉด URI๋„ ๋‹ฌ๋ผ์ ธ์•ผ ํ•œ๋‹ค.
      • REST API๋Š” ๋ถ„๋ช…ํ•œ URI๋ฅผ ๋งŒ๋“ค์–ด ํ†ต์‹ ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™์„ ์ฃผ์ง€ ์•Š๋„๋ก URI ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰์—๋Š” ์Šฌ๋ž˜์‹œ(/)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • Ex) http://restapi.example.com/houses/apartments/ (X)
    3. ํ•˜์ดํ”ˆ(- )์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉ
      • ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๊ธด URI๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.
    4. ๋ฐ‘์ค„(_ )์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • ๋ฐ‘์ค„์€ ๋ณด๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋ฐ‘์ค„ ๋•Œ๋ฌธ์— ๋ฌธ์ž๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ๋„ ํ•˜๋ฏ€๋กœ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ฐ‘์ค„์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    5. URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.
      • URI ๊ฒฝ๋กœ์— ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ์€ ํ”ผํ•˜๋„๋ก ํ•œ๋‹ค.
      • RFC 3986(URI ๋ฌธ๋ฒ• ํ˜•์‹)์€ URI ์Šคํ‚ค๋งˆ์™€ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜๋„๋ก ๊ทœ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ
    6. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • REST API์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ๋‚ด์šฉ์˜ ํฌ๋งท์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ URI ์•ˆ์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
      • Accept header๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
      • Ex) http://restapi.example.com/members/soccer/345/photo.jpg (X)
      • Ex) GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg (O)
    7. ๋ฆฌ์†Œ์Šค ๊ฐ„์—๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
      • /๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ์†Œ์Šค ID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช…
      • Ex) GET : /users/{userid}/devices (์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ์œ  โ€˜hasโ€™์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ)
    8. :id๋Š” ํ•˜๋‚˜์˜ ํŠน์ • resource๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณ ์œ ๊ฐ’
      • Ex) student๋ฅผ ์ƒ์„ฑํ•˜๋Š” route: POST /students
      • Ex) id=12์ธ student๋ฅผ ์‚ญ์ œํ•˜๋Š” route: DELETE /students/12
  • RESTful

    • RESTful์˜ ๊ฐœ๋…
      • RESTful์€ ์ผ๋ฐ˜์ ์œผ๋กœ REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์ด๋‹ค.
        • ์ฆ‰, REST ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์€ RESTful์ด๋ž€ ์šฉ์–ด๋กœ ์ง€์นญ๋œ๋‹ค.
      • RESTful์€ REST๋ฅผ REST๋‹ต๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
    • RESTful์˜ ๋ชฉ์ 
      • ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด REST API๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ
      • RESTful API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด ํผํฌ๋จผ์Šค ํ–ฅ์ƒ์— ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์ผ๊ด€์ ์ธ ์ปจ๋ฒค์…˜์„ ํ†ตํ•œ API์˜ ์ดํ•ด๋„ ๋ฐ ํ˜ธํ™˜์„ฑ์„ ๋†’์ด๋Š”๊ฒŒ ์ฃผ ๋™๊ธฐ์ด๋‹ˆ, ํผํฌ๋จผ์Šค๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๊ตณ์ด RESTful API๋ฅผ ๊ตฌํ˜„ํ•˜์‹ค ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
    • RESTful ํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ
      • Ex1) CRUD ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ POST๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” API
      • Ex2) route์— resource, id ์™ธ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ(/students/updateName)

๐Ÿ“š ์ฐธ๊ณ 

REST 1

REST 2

REST 3

REST API

REST ํŠน์ง•

HATEOAS

REST 4

REST 5



Summary



โ‰๏ธ ๋ฉด์ ‘ ์˜ˆ์ƒ ์งˆ๋ฌธ

  1. REST์˜ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  1. REST๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.
  1. RESTfulํ•˜๊ฒŒ API๋ฅผ ๋””์ž์ธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.