README

# RESTful API

REST๋ž€ ?

REST๋ž€ REpresentational State Transfer์˜ ์•ฝ์ž์ด๋‹ค.

REST๋Š” Resource Oriented Architecture ์ฆ‰, HTTP๊ธฐ๋ฐ˜์œผ๋กœ ํ•„์š”ํ•œ ์ž์›์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ์ •ํ•ด๋†“์€ ์•„ํ‚คํ…์ณ์ด๋‹ค. API ์„ค๊ณ„์˜ ์ค‘์‹ฌ์— ์ž์›(Resource)์ด ์žˆ๊ณ  HTTP Method๋ฅผ ํ†ตํ•ด ์ž์›์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์›น์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ž์›(์ด๋ฏธ์ง€, ๋™์˜์ƒ, DB์ž์›)์— ๊ณ ์œ ํ•œ URI๋ฅผ ๋ถ€์—ฌํ•ด ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž์›์„ ์ •์˜ ํ•˜๊ณ  ์ž์›์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์—ฌ๊ธฐ์— ~ful ์ด๋ผ๋Š” ํ˜•์šฉ์‚ฌํ˜• ์–ด๋ฏธ๋ฅผ ๋ถ™์—ฌ ~ํ•œ API ๋ผ๋Š” ํ‘œํ˜„์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰ REST์˜ ๊ธฐ๋ณธ ์›์น™์„ ์„ฑ์‹คํžˆ ์ง€ํ‚จ ์„œ๋น„์Šค ๋””์ž์ธ์€ RESTfulํ•˜๋‹ค ๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

REST ๊ตฌ์„ฑ

  • ์ž์› (Resource) - URI

  • ํ–‰์œ„ (Verb) - HTTP Method

  • ํ‘œํ˜„ (Representations)

REST์˜ ํŠน์ง•

  1. Uniform(์œ ๋‹ˆํผ ์ธํ„ฐํŽ˜์ด์Šค)

    HTTP ํ‘œ์ค€์—๋งŒ ๋”ฐ๋ฅธ๋‹ค๋ฉด, ์•ˆ๋“œ๋กœ์ด๋“œ/IOS ํ”Œ๋žซํผ์ด๋“ , ํŠน์ • ์–ธ์–ด๋‚˜ ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ํ”Œ๋žซํผ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, URI๋กœ ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์„ ์˜๋ฏธํ•œ๋‹ค.

  2. Stateless(๋ฌด์ƒํƒœ์„ฑ)

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

  3. Casheable(์บ์‹œ๊ฐ€๋Šฅ)

    REST์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” HTTP๋ผ๋Š” ๊ธฐ์กด ์›น ํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP ๊ฐ€ ๊ฐ€์ง„ ์บ์‹ฑ ๊ธฐ๋Šฅ์ด ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. HTTP ํ”„๋กœํ† ์ฝœ ํ‘œ์ค€์—์„œ ์‚ฌ์šฉํ•˜๋Š” Last-Modifiedํƒœ๊ทธ๋‚˜ E-Tag๋ฅผ ์ด์šฉํ•˜๋ฉด ์บ์‹ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  4. Self-descriptivness (์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ)

    ๋™์‚ฌ(Method) + ๋ช…์‚ฌ(URI) ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ์–ด๋–ค ๋ฉ”์„œ๋“œ์— ๋ฌด์Šจ ํ–‰์œ„๋ฅผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ”์‹œ์ง€ ํฌ๋งท ์—ญ์‹œ JSON์„ ์ด์šฉํ•ด์„œ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ, REST API ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ ๋„ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  5. Client - Server ๊ตฌ์กฐ

    REST ์„œ๋ฒ„๋Š” API ์ œ๊ณต, ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ ์ปจํ…์ŠคํŠธ(์„ธ์…˜, ๋กœ๊ทธ์ธ ์ •๋ณด)๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ํ™•์‹คํžˆ ๊ตฌ๋ถ„๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ๋‚ด์šฉ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ  ์„œ๋กœ๊ฐ„ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  6. ๊ณ„์ธตํ˜• ๊ตฌ์กฐ

    REST ์„œ๋ฒ„๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณด์•ˆ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•ด ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ๋‘˜ ์ˆ˜ ์žˆ๊ณ  PROXY, ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ HTTP ๋ฉ”์†Œ๋“œ 4๊ฐ€์ง€

  • GET : ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒ

  • POST : ํ•ด๋‹น URL๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ

  • PUT : ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •

  • DELETE ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œ

URI ์„ค๊ณ„ ์‹œ ์ฃผ์˜ํ• ์ 

  1. ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž(/)๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ

  2. URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

     http://restapi.example.com/houses/apartments/ (X)
     http://restapi.example.com/houses/apartments  (0)
  3. ํ•˜์ดํ”ˆ(-)์€ URI์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉ

  4. ๋ฐ‘์ค„(_)์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  5. URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.

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

    http://restapi.example.com/members/soccer/345/photo.jpg (X)

References

Last updated

Was this helpful?