REST๋? ๐๐ปโ๏ธ
1. REST ์ ์
REST(REpresentational State Transfer)๋ ๋คํธ์ํฌ ์์์ ์์์ ๊ด๋ฆฌํ๊ณ ์ฌ์ฉํ๋ ์ํคํ ์ฒ ์คํ์ผ์ด๋ค.
REST๋ ์น์ ๊ธฐ๋ณธ ํ๋กํ ์ฝ์ธ HTTP๋ฅผ ํ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ๋จ์ํํ๊ณ ์ผ๊ด์ฑ ์๊ฒ ์ค๊ณํ๋ค.
REST์ ํต์ฌ ๊ตฌ์ฑ ์์
- ์์(Resource)
- ์์์ URL์ ํตํด ์๋ณ๋๋ค.
- ๋ชจ๋ ์์์ ๊ณ ์ ํ URI(Uniform Resoource Identifier)๋ฅผ ๊ฐ์ง๋ค.
- ์: `/users/1`์ `id=1`์ธ ์ฌ์ฉ์๋ฅผ ๋ํ๋ด๋ ์์์.
- ํํ(Representation)
- ์์์ ์ฌ๋ฌ ํํ๋ก ํํ๋ ์์๋ค.
- ์: (JSON, XML, HTML ๋ฑ)
- ํด๋ผ์ด์ธํธ๋ ํํ์ ์์ฒญํ๊ณ , ์๋ฒ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
- ์์์ ์ฌ๋ฌ ํํ๋ก ํํ๋ ์์๋ค.
- ์ํ์ ์ด(State Transfer)
- ํด๋ผ์ด์ธํธ๋ ์์ฒญ(Request)์ ํตํด ์๋ฒ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ค.
2. REST์ ํน์ง
ํด๋ผ์ด์ธํธ-์๋ฒ ๋ถ๋ฆฌ(Client-Server Separation)
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
- ํด๋ผ์ด์ธํธ๋ UI๋ฅผ ๋ด๋นํ๊ณ , ์๋ฒ๋ ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
๋ฌด์ํ์ฑ(Stateless)
- ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ด๊ณ , ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋๋ค.
- ์์ฒญ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ ์์ฒด์ ์ผ๋ก ํฌํจ๋๋ค.
์บ์ ๊ฐ๋ฅ(Cacheable)
- HTTP ์๋ต์ ์บ์ฑ ์ ๋ณด๋ฅผ ํฌํจํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์๋ต์ ์บ์ ๊ฐ๋ฅํจ.
๊ณ์ธตํ ์์คํ (Layered System)
- ํด๋ผ์ด์ธํธ๋ ์ค๊ฐ ๊ณ์ธต(ํ๋ก์, ๊ฒ์ดํธ์์)์ ํตํด์๋ ์๋ฒ์ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
ํตํฉ ์ธํฐํ์ด์ค(Uniform Interface)
- ์์ ์๋ณ, ์์ฒญ ๋ฐฉ์, ์๋ต ํ์ ๋ฑ์ด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋จ.
3. RESTful API๋?
REST ์์น์ ์ค์ํ์ฌ ์ค๊ณ๋ API๋ฅผ RESTful API๋ผ๊ณ ํ๋ค.
ํด๋ผ์ด์ธํธ๋ HTTP ๋ฉ์๋์ URL ๊ตฌ์กฐ๋ฅผ ํตํด ์์์ ๊ด๋ฆฌํ๋ค.
1) RESTful์ด๋?
์ฝ๊ฒ ๋งํ์๋ฉด,
์ด๋ค ๊ฒ์ ๋งํ๋ฉด ๊ทธ ์์์ ์ํ๋ฅผ ์ ์ ์๋ ๊ฒ์ด๋ค.
RESTful์ `์์์ ์ํ๋ฅผ ์ ๋ฌํ๋ ๊ฒ` ์ด ํต์ฌ์.
2) API๋?
Application Programming Interface์ ์ค๋ง๋ก,,,
์ํํธ์จ์ด์ ๊ตฌ์ฑ ์์๊ฐ ์๋ก ํต์ ์ ํ๊ธฐ ์ํ ๋ฉ์๋์ด๋ค.
4. HTTP ๋ฉ์๋์ REST
RESTful API๋ HTTP ๋ฉ์๋๋ฅผ ์์ ๊ด๋ฆฌ์ ํ์ฉํ๋ค.
HTTP ๋ฉ์๋ | ์๋ฏธ | ๋์ | ์์ |
`GET` | ๋ฐ์ดํฐ ์กฐํ | ์์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค | `/users` (์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ) |
`POST` | ๋ฐ์ดํฐ ์์ฑ | ์์์ ์๋ก ๋ง๋ฆ | `/users` (์ ์ฌ์ฉ์ ์์ฑ) |
`PUT` | ๋ฐ์ดํฐ ์ ์ฒด ์์ | ์์์ ๋ชจ๋ ์์ฑ์ ์ ๋ฐ์ดํธํจ | `/users/1` (์ฌ์ฉ์ ์ ์ฒด ์์ ) |
`PATCH` | ๋ฐ์ดํฐ ์ผ๋ถ ์์ | ์์์ ์ผ๋ถ ์์ฑ๋ง ์ ๋ฐ์ดํธ | `/users/1` (์ผ๋ถ๋ง ์์ ) |
`DELETE` | ๋ฐ์ดํฐ ์ญ์ | ์์์ ์ญ์ ํ๋ค | `/users/1` (์ฌ์ฉ์ ์ญ์ ) |
`PUT`๊ณผ `PATCH`์ ์ข ๋ ๊ฐ๋ตํ ์ค๋ช :
- `PUT` : '์๋ ํ์ธ์.' ๋ฌธ์์ด ์ ์ฒด๋ฅผ '๊ฐ์ฌํ์ธ์.' ๋ก ์์ . '์๋ ํ์ธ์.' >> '๊ฐ์ฌํ์ธ์.'
- `PATCH` : '์๋ ํ์ธ์.' ๋ฌธ์์ด์์ '์๋ ' ๋ง '๊ฐ์ฌ' ๋ก ์์ . '์๋ 'ํ์ธ์. ?? '๊ฐ์ฌ'ํ์ธ์.
5. RESTful URI ์ค๊ณ
RESTful URI๋ ์์์ ๋ช ํํ ์๋ณํ๋ฉฐ, ๊ฐ๊ฒฐํ๊ณ ์ผ๊ด๋ ๊ตฌ์กฐ๋ก ์ค๊ณ๋๋ค.
URI ์ค๊ณ ๊ท์น
- ๋ช
์ฌ ์ฌ์ฉ: ์์์ ๋ช
์ฌ๋ก ํํ๋๋ค.
- ์: `/users`, `/products`, `orders`
- ๋์ํํ ์์: ๋์์ HTTP ๋ฉ์๋๋ก ํํ๋จ.
- ์๋ชป๋ ์: `/getUser`, `/createUser`
- ๊ณ์ธต์ ๊ตฌ์กฐ: ๊ด๊ณ๋ฅผ ํํํ๊ธฐ ์ํด ๊ณ์ธต์ ์ผ๋ก ์ค๊ณ๋๋ค.
- ์: `/users/1/orders`
- ์๋ฌธ์ ์ฌ์ฉ: URI๋ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
- ์๋ชป๋ ์: `/Users`
- ๋ณต์ํ ์ฌ์ฉ: ์์์ ๋ณต์ํ์ผ๋ก ํ๊ธฐํ๋ค.
- ์: `/users`(๋ชจ๋ ์ฌ์ฉ์)
URI ์์
- ๋ชจ๋ ์ฌ์ฉ์ ๊ฐ์ ธ์ค๊ธฐ: `GET /users`
- ํน์ ์ฌ์ฉ์ ๊ฐ์ ธ์ค๊ธฐ: `GET /users/1`
- ์ฌ์ฉ์ ์์ฑ: `POST /users`
- ์ฌ์ฉ์ ์์ : `PUT /users/1`
- ์ฌ์ฉ์ ์ญ์ : `DELETE /users/1`
6. RESTful ์๋ต ์ํ ์ฝ๋
RESTful API๋ HTTP ์ํ ์ฝ๋๋ฅผ ํตํด ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๋ค.
์ํ ์ฝ๋ | ์๋ฏธ | ์ค๋ช |
`200 OK` | ์ฑ๊ณต | ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋จ |
`201 Created` | ์์ ์์ฑ ์ฑ๊ณต | ์ ์์์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋จ |
`204 No Content` | ์ฑ๊ณต์ด์ง๋ง ๋ฐ์ดํฐ ์์ | ์์ฒญ์ ์ฑ๊ณตํ์ผ๋, ๋ฐํํ ๋ฐ์ดํฐ๊ฐ ์์ |
`400 Bad Request` | ์๋ชป๋ ์์ฒญ | ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์๋ชป๋จ |
`401 Unauthorized` | ์ธ์ฆ ์คํจ | ์ธ์ฆ์ด ํ์ํ๊ฑฐ๋ ์ธ์ฆ์ ์คํจํจ |
`403 Forbidden` | ๊ถํ ์์ | ๊ถํ ๋ถ์กฑ์ผ๋ก ์ ๊ทผ ๋ถ๊ฐ |
`404 Not Found` | ์์ ์์ | ์์ฒญํ ์์์ด ์กด์ฌํ์ง ์์ |
`500 Internal Server Error` | ์๋ฒ ์ค๋ฅ | ์๋ฒ์์ ์์ฒญ์ ์ฒ๋ฆฌ ์ค์ ์๋ฌ๊ฐ ๋ฐ์ํจ |
7. RESTful ์ค๊ณ์ ์ฅ์
- ํ์คํ: HTTP ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋๋ฏ๋ก ์ดํด์ ๊ตฌํ์ด ์ฝ๋ค.
- ์ ์ฐ์ฑ: ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ๋ ๋ฆฝ์ฑ์ผ๋ก ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
- ํ์ฅ์ฑ: ๊ตฌ์กฐํ ๋ URI๋ก ์๋ก์ด ์์๊ณผ ๋์์ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํจ.
- ํธํ์ฑ: ๋ค์ํ ์ธ์ด์ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
8. RESTful ์ค๊ณ์ ํ๊ณ
- ๋ณต์กํ ๊ด๊ณ ์ฒ๋ฆฌ์ ์ด๋ ค์: ํธ๋์ญ์ ๋ฑ ๋ณต์กํ ์์ ์ ๊ตฌํ์ด ๊น๋ค๋กญ๋ค.
- HTTP ์ ์ฝ: HTTP ๋ฉ์๋์ ์ํ ์ฝ๋ ์ธ ์ถ๊ฐ ํ์ฅ์ด ํ์ํจ.
- ๋ฌด์ํ์ฑ์ ์ ์ฝ: ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ์๋ฒ์์ ์ ์งํ ์ ์๋ค.
- ์ค์๊ฐ์ฑ ๋ถ์กฑ: WebSocket๊ณผ ๊ฐ์ ์๋ฐฉํฅ ํต์ ์ด ํ์ํ ๋ ๋ถ์ ํฉํ๋ค.
9. RESTful๊ณผ ๋ค๋ฅธ API์ ์คํ์ผ ๋น๊ต
ํน์ง | RESTful | GraphQL | gRPC |
๋ฐ์ดํฐ ๊ตฌ์กฐ | ์์ ์ค์ฌ | ํด๋ผ์ด์ธํธ ์์ฒญ ์ค์ฌ | ๋ฉ์๋ ์ค์ฌ |
์์ฒญ/์๋ต ๊ตฌ์กฐ | HTTP + JSON | HTTP + JSON | HTTP/2 + Protobuf |
์ค์๊ฐ ํต์ | ์ ํ์ (SSE) | Subscription ์ง์ | ์ค์๊ฐ ์๋ฐฉํฅ ์คํธ๋ฆฌ๋ฐ ์ง์ |
์ฌ์ฉ์ฑ | ๊ฐ๋จํ๊ณ ์ง๊ด์ | ๋ณต์กํ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ | ๊ณ ์ฑ๋ฅ, ์ด์ง ๋ฐ์ดํฐ ์ ์ก |
์ ๋ฆฌ ๐งน
RESTful์ ๊ฐ๊ฒฐํ๊ณ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- RESTful ์ค๊ณ์ ํต์ฌ์ ์์(Resource) ์ค์ฌ์ URI์ HTTP ๋ฉ์๋ ํ์ฉ์ด๋ค.
- ํ์คํ๋ ์๋ต ์ํ ์ฝ๋์ JSON ๊ฐ์ ํฌ๋งท์ ํตํด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ๊ฐ์ํํ์๋ค.
- ๋จ์ํ ๊ตฌ์กฐ์ ํ์ฅ์ฑ์ด ์ฅ์ ์ด๋, ๋ณต์กํ ๊ด๊ณ ์ฒ๋ฆฌ์ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์๋ ํ๊ณ๊ฐ ์๋ค.
'AI ๐ค > Django โ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250120] HttpResponse์ render์ ์ฐจ์ด์ (1) | 2025.01.20 |
---|---|
[250116] ์คํค๋ง(Schema)์ ERD(Entity-Relationship Diagram) (7) | 2025.01.16 |
[250114] Django์ ๋ค์ค App๊ณผ URL์ด๋? (0) | 2025.01.14 |
[250110] ORM(Object-Relational Mapping)์ด๋? (0) | 2025.01.10 |
[250107] ํธ๋ ์ผ๋ง ์ฌ๋์(Trailing Slash) ๋? (0) | 2025.01.07 |