REST API์ REST๋ Representational State Transfer์ ์ฝ์๋ก API ์๋ ๋ฐฉ์์ ๋ํ ์กฐ๊ฑด์ ๋ถ๊ณผํ๋ ์ํํธ์จ์ด ์ํคํ ์ฒ๋ค. REST ์ํคํ ์ฒ ์คํ์ผ์ ์์น์ ๋ค์๊ณผ ๊ฐ๋ค.
REST API๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฅ์ฑ, ์ ์ฐ์ฑ, ๋ ๋ฆฝ์ฑ ์๋ ํต์ ์ด ๊ฐ๋ฅํด์ง๋ค.
RESTfulํ ์ค๊ณ๋ฅผ ์ํด์๋ ๋ค์์ ๋ ๊ฐ์ง๋ฅผ ์ง์ผ์ค์ผ ํ๋ค.
| Method | Role |
|---|---|
| POST | ๋ฆฌ์์ค ์์ฑ(Create) |
| GET | ๋ฆฌ์์ค ์์ฒญ(Read) |
| PUT | ๋ฆฌ์์ค ์์ (Update) |
| DELETE | ๋ฆฌ์์ค ์ญ์ (Delete) |
์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ก ์๋ฒ ์ธก์์ ํด๋ผ์ด์ธํธ ์ธก์ผ๋ก ๋ณด๋ด๋ ์๋ต ์ํ ์ฝ๋, ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์๋ง์ ์๋ต ์ฝ๋๋ฅผ ๋ณด๋ธ๋ค.
| ์ํ์ฝ๋ | ๋ด์ฉ |
|---|---|
| 200 ๐ข | ์์ฒญ์ ์ ์์ ์ผ๋ก ์ํํจ |
| 201 ๐ข | ๋ฆฌ์์ค ์์ฑ ์์ฒญ์ ์ ์์ ์ผ๋ก ์ํํจ |
| 301 ๐ | URI ๋ณ๊ฒฝ(Location header์ ๋ณ๊ฒฝ๋ URI ์ ์ด์ค์ผํจ.) |
| 400 ๐ด | ๋ถ์ ์ ํ ์์ฒญ |
| 401 ๐ด | ์ธ์ฆ๋์ง ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ |
| 403 ๐ด | ์๋ตํ๊ณ ์ถ์ง ์์ ์์ฒญ(403๋ณด๋จ 400์ด๋ 404 ์ฌ์ฉ์ ๊ถํจ) |
| 404 ๐ด | ์์ฒญํ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์ |
| 405 ๐ด | ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ Method ์ฌ์ฉ |
| 500 ๐ด | ์๋ฒ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ ์ฌ์ฉ(Runtime Exception ๋ฑ) |
์์ฒญ URI๋ ๊ฐ ๋๋ฉ์ธ๋ณ Controller์์ ์ฐพ์ ์ ์๋ค.
| Method | URI | ์ค๋ช |
|---|---|---|
| GET | / | index ํ์ด์ง ์์ฒญ |
| Method | URI | ์ค๋ช |
|---|---|---|
| GET | /owners/new | owner ์ถ๊ฐ ํ์ด์ง ์์ฒญ |
| POST | /owners/new | owner ์ถ๊ฐ ์์ฒญ |
| GET | /owners/find | owner ์ฐพ๊ธฐ ํ์ด์ง ์์ฒญ |
| GET | /owners/ | owner ๋ฆฌ์คํธ ํ์ด์ง ์์ฒญ |
| GET | /owners/{ownerId}/edit | owner ์์ ํ์ด์ง ์์ฒญ |
| POST | /owners/{ownerId}/edit | owner ์์ ์์ฒญ |
| GET | /owners/{ownerId} | owner ์์ธ์ ๋ณด ํ์ด์ง ์์ฒญ |
| Method | URI(/owners/{ownerId} + ) | ์ค๋ช |
|---|---|---|
| GET | /pets/new | pet ์ถ๊ฐ ํ์ด์ง ์์ฒญ |
| POST | /pets/new | pet ์ถ๊ฐ ์์ฒญ |
| GET | /pets/{petId}/edit | pet ์์ ํ์ด์ง ์์ฒญ |
| POST | /pets/{petId}/edit | pet ์์ ์์ฒญ |
| Method | URI | ์ค๋ช |
|---|---|---|
| GET | /owners/{ownerId}/pets/{petId}/visits/new | visit ์ถ๊ฐ ํ์ด์ง ์์ฒญ |
| POST | /owners/{ownerId}/pets/{petId}/visits/new | visit ์ถ๊ฐ ์์ฒญ |
| Method | URI | ์ค๋ช |
|---|---|---|
| GET | /vets.html | vet ๋ชฉ๋ก ์กฐํ ํ์ด์ง ์์ฒญ |
| GET | /vets | vet ๋ฆฌ์คํธ ์์ฒญ |
| Method | URI | ์ค๋ช |
|---|---|---|
| GET | /oups | ์ค๋ฅ ํ์ด์ง ์์ฒญ |
Pet Clinic์ URI ๋ถ์์ ํ๋ค ๋ณด๋ CRUD๋ฅผ ์ํด POST/GET/PUT/DELETE๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ฐ POST์ GET๋ง ์ฌ์ฉํ๊ณ PUT๊ณผ DELETE๋ ์ฌ์ฉํ์ง ์์๋ค. DELETE์ผ ๊ธฐ๋ฅ ๊ตฌํ์ ์ฐ์ด์ง ์์์ ์๋ค ์น๋๋ผ๋ ์์ ์ ์ํด PUT์ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ ์ด ์ดํด๊ฐ ๊ฐ์ง ์์ ์ฐพ์๋ดค๋ค.
PUT์ ์์์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ '์์ฑ', ์กด์ฌํ ๊ฒฝ์ฐ '์์ 'ํ๋ ๋ฐฉ์์ด๊ณ , POST๋ ์์์ '์์ฑ'์ ์ํ ๋ฐฉ์์ด๋ค. PUT๊ณผ POST์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋ฉฑ๋ฑ(idempotent)์ ์๋ค๊ณ ํ๋ค. ๋ฉฑ๋ฑ์ฑ์ ์์์ผ๋ก ํํํ์๋ฉด 'f(x) = f(f(x))'๋ค. ๋ช ๋ฒ์ ๋ฐ๋ณตํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค๋ ์๋ฏธ๋ค. PUT์ ๋ฉฑ๋ฑํ๊ณ POST๋ ๋ฉฑ๋ฑํ์ง ์๋ค. PUT์ ๋ช ๋ฒ์ ์๋ํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ง๋ง, POST๋ ์๋ํ ๋๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ ์ ์๋ค. ๋๊ฐ์ ์ธ ๋ฒ์ ์์ฒญ์ ์๋ฒ์ ์ ์กํ๋ค๊ณ ํ ๋, PUT์ ์๋ฒ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์๋ค๊ณ ํ ๋ ์ฒ์์ ์์ฑ, ๋๋จธ์ง ๋ ๋ฒ์ ์์ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ์ด๋ค. ๋ฐ๋ฉด POST๋ ์ธ ๋ฒ์ ์์ฒญ ๋ชจ๋ ์์ฑ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค.
์ด๊ฒ์ ์ด๋ก ์ ์ธ ์๊ธฐ๊ณ , ๊ทธ๋์ ์ 'PUT์ผ๋ก ๋๊ฒจ์ผ ํ ๊ฒ ๊ฐ์๋ฐ POST ๋ฐฉ์์ผ๋ก ๋๊ธฐ๋๋'์ ๋ํด ์ฐพ์๋ดค๋ค. ์์ ์ ์ํ ์์ฒญ ์ ์ก ๋ฐฉ์์ PUT, PATCH, POST ์ธ ๊ฐ์ง๋ก ๋ณผ ์ ์๋๋ฐ, PUT์ ์์ ๋ณด๋ค๋ ๊ต์ฒด(Replace)์ ๋ ๊ฐ๊น์ด ๊ฒ ๊ฐ๋ค. ๋ถ๋ถ ์์ ์ ์ํด์๋ PATCH์ POST๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฌ๋ PATCH๋ฅผ ์ฌ์ฉํ๊ธด ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์(safe ํ์ง ์๊ณ idempotent ํ์ง๋ ์์ ๋ฐฉ์, ์คํ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋ ์ ์์, E-Tag์ ๋น๋กฏํ ์ฌ๋ฌ๊ฐ์ง ๊ณ ๋ คํด์ผํจ) ์ฃผ๋ก ์์์ ๋ถ๋ถ ์์ ์ ์ํด์๋ POST๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
์ฌ๋ฌ ๊ธ์์ ์ค๋ช ํ ๋๋ POST๊ฐ ์์ฑ์ ๋ด๋นํ๋ค๊ณ ๋ ํ์ง๋ง ์ค์ ๋ก๋ ์์ฑ๊ณผ ์์ ์ ๋ชจ๋ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค. (ํน์ ํ ์ํฉ์์๋ง PUT์ ์ฌ์ฉํ๊ณ ๋ณดํต ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ์ผ๋ถ ์์ ์ ๊ฒฝ์ฐ๋ POST๋ฅผ ์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๊ฒ ๊ฐ๋ค.) Pet Clinic์์๋ ์ ์ฒด ์์ ์ด ์๋ ์ผ๋ถ๋ง ์์ ํ๊ธฐ ๋๋ฌธ์ PUT์ด ์๋ POST ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.
๊ฐ ์์ฒญ URI์ ๋ฐ๋ผ ์ ํด์ง ์ผ๋ จ์ ๋์์ ์ํํ๋ ๊ฒ ์๋ฒ์ ์ญํ ์ด๋ค. ์ด ์์ฒญ URI๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ๊ฒ์ธ์ง๊ฐ Backend์ ํต์ฌ์ด์ง ์์๊น? ์ผ๋จ ์ด๋ฒ ๊ธ์์๋ ์๋ฒ๋ก ๋ค์ด์ฌ ์ ์๋ ์์ฒญ์ ์ข ๋ฅ์ ๋ํ ๋ด์ฉ์ ๋ค๋ค๋ค. ๋ค์ ๊ธ์์๋ ๋ค์ด์จ ์ด ์์ฒญ๋ค์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง์ ๋ํด ์ปจํธ๋กค๋ฌ๋ณ๋ก ๋ค๋ฃฐ ์์ ์ด๋ค. REST API์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฐธ๊ณ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
REST API ์ค๋ช
-
https://aws.amazon.com/ko/what-is/restful-api/
https://meetup.nhncloud.com/posts/92
PUT vs POST -
https://repo.yona.io/doortts/blog/issue/12
https://www.keycdn.com/support/put-vs-post
http://1ambda.github.io/javascripts/rest-api-put-vs-post/