์ถ์ฒ
ChatGPT
RESTful API๋?
REST์ ์ ์
REST(Represesntational Stat Tranfer)๋ ๋ก์ด ํ๋ง(Roy Fielding)์ด 2000๋ ๋ฐ์ฌ ๋ ผ๋ฌธ์์ ์๊ฐํ ์ํํธ์จ์ด ์ํคํ ์ฒ ์คํ์ผ์ด๋ค. REST๋ ์น ๊ธฐ๋ฐ ์์คํ ์์ ์์์ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด์ HTTP๋ฅผ ์ฌ์ฉํ๋ ํน์ ํ ๊ท์น๊ณผ ์ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
RESTful API์ ํน์ง
RESTful API๋ REST ์ํคํ ์ฒ ์คํ์ผ์ ๋ฐ๋ฅด๋ API๋ฅผ ๋งํ๋ค. ์ฃผ๋ก HTTP ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ํด ์์(Resource)์ ๋คํธ์ํฌ๋ฅผ ํตํด ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ์ค๊ณ๋๋ค.
์ฃผ์ ํน์ง
1. ๋ฌด์ํ์ฑ Statelessness
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ์๋ก ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์ด์ ์์ฒญ๊ณผ ๋ค์ ์์ฒญ ์ฌ์ด์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋๋ค. ๋ชจ๋ ์์ฒญ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํด์ผ ํ๋ค.
2. ์์์ ํํ Representation
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์์์ ๋ค์ํ ํํ(JSON, XML, HTML ๋ฑ)๋ก ํํ๋๋ค. JSON์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค.
3. ํตํฉ๋ ์ธํฐํ์ด์ค Uniform Interface
- REST๋ ์์์ ๋ช ํํ๊ฒ ์๋ณํ๊ณ ์กฐ์ํ ์ ์๋ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ์๋ก ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๊ฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ์์์ ์์ฒญํ ์ ์๋ค.
4. ์บ์ ๊ฐ๋ฅ์ฑ Cacheability
- HTTP ํ๋กํ ์ฝ์ ์ฅ์ ์ ํ์ฉํ์ฌ, ํด๋ผ์ด์ธํธ๋ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์บ์ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฑ๋ฅ ํฅ์๊ณผ ์๋ฒ ๋ถํ ๊ฐ์๋ฅผ ๊พํ ์ ์๋ค.
5. ๊ณ์ธตํ ์์คํ Layered System
- ํด๋ผ์ด์ธํธ๋ ์ค๊ฐ ์๋ฒ(ํ๋ก์, ๊ฒ์ดํธ์จ์ด ๋ฑ)๋ฅผ ํตํด ์ต์ข ์๋ฒ์ ์ ๊ทผํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์์คํ ์ ํ์์ฑ๊ณผ ๋ณด์์ฑ์ ํ์ฅ์ํฌ ์ ์๋ค.
6. ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ Client-Server Architecture
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ์ด์๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ด๋นํ๋ฉฐ, ์๋ฒ๋ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
7. ์ฝ๋ ์จ ๋๋งจ๋ Code on Demand, ์ ํ์
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ฝ๋(JavaScript ๋ฑ)๋ฅผ ์ ์กํ์ฌ ์คํํ ์ ์์ง๋ง, ์ด๋ ์ ํ์ ์ด๋ค.
RESTful API์ HTTP ๋ฉ์๋
RESTful APII์์๋ HTTP ๋ฉ์๋๋ฅผ ํตํด ์์์ ๋ค๋ฃฌ๋ค. ๊ฐ ๋ฉ์๋๋ ํน์ ํ CRUD (Create, Read, Update, Delete) ์ฐ์ฐ๊ณผ ์ฐ๊ฒฐ๋๋ค.
HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | ์ค๋ช | CRUD ์ฐ์ฐ |
GET | ์กฐํ | ์๋ฒ์์ ์์์ ๊ฐ์ ธ์จ๋ค. | Read |
POST | ์์ฑ | ์๋ฒ์ ์ ์์์ ์์ฑํ๋ค. | Create |
PUT | ์์ | ์๋ฒ์ ์์์ ์ ์ฒด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค. | Update |
PATCH | ๋ถ๋ถ ์์ | ์๋ฒ์ ์์์ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค. | Update |
DELETE | ์ญ์ | ์๋ฒ์์ ์์์ ์ญ์ ํ๋ค. | Delete |
์์ : ์ฌ์ฉ์ ์์ ์ฒ๋ฆฌ
- GET /users: ๋ชจ๋ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
- GET /users/{id}: ํน์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
- POST /users: ์ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ค.
- PUT /users/{id}: ํน์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ ์ฒด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค.
- PATCH /users/{id}: ํน์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค.
- DELETE /users/{id}: ํน์ ์ฌ์ฉ์๋ฅผ ์ญ์ ํ๋ค.
RESTful API์ URI ์ค๊ณ
RESTful API์์๋ ์์์ ์๋ณ๊ณผ ์ ๊ทผ์ ์ํด URI (URI Resource Identifier)๋ฅผ ์ฌ์ฉํ๋ค.
URI ์ค๊ณ๋ ๋ค์๊ณผ ๊ฐ์ ์์น์ ๋ฐ๋ฅธ๋ค.
1. ์์(Resource)์ ๋ช ์ฌ๋ก ํํ
- URI๋ ์์์ ๋ช ์ฌ ํํ๋ก ํํํด์ผ ํ๋ค.
- ์: '/users', '/products', '/orders'
2. ๊ณ์ธต ๊ตฌ์กฐ
- URI๋ ์์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ์ํด์ผ ํ๋ค.
- ์: '/users/{userId}/orders/{orderId}'
3. ์๋ฌธ์ ์ฌ์ฉ
- URI๋ ์๋ฌธ์๋ก ์์ฑํด์ผ ํ๋ค.
- ์: '/users', '/products'
4. ๋์ฌ๋ CRUD ๊ด๋ จ ์ฉ์ด ์ฌ์ฉ ์์
- HTTP ๋ฉ์๋๊ฐ CRUD ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ฏ๋ก, URI์ ๋์ฌ๋ CRUD ๊ด๋ จ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- ์ฌ๋ฐ๋ฅธ ์: '/users'
- ์๋ชป๋ ์: '/getUsers', '/createUser'
5. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ(Query Parameters) ์ฌ์ฉ
- ํํฐ๋ง, ์ ๋ ฌ, ๊ฒ์ ๋ฑ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ค.
- ์: '/users?sort=age', '/products?category=electronics'
RESTful API์ ์๋ต ์ํ ์ฝ๋
HTTP ์ํ ์ฝ๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ช ํํ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ํ ์ฝ๋ | ์ค๋ช | ์์ธ |
200 OK | ์ฑ๊ณต | ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์๋ค. |
201 Created | ์์ฑ๋จ | ์๋ก์ด ์์์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋ค. |
204 No Content | ์ฑ๊ณต (๋ด์ฉ ์์) | ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์์ผ๋ ์๋ต ๋ฐ์ดํฐ๊ฐ ์๋ค. |
400 Bad Request | ์๋ชป๋ ์์ฒญ | ์์ฒญ์ด ์๋ชป๋์๋ค. (์ ํจ์ฑ ๊ฒ์ฌ ์คํจ ๋ฑ) |
401 Unauthorized | ์ธ์ฆ ํ์ | ์ธ์ฆ์ด ํ์ํ๋ค |
403 Forbidden | ๊ธ์ง๋จ | ์๋ฒ๊ฐ ์์ฒญ์ ๊ฑฐ๋ถํ๋ค. |
403 Not Found | ์์ | ์์ฒญํ ์์์ ์ฐพ์ ์ ์๋ค |
500 Internal Server Error | ์๋ฒ ์ค๋ฅ | ์๋ฒ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. |
RESTful API์ ๋์ดํฐ ํฌ๋งท
RESTful API์ ์๋ต ๋ฐ์ดํฐ๋ ์ฃผ๋ก JSON ํ์์ผ๋ก ์ ๋ฌ๋๋ค. JSON์ ๊ฐ๋ ์ฑ์ด ์ข๊ณ , ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
์์ : JSON ์๋ต
{
"id": 123,
"name": "John Doe",
"email": "john.doe@example.com",
"age": 30
}
RESTful API ์ค๊ณ ๋ชจ๋ฒ ์ฌ๋ก
1.๋ฒ์ ๊ด๋ฆฌ
- API ๋ฒ์ ์ URI๋ HTTP ํค๋์ ํฌํจ์์ผ ๊ด๋ฆฌํ๋ค.
- ์: '/v1/users', '/api/v2/products'
2. ์๋ฌ ์ฒ๋ฆฌ
- ๋ช ํํ ์๋ฌ ๋ฉ์์ง์ ์ํ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ค๋ฅ๋ฅผ ์ดํดํ ์ ์๋๋ก ํ๋ค.
- ์
{
"error": "InvalidRequest",
"message": "The 'name' field is required."
}
3. ๋ณด์
- HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ ์ก์ ์ํธํํ๋ค.
- ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ (์: OAuth, JWT)์ ์ฌ์ฉํ๋ค.
4. ๋ฌธ์ํ
- API ๋ฌธ์๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
- ์: Swagger, OpenAPI๋ฅผ ์ฌ์ฉํ ๋ฌธ์ํ
5. ์์์ ํ์ด์ง Paging
- ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ํ์ด์ง์ ๊ตฌํํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- ์: '/users?page=1&limit=10'
6. ์๋ ์ ํ Rate Limiting
- ํด๋ผ์ด์ธํธ์ ์์ฒญ ์๋ฅผ ์ ํํ์ฌ ์๋ฒ ์์์ ๋ณดํธํ๋ค.
- ์: ์๊ฐ๋น 1000 ์์ฒญ ์ ํ
7. HATEOAS Hypermedia as the Engine of Application State
- ์๋ต ๋ฐ์ดํฐ์ ๊ด๋ จ ๋งํฌ๋ฅผ ํฌํจ์์ผ ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ ๊ด๋ จ ์์์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
- ์
{
"id": 123,
"name": "John Doe",
"links": {
"self": "/users/123",
"orders": "/users/123/orders"
}
}
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Retrofit2] Retrofit2์์ API ํธ์ถ ์ ๊ณตํต ํค๋ ๊ฐ ์ถ๊ฐ ๋ฐฉ๋ฒ (0) | 2024.07.29 |
---|---|
[Retrofit2] Retrofit2์์ ํ์์์ ๋ฐ ๋ฆฌํธ๋ผ์ด ์ค์ (0) | 2024.07.29 |
[Android][ART] ART์ ํ๋กํ์ผ ๊ธฐ๋ฐ ์ปดํ์ผ (0) | 2024.07.26 |
[์ฉ์ด] ํ๋กํ์ผ, ํ๋กํ์ผ๋ง (0) | 2024.07.26 |
[JVM] ๋ค์ดํฐ๋ธ ์ฝ๋์ JVM (0) | 2024.07.26 |