REST API

Web์— ๊ด€๋ จ๋œ ์ž๋ฃŒ๋ฅผ ๋ณด๊ฒŒ ๋˜๊ฑฐ๋‚˜ ํ˜น์€ API๋ฅผ ๋ณด๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ๋ณด์ด๋Š” ๋‹จ์–ด๊ฐ€ REST๋ž€ ๋‹จ์–ด์˜€๋‹ค. ํ•˜์ง€๋งŒ REST๋ž€ ๋‹จ์–ด๋งŒ ์•Œ๊ณ ๋งŒ ์žˆ์„ ๋ฟ ์ž์„ธํ•œ ์˜๋ฏธ๋Š” ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— RESTful API์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

RESTful์ด๋ž€?

  • REST๋Š” Representational State Transfer๋ผ๋Š” ์šฉ์–ด์˜ ์•ฝ์ž๋กœ์„œ ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜
  • ์ตœ๊ทผ์˜ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์™€ ์•ˆ๋“œ๋กœ์ดํฐ, ์•„์ดํฐ๊ณผ ๊ฐ™์€ ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค์—์„œ๋„ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • REST ์•„ํ‚คํ…์ฒ˜๋Š” Hypermedia API์˜ ๊ธฐ๋ณธ์„ ์ถฉ์‹คํžˆ ์ง€ํ‚ค๋ฉด์„œ ๋ฒ”์šฉ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

REST์˜ ํŠน์ง•

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

  • Uniform Interface๋Š” URI๋กœ ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผ๋˜๊ณ  ํ•œ์ •์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ

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

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

3. Cacheable (์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)

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

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

  • REST์˜ ๋˜ ๋‹ค๋ฅธ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” REST API ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ ๋„ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ

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

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

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

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

REST ๊ตฌ์„ฑ

  • ์ž์›(Resource) - URI
  • ํ–‰์œ„(Verb) - HTTP Method (GET, PUT, POST, DELETE๋“ฑ๋“ฑ)
  • ํ‘œํ˜„(Representations)

REST API ๋””์ž์ธ ๊ฐ€์ด๋“œ

  • URI๋Š” Resource๋ฅผ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  • Resource์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method (GET, PUT, POST, DELETE๋“ฑ๋“ฑ)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

1. REST API ์ค‘์‹ฌ ๊ทœ์น™

1.1 URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

GET /course/insert/inform -- X
GET /course/inform -- O
  • HTTP Method (GET, PUT, POST, DELETE๋“ฑ๋“ฑ)์˜ ํ–‰์œ„๊ฐ€ URI ํ‘œํ˜„์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ๋œ๋‹ค.

1.2 ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method (GET, PUT, POST, DELETE๋“ฑ๋“ฑ)๋กœ ํ‘œํ˜„

DELETE /members/1
  • HTTP Method(GET, PUT, POST, DELETE๋“ฑ๋“ฑ)๋กœ ํ–‰์œ„๋กœ CRUD๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋‚ด์šฉ

CRUD : ์†Œํ”„ํŠธ์›จ์–ด(Software)๊ฐ€ ๊ฐ€์ง€๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๋ฌถ์–ด์„œ ์ผ์ปซ๋Š” ๋ง

  • ์ƒ์„ฑ(Create)
  • ์ฝ๊ธฐ(Read)
  • ๊ฐฑ์‹ (Update)
  • ์‚ญ์ œ(Delete)

์ด๋ฆ„ | ์กฐ์ž‘ | SQL --------------- | ---------------- Create | ์ƒ์„ฑ | INSERT Read(๋˜๋Š” Retrieve) | ์ฝ๊ธฐ(๋˜๋Š” ์ธ์ถœ) | SELECT Update | ๊ฐฑ์‹  | UPDATE Delete(๋˜๋Š” Destroy) | ์‚ญ์ œ(๋˜๋Š” ํŒŒ๊ดด) | DELETE

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

2.1 ์†Œ๋ฌธ์ž๋ฅผ ๋˜๋„๋ก์ด๋ฉด ์‚ฌ์šฉํ•˜์ž

  • ์˜ˆ๋ฅผ ๋“ค์–ด test.com์˜ ์ž์›(Resource) Test์™€ test๊ฐ€ ์žˆ์ง€๋งŒ ๋Œ€์†Œ๋ฌธ์ž์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ž์›(Resource)์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค.

  • RFC 3986(URI ๋ฌธ๋ฒ• ํ˜•์‹)์€ URI ์Šคํ‚ค๋งˆ์™€ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜๋„๋ก ๊ทœ์ •ํ•˜๊ณ  ์žˆ๋‹ค.

http://test.com/Test -- ์„œ๋กœ ๋‹ค๋ฅธ Resource : Test
http://test.com/test -- ์„œ๋กœ ๋‹ค๋ฅธ Resource : test

2.2 ํ•˜์ดํ”ˆ(-)์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉํ•˜์ž

  • ๊ฒฝ๋กœ(Path)์— ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ %20์ด ๋“ค์–ด๊ฐ€ ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง„๋‹ค.

  • ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„์–ด์“ฐ๊ธฐ๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

2.3 ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž

  • REST API์—์„œ๋Š” ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ž์›(Resource)์„ ๋‹ค๋ฃจ๋Š” ๋ฐ ๋” ์œ ์—ฐํ•ด ์ง„๋‹ค.
  • ํ™•์žฅ์ž ๋Œ€์‹ ์— Accept Header๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.
http://test.com/test.jpg -- X
http://test.com/test -- O
GET /test HTTP/1.1
Host: test.com
Accept: image/jpg

3. ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” Collection๊ณผ Document

  • ๋„ํ๋จผํŠธ(Document)๋Š” ๋‹จ์ˆœํ•œ ๋ฌธ์„œ์™€ ๊ฐ™์€ ์กด์žฌ
  • ์ปฌ๋ ‰์…˜(Collection) ๋ฌธ์„œ๋“ค์˜ ์ง‘ํ•ฉ, ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ๊ฐ™์€ ์กด์žฌ
http://test.com/citys/seoul/gangnam
  • ์œ„์— ์˜ˆ์ œ ์ค‘ citys๊ฐ€ ์ปฌ๋ ‰์…˜(Collection)์— ํ•ด๋‹น๋˜๋ฉฐ ๋ณต์ˆ˜๋กœ ํ‘œํ˜„์„ ํ•˜๊ณ  ์žˆ๋Š” ์ ์ด ์ค‘์š”ํ•˜๋‹ค.

4. HTTP ์‘๋‹ต ์ฝ”๋“œ

4.1 ์„ฑ๊ณต(Success)

์ƒํƒœ์ฝ”๋“œ๋‚ด์šฉ
200์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰
201์ž์›(Resource) ์ƒ์„ฑ ์š”์ฒญ. ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋จ

4.2 ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ(Client Error)

์ƒํƒœ์ฝ”๋“œ๋‚ด์šฉ
400ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ๋ถ€์ ์ ˆํ•  ๊ฒฝ์šฐ ์‘๋‹ต ์ฝ”๋“œ
401ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ถŒํ•œ์ด ์—†๋Š” ์ž์›(Resource)๋ฅผ ์š”์ฒญํ•˜์˜€์„ ๋•Œ ์‘๋‹ต ์ฝ”๋“œ
403๋ณดํ˜ธ๋˜๋Š” ์ž์›(Resource)๋ฅผ ์š”์ฒญํ•˜์˜€์„ ๋•Œ ์‘๋‹ต ์ฝ”๋“œ
405ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ Method๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ ์‘๋‹ต ์ฝ”๋“œ

4.3 ๊ธฐํƒ€

์ƒํƒœ์ฝ”๋“œ๋‚ด์šฉ
301ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ URI๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ ์‘๋‹ต ์ฝ”๋“œ
500์„œ๋ฒ„์— ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‘๋‹ต ์ฝ”๋“œ

๊ทธ๋Ÿฐ REST API๋กœ ๊ดœ์ฐฎ์€๊ฐ€? - EungJun Yi๋‹˜

Reference