ํฌ์ŠคํŠธ

REST ๊ทธ๋ฆฌ๊ณ  RESTful API

REST ๊ทธ๋ฆฌ๊ณ  RESTful API

๐Ÿ’ก API(Application Programming Interface)๋ž€?

API๋Š” ํ”ํžˆ โ€˜ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šคโ€™ ๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ โ€œ์˜ค๋Š˜ ๋‚ ์”จ ๋ฐ์ดํ„ฐโ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ดค๋‹ค.

๊ทธ๋Ÿฌ๋ฉด API๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ •๋ฆฌํ•œ ๋’ค, โ€˜๋‚ ์”จ ๋ฐ์ดํ„ฐ์„œ๋ฒ„โ€™์—

โ€œ์˜ค๋Š˜ ๋‚ ์”จ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฃผ์„ธ์š”โ€๋ผ๊ณ  ์š”์ฒญ์„ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ

์š”์ฒญ์„ ํ–ˆ๋˜ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‚ ์”จ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ API๋Š”

ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์— ์žˆ๋Š” ์ค‘๊ฐ„ ์ „๋‹ฌ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ดํ•ดํ–ˆ๋‹ค.



๐Ÿ’ก API Server๋ž€?

API ์„œ๋ฒ„๋Š” โ€œ๊ทœ๊ฒฉํ™” ๋˜์–ด ์žˆ๋Š” ์„œ๋ฒ„โ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.




๐Ÿ’ก REST (REpresentational State Transfer)

REST๋Š” Application ๊ฐœ๋ฐœ์˜ ์•„ํ‚คํ…์ณ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ํ•œ๊ตญ์–ด๋กœ ์ง์—ญ์„ ํ•ด๋ณด๋ฉด

โ€˜๋Œ€ํ‘œ ์ƒํƒœ ์ „์†กโ€™ ์ด๋‹ค. ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋„ˆ๋ฌด ์ถ”์ƒ์ ์ด๋ผ ๊ฒ€์ƒ‰ํ•ด ๋ณธ ๊ฒฐ๊ณผ,

Application์„ ์„ค๊ณ„, ์ œ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด๊ณผ ๊ธฐ์ˆ ์˜ ์ด์นญ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋˜ํ•œ ํ”„๋กœํ† ์ฝœ์— ๋…๋ฆฝ์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ REST๊ตฌํ˜„์—์„œ HTTP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


REST์˜ ๊ฐœ๋…์„ ์ข€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์•˜๋‹ค.

๏ผ‘. Web Application ์ƒ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ๊ณ ์œ ์˜ URI์„ ๋ถ€์—ฌํ•œ๋‹ค.

๏ผ’. HTTP method๋ฅผ ์ด์šฉํ•ด ๋ฆฌ์†Œ์Šค์— CRUD ๋ช…๋ น์„ ์ ์šฉํ•œ๋‹ค.

์ฆ‰, ์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด CRUD์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด URI(URL)๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.


RESTful API๋Š” REST์˜ ๊ธฐ์ค€์„ ๋”ฐ๋ฅด๋Š” API์ •๋„๋กœ ์ดํ•ดํ–ˆ๋‹ค.


์ถ”๊ฐ€์ ์œผ๋กœ URI์™€ URL์— ๋Œ€ํ•œ ์ฐจ์ด๋ฅผ ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ,

URL์€ Uniform Resource Locator๋กœ ์ธํ„ฐ๋„ท ์ƒ ์ž์›์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ž์›์˜ ์œ„์น˜๋ผ๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ์–ด๋–ค ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋ฐ˜๋ฉด์— URI๋Š” Uniform Resource Identifier๋กœ ์ธํ„ฐ๋„ท ์ƒ์˜ ์ž์›์„

์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด์˜ ๊ตฌ์„ฑ์œผ๋กœ, URI๋Š” URL์„ ํฌํ•จํ•œ๋‹ค.



๐Ÿ”Ž REST์˜ ๊ตฌ์„ฑ์š”์†Œ

REST์˜ ๊ตฌ์„ฑ ์š”์†Œ ๋‹ค์Œ 3๊ฐ€์ง€์˜ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๏ผ‘. ์ž์›(Resource)

  • ์ž์›์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ โ€˜๊ฐœ์ฒด/์„œ๋น„์Šคโ€™ ์ด๋‹ค.

    ๋ชจ๋“  ์ž์›์€ ๊ณ ์œ ์˜ URI(URL)์„ ๊ฐ€์ง€๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด URI๋ฅผ ์ง€์ •ํ•˜์—ฌ

    ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•ด CRUD ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    (ex: https://adventure-works.com/orders/1)

โ€‹

๏ผ’. ํ–‰์œ„(Verb)

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

โ€‹

๏ผ“. ํ‘œํ˜„(Representation)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP Method๋กœ ์ž์›์„ ์กฐ์ž‘ํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต(JSON, XML)์„

    ๋ณด๋‚ด๋Š”๋ฐ ๊ทธ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.(์š”์ฆ˜์€ XML์„ ์ž˜ ์‚ฌ์šฉ์•ˆํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.)



๐Ÿ”Ž REST์˜ ํŠน์ง•

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

  • ์„œ๋ฒ„๋Š” API ์ œ๊ณต, ํด๋ผ์ด์–ธํŠธ๋Š” ์œ ์ €์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ „๋‹ดํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—

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

โ€‹

๏ผ’. ๋ฌด์ƒํƒœ์„ฑ(Stateless)

  • HTTP๋ฅผ ์ด์šฉํ•˜๋Š” ๋งŒํผ Stateless์˜ ํŠน์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

    ๊ฐ๊ฐ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋ณ„๊ฐœ์˜ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    ๋•๋ถ„์— ๊ตฌํ˜„์ด ์‰ฝ๊ณ  ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ๋œ์–ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    (ex. ๊ฒ€์ƒ‰์ฐฝ์— ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ํ˜•์‹์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์˜จ๋ผ์ธ ๊ฒ€์ƒ‰)


  • Stateless์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…์€ ์Šคํ…Œ์ดํŠธํ’€(Stateful)์ด๋‹ค.

    Stateful์ƒํƒœ์˜ ์›น์˜ ๊ฒฝ์šฐ ์ค‘๊ฐ„์ค‘๊ฐ„ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์ด

    ์ค‘๋‹จ๋˜๋”๋ผ๋„ ์ค‘๋‹จ ๋œ ๊ณณ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. โ€‹

๏ผ“. ์บ์‹œ ๊ฐ€๋Šฅ(Cacheable)

  • HTTP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์˜ ๊ธฐ๋ณธ ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ

    ์บ์‹œ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๊ฐ™์€ URI์— ๋Œ€ํ•œ ๋ฐ˜๋ณต๋œ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€‹

๏ผ”. ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค(Uniform Interface)

  • HTTP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ํ”Œ๋žซํผ์— ์ƒ๊ด€์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ

    ๋ฆฌ์†Œ์Šค์˜ ํƒ€์ž…์— ์ƒ๊ด€ ์—†์ด ๊ฐ™์€ ํ˜•ํƒœ์˜ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.


์•„๋ž˜๋Š” Uniform Interface์˜ 4๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด์ด๋‹ค,

๏ผ‘. Identification of resources(๋ฆฌ์†Œ์Šค๊ฐ€ URI๋กœ ์‹๋ณ„๋˜์–ด์•ผ ํ•œ๋‹ค.)

๏ผ’. Manipulation of resources through representations (CRUD ๋ช…๋ น์‹œ ๋ฉ”์„ธ์ง€์— ๋ช…์‹œ)

๏ผ“. Self-descriptive messages

๏ผ”. Hypermedia as the engine of application state(HATEOAS)


๋Œ€๋ถ€๋ถ„์˜ REST API๋Š” 3๋ฒˆ, 4๋ฒˆ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ž˜ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ ์ด์œ ์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด์•˜๋‹ค.

Self-descriptive messages๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ์Šค์Šค๋กœ ์„ค๋ช…์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ์™ผ์ชฝ ๊ทธ๋ฆผ์€ ๋ชฉ์ ์ง€๊ฐ€ ์—†์–ด์„œ RESTํ•˜์ง€ ์•Š์•˜๋‹ค.

๋‹ค์Œ ๊ทธ๋ฆผ์—์„œ ์™ผ์ชฝ ๊ทธ๋ฆผ์€ Content-Type์ด ๋งž์ง€ ์•Š์•„์„œ REST ํ•˜์ง€ ์•Š๋‹ค.


HATEOAS๋Š” ํ•˜์ดํผ๋งํฌ๋ฅผ ํ†ตํ•œ ์ „์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ์™œ Uniform Interface๊ฐ€ ํ•„์š”ํ• ๊นŒ? ๋ฐ”๋กœ ๋…๋ฆฝ์ ์ธ ์ง„ํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•œ ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด API๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ์‚ญ์ œ๋  ๊ฒฝ์šฐ ์„œ๋ฒ„์˜

๊ธฐ๋Šฅ์ด ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋ผ์ด์–ธํŠธ๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€์—†๋‹ค.

์ด๊ฒŒ ๋ฐ”๋กœ REST๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ ๊ณ„๊ธฐ ์ด๋‹ค.

๊ฒฐ๊ตญ ๋…๋ฆฝ์ ์ธ ์ง„ํ™”๊ฐ€ ๋กœ์ด ํ•„๋”ฉ์ด REST๋ฅผ ๋งŒ๋“  ๊ถ๊ทน์ ์ธ ์ด์œ ์ด๋‹ค.


REST๊ฐ€ ์›น์˜ ๋…๋ฆฝ์  ์ง„ํ™”์— ๋„์›€์„ ์ฃผ์—ˆ๋Š”๊ฐ€? YES

  1. HTTP์— ์ง€์†์ ์œผ๋กœ ์—ฌํ–ฅ์„ ์คŒ

  2. Host ํ—ค๋” ์ถ”๊ฐ€

  3. ๊ธธ์ด ์ œํ•œ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…์‹œ

  4. URI์—์„œ ๋ฆฌ์†Œ์Šค์˜ ์ •์˜๊ฐ€ ์ถ”์ƒ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋จ โ‡จ ์‹๋ณ„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€

โ€‹

๏ผ•. ์ž์ฒด์ ์ธ ํ‘œํ˜„ ๊ตฌ์กฐ(Self-Descriptiveness)

  • JSON, XML๋“ฑ์„ ์ด์šฉํ•˜๋Š” ๋ฉ”์„ธ์ง€ ๊ตฌ์กฐ๋กœ ํ•ด๋‹น ๋ฉ”์„ธ์ง€๊ฐ€ ๋ฌด์—‡์„,

    ์–ด๋–ค ํ–‰์œ„๋ฅผ ์˜๋ฏธํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Jsonํ˜•์‹์€ ์ธ๊ฐ„๊ณผ ๊ธฐ๊ณ„๊ฐ€ ๋ชจ๋‘ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.

โ€‹

๏ผ–. ๊ณ„์ธต ๊ตฌ์กฐ(Layered System)

  • ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ค‘๊ฐ„ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜

    ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ํ†ต์‹  ์‚ฌ์ด์— ๋ณด์•ˆ์ด๋‚˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋“ฑ์„

    ์œ„ํ•œ ์ค‘๊ฐ„ ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์—ฌ๊ธฐ์„œ โ€˜๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑโ€™์ด๋ž€ ๋„คํŠธ์›Œํฌ ๋˜๋Š” ์„œ๋ฒ„์— ๊ฐ€ํ•ด์ง€๋Š” ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.



๐Ÿ”Ž REST์˜ ์žฅ์ 

๏ผ‘. ๋ณ„๋„์˜ ์ธํ”„๋ผ ๊ตฌ์ถ• ํ•„์š”x

  • HTTP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

โ€‹

๏ผ’. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ๋ถ„๋ฆฌ

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” REST API๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—

    ๋‘˜ ๊ฐ„์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

โ€‹

๏ผ“. ํ”Œ๋žซํผ์— ๋…๋ฆฝ์ 

  • HTTP๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ํ”Œ๋žซํผ์— ์ƒ๊ด€์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โ€‹

๏ผ”. ์‰ฌ์šด ์‚ฌ์šฉ

  • ๋ฉ”์„ธ์ง€๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.


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

๏ผ‘. ํ‘œ์ค€์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ

  • ๋ช…ํ™•ํ•œ ํ‘œ์ค€์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ REST์˜ ํŠน์ง•์„ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉด์„œ

    REST API๋กœ ์„ค๊ณ„๋˜๋Š” ์ด์ƒํ•œ API๊ฐ€ ํƒ„์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

โ€‹

๏ผ’. HTTP Method์˜ ํ•œ๊ณ„

  • HTTP Method๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— CRUD๋ผ๋Š” ๋‹จ์ˆœํ•œ ํ–‰์œ„์˜ Method๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

๏ผ“. RDBMS์™€ ๋งž์ง€ ์•Š์Œ

  • REST์—์„œ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ JSON, XML๋“ฑ์˜ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ด๋Š” RDBMS์™€๋Š” ๋งž์ง€ ์•Š๋Š”

    ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ NoSQL์ชฝ์ด ๋” ์„ ํ˜ธ๋˜๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค.



๐Ÿ’ก HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๋ณธ ์ž‘์—… ์ •์˜

๏ผ‘. GET

1
โ†ฆ ๋ฆฌ์†Œ์Šค ํ‘œํ˜„, ์‘๋‹ต ๋ณธ๋ฌธ์— ๋ฆฌ์†Œ์Šค์˜ ์„ธ๋ถ€ ์ •๋ณด

๏ผ’. POST

1
2
3
โ†ฆ ์ƒˆ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์š”์ฒญ. ์š”์ฒญ ๋ณธ๋ฌธ์— ์ƒˆ ๋ฆฌ์†Œ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณต

โ†ฆ ๋ฉฑ๋“ฑ์„ฑ ๋ฏธ๋ณด์žฅ

๏ผ“. PUT

1
2
3
โ†ฆ ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋ถ€ ๋Œ€์ฒด. ์š”์ฒญ ๋ณธ๋ฌธ์— ๊ฐฑ์‹ ํ•  ๋ฆฌ์†Œ์Šค ์ •๋ณด๋ฅผ ์ œ๊ณต.

โ†ฆ ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ

๏ผ”. PATCH

1
2
3
โ†ฆ ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ€๋ถ„ ๋Œ€์ฒด. ์š”์ฒญ ๋ณธ๋ฌธ์— ๊ฐฑ์‹ ํ•  ๋ฆฌ์†Œ๋ฅด ์ •๋ณด๋ฅผ ์ œ๊ณต

โ†ฆ ๋ฉฑ๋“ฑ์„ฑ ๋ฏธ๋ณด์žฅ

๏ผ•. DELETE

1
โ†ฆ ์ง€์ • ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ.


๋ฉฑ๋“ฑ์„ฑ์ด ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๊ตฌ๊ธ€๋ง์„ ํ–ˆ๋‹ค.

๋™์ผํ•œ ์š”์ฒญ์„ ํ•œ ๋ฒˆ ๋ณด๋‚ด๋Š” ๊ฒƒ๊ณผ ์—ฌ๋Ÿฌ ๋ฒˆ ์—ฐ์†์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์ง€๋‹ˆ๊ณ ,

์„œ๋ฒ„์˜ ์ƒํƒœ๋„ ๋™์ผํ•˜๊ฒŒ ๋‚จ์„ ๋•Œ, ํ•ด๋‹น HTTP ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์กŒ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

GET, HEAD, PUT, DELETE ๋ฉ”์„œ๋“œ๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, POST ๋ฉ”์„œ๋“œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, DELETE๊ฐ€ ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์€, REST API์—์„œ ๊ฐœ๋ฐœ์ž๋Š” DELETE๋ฉ”์„œ๋“œ๋ฅผ

์‚ฌ์šฉํ•ด โ€œ๋ชฉ๋ก์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์ œ๊ฑฐโ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.



๐Ÿ’ก REST API๋ž€?

REST API๋ž€ REST์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” API๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€์ผœ์•ผํ•˜๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค.

๏ผ‘. URI๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ, ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผํ•œ๋‹ค.

๏ผ’. ๋งˆ์ง€๋ง‰์— โ€œ / โ€œ ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

๏ผ“. ์–ธ๋”๋ฐ”(_) ๋Œ€์‹  ํ•˜์ดํฐ(-)์„ ์‚ฌ์šฉํ•œ๋‹ค.

๏ผ”. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

๏ผ•. ํ–‰์œ„๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

1
2
3
โ†ฆ http://example.com/delete-post/1 (X)

โ†ฆ http://example.com/post/1 (O)


๐Ÿ”Ž ์™œ ์ž˜ ์•ˆ๋ ๊นŒ?

ํ˜„์žฌ REST API๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋Œ€๋ถ€๋ถ„์€ REST API๊ฐ€ ์•„๋‹ˆ๋‹ค!. ์™œ์ผ๊นŒ?

ํ”ํ•œ ์›นํŽ˜์ด์ง€์˜ โ€˜๋ฏธ๋””์–ด ํƒ€์ž…โ€™์€ HTML์ด๋‹ค. ๋ฐ˜๋ฉด์— HTTP API๋Š” JSON์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋‘˜์˜ ํฐ ์ฐจ์ด์ ์€ HTML์€ ๊ธฐ๊ณ„๊ฐ€ ์ดํ•ด๋ฅผ ํ•  ์ˆ˜ ์—†๋Š” ์–ธ์–ด์ด๋‹ค.

HTML์€ ํ•˜์ดํผ๋งํฌ๊ฐ€ ์žˆ๊ณ , Self-descriptive๊ฐ€ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ JSON์€ ํ•˜์ดํผ๋งํฌ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ณ , Self-descriptive๊ฐ€ ๋ถˆ์™„์ „ํ•˜๋‹ค.


๐Ÿ”Ž REST API๋กœ ๊ณ ์ณ๋ณด๊ธฐ

Self-descriptive ๋ฐฉ๋ฒ•1. Media type

Media type์„ ์ƒˆ๋กœํ•˜๋‚˜ ์ •์˜ํ•˜๊ณ  Media type๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

ํ•ด๋‹น ๋ฌธ์„œ์— โ€œidโ€๊ฐ€ ๋ญ”์ง€ ์˜๋ฏธ๋ฅผ ์ •ํ•œ๋‹ค. IANA์— Media type์„ ๋“ฑ๋กํ•œ๋‹ค.

์„ฑ๊ณต์ ์ด์ง€๋งŒ ๋งค๋ฒˆ Media type์„ ์ •ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.


Self-descriptive ๋ฐฉ๋ฒ•2. Profile

๋ฉ”์„ธ์ง€์— Link: <https://example.com/test/>; rel="profile"๋ผ๊ณ  ์ž‘์„ฑํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์œ„ ๋งํฌ๋ฅผ ์ดํ•ด ๋ชปํ• ์ˆ˜๋„ ์žˆ๋‹ค.


HATEOAS๋Š” ๋ฐฉ๋ฒ•1. Data

๋ณธ๋ฌธ์—๋‹ค๊ฐ€ ๊ทธ๋ƒฅ ๋งํฌ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ JSON์œผ๋กœ ํ•˜์ดํผ๋งํฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„

์ •์˜ํ•œ ๊ฒƒ๋“ค์„ ํ™œ์šฉํ•œ๋‹ค.


HATEOAS๋Š” ๋ฐฉ๋ฒ•2. HTTP ํ—ค๋”

Link, Locations ๋“ฑ์˜ ํ—ค๋”๋กœ ๋งํฌ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.



๐Ÿ’ก RESTful์ด๋ž€?

RESTful์ด๋ž€ REST์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•˜์ง€๋งŒ REST๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ „๋ถ€ RESTful ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ํ•œ๋‹ค.

์ฆ‰, REST API์˜ ์„ค๊ณ„ ๊ทœ์น™์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€ํ‚จ ์‹œ์Šคํ…œ์„ RESTfulํ•˜๋‹ค ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.


๋ฐ˜๋ฉด REST API๋ฅผ ์‚ฌ์šฉํ•˜์˜€์ง€๋งŒ RESTful ํ•˜์ง€ ๋ชปํ•œ ์‹œ์Šคํ…œ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๏ผ‘. ๋ชจ๋“  CRUD ๊ธฐ๋Šฅ์„ POST๋กœ ์ฒ˜๋ฆฌ ํ•˜๋Š” API

๏ผ’. URI ๊ทœ์น™์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€ํ‚ค์ง€ ์•Š์€ API

๏ผ“. REST API์˜ ์„ค๊ณ„ ๊ทœ์น™์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€ํ‚ค์ง€ ๋ชปํ•œ ์‹œ์Šคํ…œ




๐Ÿ“š References


์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.