๋ชฉ์ฐจ
REST๋ ๋ฌด์์ธ๊ฐ?
1. REST์ ๋ชฉ์
2. REST์ ๊ตฌ์ฑ์์
3. REST์ ํน์ง
4. REST์ ์ฅ๋จ์
5. REST์ ์ค๊ณ๊ท์น/๋์์ธ ๊ฐ์ด๋
6. REST์ ์๋ต์ฝ๋
REST๋ ๋ฌด์์ธ๊ฐ?
REST๋ Representational State Transfer์ ์ฝ์๋ก, ์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ, ์์์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ข ๋ ๊ธฐ์ ์ ์ผ๋ก ํํํ์๋ฉด, ๋คํธ์ํฌ ์์์ Client์ Server์ฌ์ด์ ํต์ ๋ฐฉ์. ๋๋, HHTP ํ๋กํ ์ฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ํ๋์ ํ๋ ์์ํฌ๋ผ๊ณ ํ ์ ์๋ค.
REST๋ ์น์ ๊ธฐ์กด ๊ธฐ์ ๊ณผ HTTP ํ๋กํ ์ฝ์ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์น์ ์ฅ์ ์ ์ต๋ํ์ผ๋ก ํ์ฉ ๊ฐ๋ฅํ๋ค.
์ต๊ทผ ์๋น์ค ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ ํ๋ฆ์ด ๋ฉํฐ ํ๋ซํผ/๋๋ฐ์ด์ค ์๋๋ก ๋์ด์ ๋ค์ํ ๊ธฐ๊ธฐ์ ์ฌ๋ฌ๊ฐ์ง ์น ๋ธ๋ผ์ฐ์ ์์ ํต์ ์ ๋์ํด์ผ ํ๋ค. REST๋ ์ด์ ๋์ํ ์ ์๋ ๋ถ์ฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ ์์ ์ด์๋๋ ์ํํธ์จ์ด ์ํคํ ์ฒ ์คํ์ผ์ด๋ผ๊ณ ํ ์ ์๋ค.
- ์์ ๊ธฐ๋ฐ์ ๊ตฌ์กฐ(ROA, Resource Oriented Architecture) : ๋ชจ๋ ์์์ ๋ํ ๊ณ ์ HTTP URI์ด ์กด์ฌํจ
- HTTP URI์ ํตํ์ฌ ์์(resource) ๋ช ์. HTTP Method๋ฅผ ํตํ์ฌ ์์์ ๋ํ CRUD Operation์ ๋ช ์ํ์ฌ ์์์ ์ฒ๋ฆฌ.
- CRUD Operation๋?
CREATE POST : ๋ฆฌ์์ค ์์ฑ READ GET : ๋ฆฌ์์ค ์กฐํ UPDATE PUT/PATCH : ๋ฆฌ์์ค ๊ฐฑ์ (์์ ) DELETE DELETE : ๋ฆฌ์์ค ์ญ์ HEAD HEAD ์ ๋ณด ์กฐํ
1. REST์ ๋ชฉ์
- ๋ถ์ฐ์์คํ : ํ๋์ ์ปค๋ค๋ Application์ ๊ธฐ๋ฅ๋ณ๋ก ๋ชจ๋ํํ ์ ์๋ค.
- ๋ค์ํ Client์ ๋ํ ๋์ : ์์๋ ์ธ๊ธํ๋ค์ํผ, ์ต๊ทผ์๋ ๋ค์ํ ๋ธ๋ผ์ฐ์ ๋ฐ ๋๋ฐ์ด์ค๊ฐ ์กด์ฌํจ์ผ๋ก์จ ์๋ฒ ํ๋ก๊ทธ๋จ์ ๋ค์์ ํด๋ผ์ด์ธํธ๋ค๊ณผ ํต์ ํ ์ ์๊ฒ ๋์๋ค. ์ด๋ฌํ ๋ฉํฐ ํ๋ซํผ์ ๋ํ ์ง์์ ์ํ์ฌ Restful API๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ง ์ฃผ๊ณ ๋ฐ์ผ๋ฉด ์ฌ๋ฌ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ๋ค์ด ์์ ๋กญ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ์ ์๋ค.
2. REST์ ๊ตฌ์ฑ์์
- ์์(Resource) : URI
- ํ์(Verb) : HTTP Method
- ํํ(Representations)
๊ตฌ์ฑ์์ | ๋ด์ฉ | ํํ ๋ฐฉ๋ฒ |
์์(Resource) | ์์ | HTTP URI |
ํ์(Verb) | ์์์ ๋ํ ํ์ | HTTP Method |
ํํ(Representations) | ์์์ ๋ํ ํ์ ๋ด์ฉ | HTTP Message Pay Load |
3. REST์ ํน์ง
- Server-Client ๊ตฌ์กฐ : ํด๋ผ์ด์ธํธ, ์๋ฒ, ๋ฆฌ์์ค๋ก ๊ตฌ์ฑ๋ ์ํคํ ์ฒ. ์๋ฒ๋ API๋ง ์ ๊ณตํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธ์ฆ์ด๋ ์ปจํ ์คํธ(์ธ์ ๋ฑ)๋ฅผ ๊ด๋ฆฌํ๋ ๋ฑ ์ญํ ์ด ํ์คํ ๊ตฌ๋ถ๋๊ธฐ ๋๋ฌธ์ ์๋ก ๊ฐ์ ์์กด์ฑ์ด ์ค์ด๋ ๋ค. HTTP๋ฅผ ํตํ์ฌ Reqeust ์ฒ๋ฆฌ.
- ๋ฌด์ํ์ฑ/์คํ ์ดํธ๋ฆฌ์ค(Statelessness) : ์๋ฒ๋ ๋ฆฌํ์คํธ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ์ ํ์ํ ์ด๋ ํ ์ปจํ ์คํธ๋ ์๋ฒ์ ์ธ์ ์ ๋ด์ง ์๋๋ค. ํด๋ผ์ด์ธํธ์ ๋ํ ์ธ์ ์ ๋ณด๋ ์ฟ ํค ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์, API Server๋ ๋ค์ด์ค๋ ์์ฒญ๋ง์ ์ฒ๋ฆฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ด ๋จ์ํด์ง๋ค.
- ๊ณ์ธตํ ๊ตฌ์กฐ : API Server๊ฐ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. ํด๋ผ์ด์ธํธ๋ REST API Server๋ง์ ํธ์ถํ๋๋ฐ์ ๋ฐํ์ฌ, API Server๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑํ์ฌ ์์ํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด์ API Server ์ธ์ ์ฌ์ฉ์ ์ธ์ฆ์ด๋ ์ํธํ(SSL) ๋ฑ์ ๊ณ์ธต์ ์ถ๊ฐํ์ฌ ๊ตฌ์กฐ์์ผ๋ก ์ ์ฐ์ฑ์ ๋ ์ ์๋ค.
- ์บ์ ๊ฐ๋ฅ : REST๋ HTTP๋ผ๋ ๊ธฐ์กด ์น ํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์(๋ฐ๋์ HTTP๋ฅผ ์ด์ฉํ์ฌ์ผํ๋๊ฑด ์๋์ง๋ง, ๋๋ถ๋ถ์ REST API๋ HTTP๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์ฌ์ค์ ํ์ค์ด๋ค) ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. HTTP ํ๋กํ ์ฝ ๊ธฐ๋ฐ์ SSL์ ๋ฌผ๋ก , ์บ์ฑ ๊ธฐ๋ฅ๋ ์ ์ฉํ ์ ์๋จ ์๋ฏธ์ด๋ค. ์ผ๋ฐ์ ์ธ ์์คํ ์์ ๋๋ถ๋ถ์ ํธ๋์ญ์ ์ด ์กฐํ์ฑ์ธ๊ฒ์ ์๊ฐํ๋ฉด, HTTP์ ๋ฆฌ์์ค๋ฅผ ์บ์ฑํ๋ ๊ฒ์ ์ฑ๋ฅ ๋ฉด์์ ๋ง์ ์ฅ์ ์ ๊ฐ์ง๊ณ ์ฌ ์ ์๋ค. ์ด๋ ๊ฒ ์บ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์ ์ฒด์ ์ธ ๋คํธ์ํฌ ์๋ต์๊ฐ๊ณผ ์ฑ๋ฅ, ์๋ฒ์ ์์ ์ฌ์ฉ๋ฅ ์ ํฅ์์ํฌ ์ ์๋ค.
- ์ ๋ํผ ์ธํฐํ์ด์ค : ํน์ ์ธ์ด๋ ๊ธฐ์ ์ ์ข ์๋์ง ์์ผ๋ฉฐ HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ์์ฒด ํํ ๊ตฌ์กฐ : REST API ๋ฉ์์ง๋ง ๋ณด๊ณ ๋ ์ด๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค. JSON์ ์ด์ฉํ์ฌ ์ง๊ด์ ์ผ๋ก ์ดํด ๊ฐ๋ฅํ๋ค.
4. REST์ ์ฅ๋จ์
์ฅ์
- HTTP ํ๋กํ ์ฝ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก, REST API ์ฌ์ฉ์ ์ํ ๋ณ๋์ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ํ์๊ฐ ์๋ค.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค.
- HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋ฒ์ฉ์ฑ์ ๋ณด์ฅํ๋ค.
- ์๋ํ๋ ๋ฐ๊ฐ ๋ช ํํ๋ฏ๋ก, ์๋๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
๋จ์
- ํ์ค ๊ท์ฝ์ด ์๋ค. ์ํฐํจํด์ ํ๋จํ๋ ๊ทผ๊ฑฐ์ธ ์๋ฌต์ ์ธ ๊ท์น๋ง์ด ์กด์ฌํ๋ค. ์ด๋ ์ฑ๊ณต์ ์ธ REST API ์ฌ๋ก๋ฅผ ๊ทผ๊ฑฐ๋ก ํ๋๋ฐ, ๊ตฌ๊ธ์ด๋ ์๋ง์กด, ๋ทํ๋ฆญ์ค ๋ฑ์ ๊ธฐ์ ์ด ํ์ค ์ญํ ์ ๋ด๋นํ๊ณ ์๋ค.
- ์์ ์ธ๊ธํ๋ค์ํผ, ์ํฐํจํด์ผ๋ก ์ค๊ณ๋ ์ ์๋ค. ์ํฐํจํด์ด๋, REST API์ ํน์ง์ ์ดํดํ์ง ์๊ณ REST ๋ชฉ์ ๊ณผ ์ด๊ธ๋๊ฒ ์ค๊ณํ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์ํฐํจํด์ ์๋ก๋, Update, Delete ๊ธฐ๋ฅ์ POST๋ก ๋์ฒดํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ/HTTP Response code๋ฅผ 2-3๊ฐ๋ง ํ์ฉํ๋ ๊ฒฝ์ฐ ๋ฑ์ด ์๋ค.
- ์ฌ์ฉํ ์ ์๋ Method๊ฐ 4๊ฐ์ง ๋ฐ์ ์๋ค. HTTP Method ํํ๊ฐ ์ ํ์ ์ด๋ค.
- ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ํธํ์ด ๋์ง ์์ ์ง์์ด ์ด๋ ต๋ค.
5. REST์ ์ค๊ณ๊ท์น/๋์์ธ ๊ฐ์ด๋
REST์์ ๊ฐ์ฅ ์ค์ํ ๊ท์น ๋ ๊ฐ์ง
- URI์ ์ ๋ณด์ ์์์ ํํํ๋ค.
- HTTP Method๋ ์์์ ๋ํ ํ์๋ฅผ ํํํ๋ค.
5-1. URI์ ์ง๊ด์ ์ผ๋ก
GET /users
5-2. Resource์ ์ด๋ฆ์ ๋ณต์ ๋ช ์ฌ
GET /user (X)
GET /users (O)
5-3. URI์ ํ์๋ ํฌํจํ์ง ์๋๋ค. ์์์ ๋ํ ํ์๋ Method๋ก ํํํ๋ค.
GET์ด๋ผ๋ method๋ง์ผ๋ก ์ถฉ๋ถํ ํํ์ด ๊ฐ๋ฅํ๋ค.
GET /users/view/:id (X)
GET /users/:id (O)
5-4. ๋ง์ง๋ง์ / ๋ฅผ ํฌํจํ์ง ์๋๋ค.
GET /users/:id/ (X)
GET /users/:id (O)
5-5. ์ธ๋๋ฐ(_) ๋์ ๋์ฌ(-)๋ฅผ ์ฌ์ฉํ๋ค. ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ค.
GET /users/:id/login-log
5-6. ์๋ฌธ์ ์ฌ์ฉ
5-7. URI์ ํ์ผ ํ์ฅ์๋ฅผ ํฌํจํ์ง ์๋๋ค.
GET /users/:id/users-photos/apple.jpg (X)
GET /users/:id/users-photos/apple (O)
6. REST์ ์๋ต์ฝ๋
- 200 : ํด๋ผ์ด์ธํธ ์์ฒญ ์ ์์ํ (์๋ต์ ๋ํ ๋ฉ์์ง๊ฐ ํฌํจ)
- 201 : ๋ฆฌ์์ค ์์ฑ ์์ฒญ์ ๋ํ ์ ์์ฒ๋ฆฌ
- 202 : ๋ฆฌ์์ค ์์ฑ ์์ฒญ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ๋ ์ฌ์ฉ
- 204 : ํด๋ผ์ด์ธํธ ์์ฒญ ์ ์์ํ (์๋ต์ ๋ํ ๋ฉ์์ง ๋ฏธํฌํจ, ์ญ์ ์์ฒญ ๋ฐ์์ ์ฌ์ฉ)
- 400 : ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ถ์ ์ ํ ๋ ์ฌ์ฉ (๋ถ์ ์ ํ ์ด์ ๋ฅผ ์๋ต Body์ ๋ฃ์ด์ค์ผ ํจ)
- 401 : ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ๋์ง ์์ ์ํ์์ ๋ณดํธ๋ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉ
- 403 : ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ์ํ์ ๋ฌด๊ดํ๊ฒ ์๋ตํ๊ณ ์ถ์ง ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉ (400 ์ฌ์ฉ์ ๊ถ์ฅ)
- 404 : ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ฆฌ์์ค๊ฐ ์กด์ฌํ์ง ์์ ๋ ์ฌ์ฉ
- 405 : ํด๋ผ์ด์ธํธ๊ฐ ๋ถ๊ฐ๋ฅํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ ๋
References
https://meetup.toast.com/posts/92
https://blog.metafor.kr/165
https://spoqa.github.io/2012/02/27/rest-introduction.html
https://node-js.tistory.com/17?category=870301