REST API
REST
REST(Representational State Transfer)์ ์ฝ์๋ก ์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- HTTP URI(Uniform Resource Identifier)์ ํตํด ์์์ ๋ช ์ํ๊ณ
- HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํตํด
- ํด๋น ์์์ ๋ํ CRUD Operation์ ์ ์ฉํ๋ค.
CRUD Operation
- Create: ์์ฑ(POST)
- Read: ์กฐํ(GET)
- Update: ์์ (PUT)
- Delete: ์ญ์ (DELETE)
๋ฉฑ๋ฑ์ฑ
๋ฉฑ๋ฑ์ฑ(idempotent)์ด๋ ์ฌ๋ฌ๋ฒ ์ํํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์์ ์๋ฏธํ๋ค. ์ฆ, ํธ์ถ๋ก ์ธํ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ณํ์ด ๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. HTTP Method ์ค์ POST๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ๋ฉฑ๋ฑ์ฑ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ค.
GET๋ฐฉ์์ด POST๋ฐฉ์๋ณด๋ค ์๋๊ฐ ๋น ๋ฅด๋ค?
GET ๋ฐฉ์์ ์บ์ฑ์ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ฒ ์์ฒญ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ฏ๋ก ์กฐ๊ธ ๋ ๋น ๋ฅผ ์ ์๋ค.
REST ๊ตฌ์ฑ์์
- ์์(Resource): HTTP URL
- ์์์ ๋ํ ํ์(Verb): HTTP Method
- ์์์ ๋ํ ํ์์ ๋ด์ฉ(Representations): HTTP Message Pay Load
REST ํน์ง
- Server-Client(์๋ฒ-ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ)
- Stateless(๋ฌด์ํ)
- Cacheable(์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ)
- Layered System(๊ณ์ธตํ)
- Uniform Interface(์ธํฐํ์ด์ค ์ผ๊ด์ฑ)
- Code-On-Demand(optional) - Server๋ก๋ถํฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ์์ Client์์ ์คํํ๋ค.(์ ํ์ฌํญ)
REST ์ฅ์
- HTTP ํ๋กํ ์ฝ์ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก REST API ์ฌ์ฉ์ ์ํ ๋ณ๋์ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ํ์๊ฐ ์๋ค.
- HTTP ํ๋กํ ์ฝ์ ํ์ค์ ์ต๋ํ ํ์ฉํ์ฌ ์ฌ๋ฌ ์ถ๊ฐ์ ์ธ ์ฅ์ ์ ํจ๊ป ๊ฐ์ ธ๊ฐ ์ ์๊ฒ ํด์ค๋ค.
- HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- Hypermedia API์ ๊ธฐ๋ณธ์ ์ถฉ์คํ ์งํค๋ฉด์ ๋ฒ์ฉ์ฑ์ ๋ณด์ฅํ๋ค.
- REST API ๋ฉ์์ง๊ฐ ์๋ํ๋ ๋ฐ๋ฅผ ๋ช ํํ๊ฒ ๋ํ๋ด๋ฏ๋ก ์๋ํ๋ ๋ฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
- ์ฌ๋ฌ ๊ฐ์ง ์๋น์ค ๋์์ธ์์ ์๊ธธ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ต์ํํ๋ค.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ๋ค.
REST ๋จ์
- ํ์ค์ด ์์ฒด๊ฐ ์กด์ฌํ์ง ์์ ์ ์๊ฐ ํ์ํ๋ค.
- ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ 4๊ฐ์ง๋ฐ์ ์๋ค.
- HTTP Method ํํ๊ฐ ์ ํ์ ์ด๋ค.
- ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ํ ์คํธํ ์ผ์ด ๋ง์ ์๋น์ค๋ผ๋ฉด ์ฝ๊ฒ ๊ณ ์น ์ ์๋ URL๋ณด๋ค Header ์ ๋ณด์ ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํ๋ฏ๋ก ์ ๋ฌธ์ฑ์ด ์๊ตฌ๋๋ค.
- ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ด ๋์ง ์์ ์ง์ํด์ฃผ์ง ๋ชปํ๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
- PUT, DELETE๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- pushState๋ฅผ ์ง์ํ์ง ์๋๋ค.
REST API
REST API๋ REST์ ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ API๋ฅผ ์๋ฏธํ๋ค.
API(Application Programming Interface)
์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋๋ก, ์ด์ ์ฒด์ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ์ดํ ์ ์๊ฒ ๋ง๋ ์ธํฐํ์ด์ค์ด๋ค. ์ฆ, ํ๋ก๊ทธ๋จ๊ณผ ์ํตํ๊ฒ ํด์ฃผ๋ ๋งค๊ฐ์ฒด. ํ๋ก๊ทธ๋จ๊ณผ ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํด์ฃผ๋ ๋ค๋ฆฌ ์ญํ ์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
REST API ๋์์ธ ๊ฐ์ด๋
- ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค
- RFC3986์ ์ฒด๊ณ ๋ฐ ํธ์คํธ ๊ตฌ์ฑ์์๋ฅผ ์ ์ธํ๊ณ URI๋ฅผ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ฌ ์ ์ํ๋ค.
- ์ค๋ค์ดํฌ์ผ์ด์ค(snake_case)๋์ ์ผ๋ฐฅ์ผ์ด์ค(kebab-case)๋ฅผ ์ฌ์ฉํ๋ค.
- ์ค๋ค์ดํฌ์ผ์ด์ค๋ ๋ณด๊ธฐ ์ด๋ ต๊ฑฐ๋ ๋ฌธ์๊ฐ ๊ฐ๋ ค์ง๊ธฐ๋ ํ๋ฏ๋ก ๊ฐ๋ ์ฑ์ ์ํด ๋ฐ์ค์ ์ฌ์ฉํ์ง ์๋๋ค.
- Path Variable์๋ ์นด๋ฉ์ผ์ด์ค(camelCase)๋ฅผ ์ฌ์ฉํ๋ค.
- [GET] /users/{userId}
- JSON property์๋ ์นด๋ฉ์ผ์ด์ค(camelCase)๋ฅผ ์ฌ์ฉํ๋ค.
1 2 3 4
{ userId: '1', userName: 'Youngjae' }
- URI์ ๋ง์ง๋ง์๋ ์ฌ๋์(/)๋ฅผ ํฌํจํ์ง ์๋๋ค.
- ๋ถ๋ช ํ URI๋ฅผ ๋ง๋ค์ด ํต์ ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํผ๋์ ์ฃผ์ง ์๋๋ก URI ๊ฒฝ๋ก์ ๋ง์ง๋ง์๋ ์ฌ๋์(/)๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ๊ณ์ธต๊ด๊ณ๋ฅผ ๋ํ๋ผ ๋๋ ์ฌ๋์ ๊ตฌ๋ถ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
- ์ฌ๋์ ๋ฌธ์๋ URI์ ๊ฒฝ๋ก ๋ถ๋ถ์์ ์์ ๊ฐ์ ๊ณ์ธต์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- ํ์(Verb)๋ ํฌํจํ์ง ์์ผ๋ฉฐ, ํ์(Verb)๋ URL๋์ Method๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌํ๋ค.
- ํ์ผ ํ์ฅ์๋ URI์ ํฌํจ์ํค์ง ์๋๋ค.
- Content-Type ์ด๋ผ๋ ํค๋๋ฅผ ํตํด ์ ๋ฌ๋๋๋๋ก ๋ฏธ๋์ด ํ์ ์ ์ฌ์ฉํ์ฌ body์ ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ค.
- HTTP์์ ์ ๊ณตํ๋ ํ์ ์ ํ ๋ฉ์ปค๋์ฆ์ธ Aceept ์์ฒญ ํค๋๋ฅผ ํ์ฉํ๋๋ก ๊ถ์ฅํด์ผ ํ๋ค.
- ์ ๋ฌํ๊ณ ์ ํ๋ ์์์ ๋ช ์ฌ๋ฅผ ์ฌ์ฉํ๋, ์ปจํธ๋กค ์์์ ์๋ฏธํ๋ ๊ฒฝ์ฐ ์์ธ์ ์ผ๋ก ๋์ฌ๋ฅผ ํ์ฉํ๋ค.
- Collection์๋ ๋จ์๊ฐ ์๋ ๋ณต์๋ฅผ ์ฌ์ฉํ๋ค.
- API ๋ฒ์ ์ ์ํด์ ์์๋ฅผ ์ฌ์ฉํ๋ค.
- https://example.com/
v1
/โฆ
- https://example.com/
- list ๋ฆฌ์์ค์ ๊ฒฝ์ฐ ๊ฐฏ์๋ ํจ๊ป ์๋ตํ๋ค.
- list ์๋ต์ ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ๋ก limit๊ณผ offset ์ ๋ณด๋ฅผ ๋ฐ๋๋ค.
- ์ํ๊ฐ์ ์๋ตํ๋ค.(์ํ์ฝ๋ ์ฐธ๊ณ )
- Informational 1XX: ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์๋ต
- Successful 2XX : ์ฑ๊ณต์ ์ธ ์๋ต
- 200 OK: ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ํ
- Redirection 3XX
- ๋ฉ์์ง ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์๋ฃํ๊ธฐ ์ํด์ ์ถ๊ฐ์ ์ธ ํ๋์ด ํ์ํ ๊ฒฝ์ฐ
- Client Error 4XX
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์๋ชป๋ ์์ฒญ์ ํ๋ ๊ฒฝ์ฐ
- 401 Unauthorized: ์ธ์ฆ์ด ํ์ํ ํ์ด์ง๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ
- 403 Forbiden: ํ์ฉ๋์ง ์์ ๋ฉ์๋๊ฐ ์์ ๋
- 406 Not Acceptable: ํ์ฉ ๋ถ๊ฐ๋ฅ
- Server Error 5XX
- ์๋ฒ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ ์์ ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ
- 500 Internal Server Error: ์น ์๋ฒ๊ฐ ์ฒ๋ฆฌํ ์ ์์
- 503 Service Unavailable: ์๋น์ค ์ ๊ณต๋ถ๊ฐ, ์๋ฒ ๊ณผ๋ถํ, ์๋ฒ ํญ์ฃผ
RESTful API
RESTful์ REST์ ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ ์์คํ
์ ์๋ฏธํ๋ค.
ํ์ง๋ง REST๋ฅผ ์ฌ์ฉํ๋ค ํ๋๋ผ๋ ๋ชจ๋๊ฐ RESTful ํ ๊ฒ์ ์๋๋ค.
REST API์ ์ค๊ณ ๊ท์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์งํจ ์์คํ
์ RESTful ํ๋ค ๋งํ ์ ์์ผ๋ฉฐ, ๋ชจ๋ CRUD ๊ธฐ๋ฅ์ POST๋ก ์ฒ๋ฆฌํ๋ API ํน์ URI ๊ท์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์งํค์ง ์์ API๋ REST API์ ์ค๊ณ ๊ท์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์งํค์ง ๋ชปํ ์์คํ
์ REST API๋ฅผ ์ฌ์ฉํ์์ง๋ง
RESTful ํ์ง ๋ชปํ ์์คํ
์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
RESTful ํ API๋ฅผ ๊ตฌํํ๋ ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด ์ฑ๋ฅ ํฅ์์ ์๋ ๊ฒ์ด ์๋๋ผ ์ผ๊ด์ ์ธ ์ปจ๋ฒค์
์ ํตํ API์ ์ดํด๋ ๋ฐ ํธํ์ฑ์ ๋์ด๋ ๊ฒ์ด ์ฃผ ๋๊ธฐ์ด๋, ์ฑ๋ฅ์ด ์ค์ํ ์ํฉ์์๋ ๊ตณ์ด RESTfulํ API๋ฅผ ๊ตฌํํ ํ์๋ ์๋ค.
Leave a comment