์ง๋ ํฌ์คํ ์์๋ REST ์ ๊ฐ์์ ๋ก์ด ํ๋ฉ์ด ๋งํ๋ 6๊ฐ์ง ์ ์ฝ์ฌํญ ๊ทธ๋ฆฌ๊ณ , ๋ฆฌ์ฒ๋์จ ์ฑ์๋๋ผ๋ ๊ฒ์ ๋ํด์ ์์๋ดค์ต๋๋ค.
๊ฐ๋ ์์ฃผ๋ก ์์๊ฐ๋๋ฐ์. ์ด๋ฒ์๋ ์ฝ๊ฐ(?) ์ค์ ์์ฃผ๋ก ์ด๋ค ๊ฒ๋ค์ด ์๋์ง ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
1. REST ํ API ๋์์ธ
1. ๋ฆฌ์์ค ๋ช ๋ช
- RESTํ API๋ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ๋ดค์ ๋ ์๋ฏธ๊ฐ ๋ถ๋ช ํด์ผ ํฉ๋๋ค.
- ๋ฆฌ์์ค๋ฅผ ์ด๋ค ๋ช ์ฌ๋ก ํ ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง, ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์์ผ๋ก ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ํด์ง ๋ฏธ๋ฆฌ ํ์ ์ ํด์ผ ํฉ๋๋ค. (์ค๊ณ๋ฅผ ์ ํด์ผ๊ฒ ์ฃ ..?)
2. ๋์ฌ๊ฐ ์๋ ๋ช ์ฌ๋ก
- ๋ฆฌ์์ค๋ช ์ ๋์ฌ๊ฐ ์๋๋ผ ๋ช ์ฌ๋ก ์์ํ๋ฉฐ, ๋ฆฌ์์ค๋ ๋ฆฌ์์ค๋ฅผ ํด์ผํ ์ผ์ HTTP ๋ฉ์๋๋ฅผ ํตํด ํํํฉ๋๋ค.
- ex) ์ ์ฒด ์ฌ์ฉ์๋ฅผ ์๋ฏธํ๋ ๋ช ์ฌ users ์ ์ฌ์ฉ์ ์๋ณ ID ๋ฅผ ํฉ์ณ /users/1234 ์ ๊ฐ์ด ํํ
- ๋ฆฌ์์ค๋ฅผ ์ ํ ๋ค์์ HTTP ๋ฉ์๋๋ก ํ๊ณ ์ถ์ ๊ฑธ ์ ํ๋ฉด ๋ฉ๋๋ค. (ex. ์กฐํ๋ผ๋ฉด GET, ์์ฑ์ POST)
3. ์๊ธฐ ์์ ํ์ผ๋ก
- ๋ฆฌ์์ค๋ ์์ ์ ๊ฐ์ฅ ์ ๋ํ๋ด๋ ๋ช ์ฌ๋ก ๋ช ๋ช
- URI๋ HTTP๋ฉ์๋๋ฅผ ์ฒ์ ๋ดค์ ๋ ์ด๋ ๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ํ๊ฒ ๋ค๋ ๊ฒ์ธ์ง ๋ฐ๋ก ๋์ ๋ค์ด์ค์ง ์์ผ๋ฉด REST ํ URI ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
4. ๋จ์ ์๋ ๋ณต์ํ์ผ๋ก
- ๋ฆฌ์์ค๋ช ์ ๋ฐ์ดํฐ ์งํฉ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋ณต์ํ์ผ๋ก ํ๊ธฐํด์ผ ํฉ๋๋ค. (ex. ์ ์ ๋ค = users)
- ๋ณต์ํ ๋ช ์ฌ๋ ์๋น์ค์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๊ณ ID๋ ๊ทธ๋ฐ ๋ฐ์ดํฐ ์ค์ ํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํด (ex. users/1234)
5. HTTP ๋ฉ์๋
- HTTP1.1 ๋ช ์ธ์๋ 8๊ฐ์ HTTP ๋ฉ์๋๊ฐ ์กด์ฌํ์ง๋ง, ์์ฃผ ์ฐ์ด๋ ๊ฒ์ GET, POST, PUT, DELETE
5-1. GET
- ์กฐํํ๋ ๋ฉ์๋๋ก ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํฉ๋๋ค. (100๋ฒ์ ํธ์ถํด๋ 100๋ฒ ๊ฐ์ ๊ฒฐ๊ณผ)
- ์์ฒญ ์ฑ๊ณต ์ 200 (OK) ์๋ต ์ฝ๋๋ฅผ ๋ณด๋ด๋ฉฐ, ์์ผ๋ฉด 404 (not found), ํ์์ด ์๋ชป๋๋ฉด 400 (bad request) ์ ๋๋ค.
- GET users/1234/posts ์ URI ๋ 1234 ์ฌ์ฉ์์ ๋ชจ๋ ํฌ์คํธ๋ฅผ ์กฐํํ๋ URI ์ ๋๋ค.
5-2. POST
- ์ฃผ์ด์ง ์ปจํ ์คํธ์์ ๋ฆฌ์์ค๋ฅผ ์๋ก ๋ง๋๋ ๋ฉ์๋์ ๋๋ค.
- ์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ๋ค ์ปจํ ์คํธ์ ๋ฌถ๊ณ ID ๋ฅผ ํ ๋นํฉ๋๋ค.
- ์๋ก ์ถ๊ฐํ ์ ๋ณด๋ฅผ ๋ณธ๋ฌธ์ ๋ฃ๊ณ ์์ฒญ์ ํ๋ฉด ๋ฉ๋๋ค. (ex. POST users/1234/posts)
5-3. PUT
- ์๋ ค์ง ๋ฆฌ์์ค๋ฅผ ์์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์์ฒญ ๋ณธ๋ฌธ์ ๋ฆฌ์์ค์ ์์ ํ ๋ฒ์ ์ด ์๊ณ , HTTP ์๋ต์ฝ๋ 200 ์ ๋ฐํํฉ๋๋ค.(ex. PUT users/1234)
- ์์ ํ ๋ด์ฉ๋ง ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ ์์ ํ ๋ด์ฉ์ ํฌํจํ ๋ฆฌ์์ค ํํํ์ ํต์งธ๋ก ๋ณด๋ ๋๋ค.
5-4. DELETE
- ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. (ex. DELETE /users/1234)
- ์ญ์ ๊ฐ ์ฑ๊ณตํ๋ฉด 200 ์ ์ญ์ ํ ๋ฆฌ์์ค๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด 400์ ๋ฐํํฉ๋๋ค.
2. REST ์์
์ฌ์ฉ์(users) ๋ฆฌ์์ค์ ํ๋ก์(follows) ๋ํด์ REST ์ ํํ ๋ฐฉ๋ฒ์ ๋ณด๊ฒ ์ต๋๋ค.
-
์ฌ์ฉ์๋ฅผ ์๋ก ๋ฑ๋ก
POST /users
-
์ฌ์ฉ์ ์กฐํ
GET /users/1234
GET /users (๋ชจ๋ ์ฌ์ฉ์ ์กฐํ)
-
์ฌ์ฉ์ ์ ๋ณด ์์
PUT /users/1234
-
์ฌ์ฉ์ ์ญ์
DELETE /users/1234
DELETE /users (๋ชจ๋ ์ฌ์ฉ์ ์ญ์ )
-
1234 ์ฌ์ฉ์์ ์ ์ฒด ํ๋ก์ ์กฐํ
GET /users/1234/followers
-
1234 ์ฌ์ฉ์์ ํ๋ก์๋ก ๋ฑ๋ก
POST /users/1234/followers
-
1234 ์ฌ์ฉ์๋ฅผ ํ๋ก์ํ 4567 ์ ์ ๋ณด
GET /users/1234/followers/4567
OR
GET /users/4567
-
4567์ด 1234์ ํ๋ก์ ํด์
DELETE /users/1234/followers/4566
3. HATEOAS
HATEOAS ๋ ๋ฆฌ์ฒ๋์จ ์ฑ์๋ ๋ชจ๋ธ ์ค ๊ฐ์ฅ ๋์ ๋จ๊ณ์ REST ๊ตฌํ์ฒด์ ๋๋ค.
์์๋ก GET /posts ๋ผ๋ URI ๋ฅผ ํตํด ์์ ์ด ๋ณผ ์ ์๋ ๊ฒ์๋ฌผ์ ๋ํ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ค๋ผ๊ณ ํด๋ณด๊ฒ ์ต๋๋ค.
|
|
์ด๋ฐ ํํ๊ฐ ๋์ต๋๋ค.
๊ฐ๊ฐ ์ค๋ช ์ ํด๋ณด๋ฉด, ๊ฒ์๋ฌผ์ 1๊ฐ๋ฅผ ๋ณผ ์ ์์ผ๋ฉฐ, ์์ด๋, ํ์ดํ, ๋ด์ฉ์ด ์์ต๋๋ค.
์ฌ๊ธฐ๊น์ง๋ง ๋ณด๋ฉด ์ผ๋ฐ ์๋ต๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์๋ฐ์. ์ฌ๊ธฐ์ links
๊ฐ ์ฃผ๋ชฉํ ๋งํ ์์๋ผ๊ณ ํ ์ ์์ต๋๋ค.
links ๋ฅผ ๋ณด๋ฉด 3๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. rel
๊ณผ href
๋ ํ์ฌ์ ๋ฆฌ์์ค์ ์ฐ๊ฒฐ๋๋ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, method
๋ ํด๋น ๋ฆฌ์์ค๋ฅผ ์ป์ผ๋ ค๊ณ ํ ๋ ์ฌ์ฉํ HTTP ๋ฉ์๋ ์
๋๋ค.
์์์๋ self ๋ ๋ณธ์ธ, replies ๋ ํด๋น ๊ธ์ ๋๊ธ๋ค, recommends ๋ ์ถ์ฒํ ์ฌ๋๋ค, owner ๋ ์์ฑ์ ๋ผ๊ณ ํ ์ ์์ต๋๋ค. rel ์ ๋ํด์๋ ํน๋ณํ ์ ํด์ง ๊ท์ฝ์ ์์ด์, ๋ช ํํ ์์๋ณผ ์๋ง ์์ผ๋ฉด ๋ฉ๋๋ค.
์ด๋ฐ ์์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ ๋ฆฌ์์ค๋ ๋ณผ ์ ์๋๋ก ๊ด๋ จ ๋งํฌ ์ ๋ณด๋ฅผ ํจ๊ป ์ฃผ๋ฉด ํ๋ค์ด์ง ์๊ณ API ๋ฅผ ํ์ฅํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ค๋ฅธ ๊ณณ๋ ์๊ฒ ์ง๋ง, ์ ๊ฐ ์ฐพ์ ๊ณณ์์๋ PayPal ์์ HATEOAS ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ์ ํ๊ณ , ๋งํฌ๋ฅผ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
4. ์ ๋ฆฌ
์ด๋ฒ์๋ ์ง์ ์ค๊ณ๋ฅผ ํ ๋๋ฅผ ์ค์ ์ผ๋ก ์์๋ฅผ ๋ค์ด๋ดค๋๋ฐ, ์ ๋นํ ์งํค๋ฉด์๋ ์ ์งํค๋ ๋ฏํ? ๊ทธ๋ฐ ๋๋์ ๋ฐ๋ ์์ฆ์ ๋๋ค.
์ข ๋ ์ข์? ๋ช ์พํ? ๋ฆฌ์์ค ๋ช ์ ์ฐพ์๊ฐ๋ฉด์ ๋ง๋ค์ด์ผ ๊ฒ ์ต๋๋ค.
HATEOAS ์ ๊ฒฝ์ฐ์๋ ๋ค์ด๋ณธ ์ ์ ์์ง๋ง, ์ค์ ๋ก ๋ณธ ์ ์ ์๋ค์. ํด๋ผ์ด์ธํธ ์ ์ฅ์์๋ ํธํ ๊ฒ ๊ฐ์ ๋ณด์ด์ง๋ง, ์๋ฒ ์ ์ฅ์์๋ ๊ต์ฅํ ๊ท์ฐฎ์ ๊ฒ ๊ฐ๊ณ , ์ด์ฐจํผ API ๋ฌธ์๋ ์๋ก ๊ณต์ ํด์ผ ํ ํ ๋ฐ…? ๋ผ๋ ์๊ฐ์ด ๋ญ๋๋ค๋ง ์ต์ํด์ง๋ฉด ์ ์ถํ๊ธฐ ํธํ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ๋๋ค์.
Reference