[Network] REST, RESTful API๋?
๐ RESTful API๋?
REST(Representational State Transfer
๋ ์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ํํธ์จ์ด ์ํคํ
์ฒ ์คํ์ผ์ด๋ค.
REST๋ ์น์์ ๋ค๋ฃจ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์์ผ๋ก ๋ณด๋ฉฐ, ๊ฐ ์์์ ๊ณ ์ ํ URI๋ก ์๋ณํ๋ค. ์์์ ์ฃผ๊ณ ๋ฐ์ ๋, ์์ ๊ทธ ์์ฒด๊ฐ ์๋๋ผ JSON, XML๊ณผ ๊ฐ์ ์์์ โํํโ์ ์ฃผ๊ณ ๋ฐ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ HTTP ์์ฒญ ๋ฐ ์๋ต์ ํตํด ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋๋ค.
RESTful API
๋ REST ์์น์ ์ ์ง์ผ์ ๊ตฌํ๋ ์์คํ
๋๋ API๋ฅผ ์๋ฏธํ๋ค.
๐ REST์ ๊ตฌ์ฑ ์์
์์(Resource)
์์์ ์๋ฒ๊ฐ ๊ด๋ฆฌํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ฉฐ ๊ฐ ์์์ ๊ณ ์ ํ URI๋ก ์๋ณ๋๋ค. ํด๋ผ์ด์ธํธ๋ URI๋ฅผ ํตํด ์์์ ์ง์ ํ๊ณ , ์๋ฒ์ ํด๋น ์์์ ์ํ์ ๋ํ CRUD
์์
์ ์์ฒญํ๋ค.
ํ์(Verb, HTTP Method)
์์์ ๋ํด ์ด๋ค ๋์์ ์ํํ ์ง ํํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ๋์์ ์ํ๋์ง ์๋ฒ์ ์ ๋ฌํ๊ณ ์๋ฒ๋ ํด๋น ๋ฉ์๋์ ๋ง๋ ๋์์ ์ํํ๋ค.
GET
: ์์ ์กฐํ
POST
: ์์ ์์ฑ
PUT
: ์์ ์ ์ฒด ์์
PATCH
: ์์ ์ผ๋ถ ์์
DELETE
: ์์ ์ญ์
ํํ(Representation)
์์์ ์ค์ ๋ฐ์ดํฐ๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ํํ๋ฅผ ์๋ฏธํ๋ค. JSON, XML, HTML ๋ฑ์ ํํ๋ฅผ ๊ฐ์ง ์ ์๋ค.
๐ REST์ ํน์ง
ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ(Client-Server Architecture)
์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ด๋นํ๋ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ๋ฐ ์ฒ๋ฆฌํ๋ ์๋ฒ์ ์ญํ ์ ๋ช ํํ ๋ถ๋ฆฌํ๋ค. ์ฆ, ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ URI๋ง ์๋ฉด ๋๊ณ , ์๋ฒ์ ๋ด๋ถ ๋์์ ๋ชฐ๋ผ๋ ๋๋ค. ๋ฐ๋ผ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ๋ ์ ์๋ค.
๋ฌด์ํ์ฑ(Stateless)
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋๋ค. ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ ์ด์ ์์ฒญ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ์ง ์๋๋ค. ์ด๋ฅผ ํตํด ์๋ฒ ๊ตฌํ์ด ๋จ์ํด์ง๋ฉฐ, ํ์ฅ์ฑ์ด ๋์์ง๋ค.
์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ(Cacheable)
์๋ฒ์ ์๋ต์ ํด๋น ๋ฐ์ดํฐ๊ฐ ์บ์ ๊ฐ๋ฅํ์ง ๋ช ์ํ ์ ์๋ค. ํด๋ผ์ด์ธํธ ๋๋ ํ๋ก์ ์๋ฒ๋ ์บ์๋ ์๋ต์ ํตํด ๋์ผํ ์์ฒญ์ ๋ํด ์ ์ฐํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฆ, ์๋ฒ์ ๋์ผํ ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ ์๋ต์ ๋ฐ์ ์ ์๋ค๋ ๋ป์ด๋ค. ์ด๋ ๊ณง ๋คํธ์ํฌ ํธ๋ํฝ๊ณผ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๋ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
๊ณ์ธตํ ์์คํ (Layered System)
REST ์์คํ ์ ๋ก๋ ๋ฐธ๋ฐ์, ๊ฒ์ดํธ์จ์ด ๋ฑ ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์๋ค. ๊ฐ ๊ณ์ธต์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฉฐ ํด๋ผ์ด์ธํธ๋ ์ค๊ฐ ๊ณ์ธต์ ์กด์ฌ๋ฅผ ์ ํ์๊ฐ ์๋ค.
์ผ๊ด๋ ์ธํฐํ์ด์ค(Uniform Interface)
REST๋ ์ผ๊ด๋๊ณ ์ ํ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ชจ๋ ์์์ URI๋ก ์๋ณ ๊ฐ๋ฅํ๋ฉฐ HTTP Method๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ค. ๋ฐ๋ผ์ ๋ค์ํ ํด๋ผ์ด์ธํธ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก API๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๐ ์ค๊ณ ๋ฐ ๊ตฌํ
์์ ์ค์ฌ URI
- ๋์ฌ๊ฐ ์๋ ๋ช
์ฌ๋ก ์์ฑํ๋ค.
- ex)
/users
,posts/15
- ex)
- ์์์ ์งํฉ์ ๋ณต์ํ ๋ช
์ฌ๋ก ์์ฑํ๋ค.
- ex)
/students
- ex)
- ํญ์ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
- ex)
/users
(O),/Users
(X)
- ex)
- ์ฌ๋ฌ ๋จ์ด๋ก ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ ํ์ดํ(-)์ ์ฌ์ฉํ๋ค.
- ex)
/user-groups
- ex)
- ์ฌ๋์(/)๋ฅผ ํตํด ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ธ๋ค.
- ex)
/users/3/posts
(3๋ฒ ์ฌ์ฉ์์ ๊ฒ์๊ธ)
- ex)
- ๋ง์ง๋ง์ ์ฌ๋์๋ฅผ ๋ถ์ด์ง ์๋๋ค.
- ex)
/users
(O),/users/
(X)
- ex)
HTTP Method
- ๋ชฉ์ ์ ๋ง๊ฒ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ex)
GET /users/1
(1๋ฒ ์ฌ์ฉ์ ์ ๋ณด ์กฐํ)
- ex)
- URI์ ๋์์ด๋ CRUD ํจ์๋ช
์ ํฌํจํ๋ฉด ์ ๋๋ค.
- ex)
DELETE /users/1
(O),DELETE /users/delete/1
(X)
- ex)
HTTP ์ํ ์ฝ๋
- ์ ์ ํ ์ํ ์ฝ๋๋ฅผ ๋ฆฌํดํ๋๋ก ํด์ผ ํ๋ค.
- ex)
200 OK
(์์ฒญ ์ฑ๊ณต),500 Unternal Server Error
(์๋ฒ ์ค๋ฅ)
- ex)
๐ ํ๊ณ ๋ฐ ์ฃผ์์
์ค๋ฒํ์นญ(Over-fetching), ์ธ๋ํ์นญ(Under-fetching)
Over-fetching
์ ํด๋ผ์ด์ธํธ๊ฐ ์ค์ ๋ก ํ์ํ์ง ์๋ ๋ฐ์ดํฐ๊น์ง ๋ฐ๋ ํ์์ ๋งํ๋ค. REST API๋ ์๋ํฌ์ธํธ๋ณ๋ก ๊ณ ์ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ์ ๋ณด์์ id
๋ง ํ์ํ๋ createAt
๊ณผ ๊ฐ์ ๋ถํ์ํ ๋ฐ์ดํฐ๊น์ง ์ ๋ฌ๋ ์ ์๋ค.
Under-fetching
์ ํ ๋ฒ์ ์์ฒญ์ผ๋ก ๋ชจ๋ ์ ๋ณด๋ฅผ ์ป์ง ๋ชปํ์ฌ ์ฌ๋ฌ ๋ฒ์ ์ถ๊ฐ ์์ฒญ์ด ํ์ํ ํ์์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์์ ์ ๋ณด์ ์์ฑํ ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ํ ๋ฒ์ ๋ฐ์ง ๋ชปํ๊ณ ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค.
์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๊ณ
REST API๋ ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ ๋ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์ํฉ์์๋ ๋นํจ์จ์ ์ด๋ค. ์ด ๊ฒฝ์ฐ, WebSocket๊ณผ ๊ฐ์ API๊ฐ ๋ ์ ํฉํ๋ค.
๋ฌด์ํ์ฑ์ ํ๊ณ
REST๋ Stateless๋ฅผ ์์น์ผ๋ก ํ๋ฏ๋ก ๋งค ์์ฒญ๋ง๋ค ์ธ์ฆ ์ ๋ณด์ ๊ฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํฌํจํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๋ณต์กํ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ ์๋น์ค์ ๊ฒฝ์ฐ ์ ํฉํ์ง ์์ ์ ์๋ค.
๐ ์ฐธ๊ณ
https://peonyf.tistory.com/entry/Network-REST-API
https://dev-coco.tistory.com/97