์น ๊ฐ๋ฐ์ ์์ํ๋ฉด์ ๊ฐ์ฅ ๋จผ์ ์ดํดํด์ผ ํ ๊ฐ๋
์ค ํ๋๋ ๋ฐ๋ก HTTP์ REST API์
๋๋ค.
์ฒ์ ์ ํ๋ฉด ํท๊ฐ๋ฆด ์ ์์ง๋ง, ์ด ๊ธ์ ํตํด ๊ธฐ์ด๋ถํฐ ํ์คํ ์ ๋ฆฌํด๋ด
์๋ค!
HTTP (Hypertext Transfer Protocol) ๋
์น์์ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ํต์ ๊ท์น(ํ๋กํ ์ฝ)์
๋๋ค.
์ฝ๊ฒ ๋งํด, ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ "์ด๊ฑฐ ์ฃผ์ธ์!" ํ๊ณ ์์ฒญ(Request)์ ๋ณด๋ด๋ฉด,
์๋ฒ๊ฐ "์ฌ๊ธฐ ์์ด์!" ํ๊ณ ์๋ต(Response)ํด์ฃผ๋ ๊ตฌ์กฐ์ ๋๋ค.
URL (Uniform Resource Locator) ์ ์ธํฐ๋ท ์์ ์์์ ์ฃผ์์ ๋๋ค.
์:
https://www.example.com/user/1
URL ์ค๊ณ์ ์์น์ด ์๋ค.
api/v1/movies๋ก ํน์ ID๋ฅผ ๊ฐ์ง ์ํ๋ /api/v1/movies/ ๋ค์ ID๋ฅผ ๋ถ์ฌ ๊ตฌ๋ถํ๋ค./api/**v1**/movies). ์ด๋ ํฅํ API ๋ณ๊ฒฝ ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋๋ค./api/v1/movies: ๋ชจ๋ ์ํ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค./api/v1/movies/{id}: ํน์ ID์ ์ํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.REST (Representational State Transfer) ๋
HTTP ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ์์์ CRUD(Create, Read, Update, Delete) ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณํ ์ํคํ
์ฒ ์คํ์ผ์
๋๋ค.
์์ ์ค์ฌ ์ฌ๊ณ (Resource-centric thinking): REST API ์ค๊ณ์ ํต์ฌ์ "๋ฌด์"์ ๋ค๋ฃฐ ๊ฒ์ธ์ง, ์ฆ ์์(Resource)์ ์ง์คํ๋ ๊ฒ์ด๋ค. ๋์ฌ๋ณด๋ค๋ ๋ช ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋ํ๋ด๊ณ , ์ด ์์์ ๋ํ CRUD์ ์์ ์ HTTP ๋ฉ์๋๋ฅผ ํตํด ์ํํ๋ค.
/user/1๐ ์ด๋ฐ REST ์์น์ ์ ์ง์ผ์ ๋ง๋ API๋ฅผ RESTful API๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
| ๋ฉ์๋ | ์ฉ๋ | ์์ |
|---|---|---|
GET | ์์ ์กฐํ | GET /user/1 |
POST | ์์ ์์ฑ | POST /userBody: { "name": "John" } |
PUT | ์์ ์์ (์ ์ฒด ๋ฎ์ด์ฐ๊ธฐ) | PUT /user/1Body: { "name": "Jane" } |
DELETE | ์์ ์ญ์ | DELETE /user/1 |
์๋ฒ๋ ์๋ตํ ๋ ๊ฒฐ๊ณผ ์ํ๋ฅผ ์ซ์๋ก ์๋ ค์ค๋๋ค. ์ด๊ฒ ๋ฐ๋ก HTTP ์ํ ์ฝ๋์ ๋๋ค.
| ์ฝ๋ ๋ฒ์ | ์๋ฏธ |
|---|---|
1xx | ์ ๋ณด (์ฒ๋ฆฌ ์ค) |
2xx | ์ฑ๊ณต (์์ฒญ ์ฒ๋ฆฌ ์๋ฃ) |
3xx | ๋ฆฌ๋ค์ด๋ ์ (๋ค๋ฅธ ์์น๋ก ์ด๋ ํ์) |
4xx | ํด๋ผ์ด์ธํธ ์ค๋ฅ (์๋ชป๋ ์์ฒญ) |
5xx | ์๋ฒ ์ค๋ฅ (์๋ฒ ์ฒ๋ฆฌ ์คํจ) |
200 OK: ์ ์ ์ฒ๋ฆฌ201 Created: ์์ ์์ฑ ์ฑ๊ณต400 Bad Request: ์๋ชป๋ ์์ฒญ401 Unauthorized: ์ธ์ฆ ํ์404 Not Found: ํด๋น ์์ ์์500 Internal Server Error: ์๋ฒ ๋ด๋ถ ์๋ฌ๐ ์ถ์ฒ ๊ฐ์
๋๊ผฌ ์ ์๋์ 5๋ถ REST API ์ค๊ณ ๊ฐ์
โ๏ธ "ํ ๋ฒ์ฏค ์น ์๋ฒ ๊ฐ๋ฐ์ ํด๋ดค์ง๋ง, ๊ธฐ์ด๋ ์ ๋๋ก ๋ชฐ๋๋ ๊ฒ ๊ฐ๋คโฆ"
์ด๋ฐ ๋ถ๋ค์ ์ํด ์ ๋ฆฌํด๋ดค์ต๋๋ค. ์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ๊ณต์ ๋ ๋ถํ๋๋ ค์ ๐