๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[RESTful API]RESTful API๋ž€

์ถœ์ฒ˜ 

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"
  }
}