๐ŸŒ CS & Infra/Web

[Web] REST API, RESTful API ๊ฐœ๋…

devCloud 2026. 5. 8. 11:17
728x90
WEB

REST API, RESTful API ๊ฐœ๋…๊ณผ ์ฐจ์ด

๋ฐฑ์—”๋“œ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋งˆ์ฃผ์น˜๋Š” ๋‹จ์–ด, REST API. ๊ทผ๋ฐ RESTful API๋Š” ๋˜ ๋ญ”๊ฐ€? ๊ฐ™์€ ๊ฑด๊ฐ€ ๋‹ค๋ฅธ ๊ฑด๊ฐ€? ์˜ค๋Š˜ ํ•œ ๋ฒˆ์— ์ •๋ฆฌํ•ด๋ณด์ž.

1. API

REST API๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋จผ์ € API๊ฐ€ ๋ญ”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. API(Application Programming Interface)๋ž€, ์„œ๋กœ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •ํ•ด๋†“์€ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

 

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ, ์•ฑ ๋“ฑ)๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ “์ด ๋ฐ์ดํ„ฐ ์ค˜” ํ•˜๊ณ  ์š”์ฒญํ•˜๊ณ , ์„œ๋ฒ„๊ฐ€ “์—ฌ๊ธฐ ์žˆ์–ด” ํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ๊ทธ ์ฐฝ๊ตฌ๊ฐ€ ๋ฐ”๋กœ API๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์—ฐ๊ฒฐ ์ง€์ ์ด ๋ฐ”๋กœ API๋‹ค.

2. REST

REST(Representational State Transfer)๋Š” ์›น ํ†ต์‹ ์„ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ(์„ค๊ณ„ ์›์น™)์ด๋‹ค. 2000๋…„์— ๋กœ์ด ํ•„๋”ฉ(Roy Fielding)์ด ๊ทธ์˜ ๋ฐ•์‚ฌ ๋…ผ๋ฌธ์—์„œ ์ฒ˜์Œ ์ •์˜ํ–ˆ๋‹ค.

 

REST ์ž์ฒด๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‚˜ ํ‘œ์ค€์ด ์•„๋‹ˆ๋‹ค. “์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•˜๋ฉด ์ข‹๋‹ค”๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์— ๊ฐ€๊น๋‹ค. REST๊ฐ€ ์ œ์‹œํ•˜๋Š” ํ•ต์‹ฌ ์›์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์›์น™ ์„ค๋ช…
ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์—ญํ• ์„ ๋ถ„๋ฆฌํ•œ๋‹ค
๋ฌด์ƒํƒœ(Stateless) ๊ฐ ์š”์ฒญ์€ ๋…๋ฆฝ์ ์ด๋ฉฐ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค
์บ์‹œ ๊ฐ€๋Šฅ(Cacheable) ์‘๋‹ต์€ ์บ์‹œ๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
๊ณ„์ธตํ™” ์‹œ์Šคํ…œ ์ค‘๊ฐ„ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ ํ•„์š” ์—†๋‹ค
์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค URI์™€ HTTP ๋ฉ”์„œ๋“œ ๋“ฑ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค
์ฝ”๋“œ ์˜จ ๋””๋งจ๋“œ (์„ ํƒ) ํ•„์š”ํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค

์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— ์ž์ฃผ ์ ‘ํ•˜๋Š” ์นด์นด์˜ค๋งต API, ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ, ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ ๋“ฑ๋„ ๋ชจ๋‘ REST API ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณต๋œ๋‹ค. ์ฆ‰, ์ด๋ฏธ ์šฐ๋ฆฌ ์ฃผ๋ณ€์—์„œ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด ์›์น™๋“ค์„ ์ž˜ ์ง€ํ‚ค๋ฉฐ ์„ค๊ณ„๋œ API๊ฐ€ ๋ฐ”๋กœ REST API๋‹ค.

3. REST API vs RESTful API

์†”์งํžˆ ๋งํ•˜๋ฉด ์‹ค๋ฌด์—์„œ๋Š” ๋‘ ๋‹จ์–ด๋ฅผ ํ˜ผ์šฉํ•ด์„œ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋‹ค. ํ•˜์ง€๋งŒ ์—„๋ฐ€ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ฉด ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  REST API RESTful API
์˜๋ฏธ REST ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“  API REST ์›์น™์„ ์ถฉ์‹คํžˆ ์ง€ํ‚จ API
๋‰˜์•™์Šค REST ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” API REST 6๊ฐ€์ง€ ์›์น™์„ ์ œ๋Œ€๋กœ ์ค€์ˆ˜ํ•œ API
ํ˜„์‹ค ์›์น™ ์ผ๋ถ€๋งŒ ์ง€์ผœ๋„ REST API๋ผ๊ณ  ๋ถ€๋ฆ„ ์™„์ „ํ•œ ์ค€์ˆ˜๊ฐ€ ๊ธฐ์ค€

์ฆ‰, ๋ชจ๋“  RESTful API๋Š” REST API์ง€๋งŒ, ๋ชจ๋“  REST API๊ฐ€ RESTfulํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋กœ์ด ํ•„๋”ฉ ๋ณธ์ธ๋„ “๋Œ€๋ถ€๋ถ„์˜ REST API๋Š” ์‚ฌ์‹ค RESTfulํ•˜์ง€ ์•Š๋‹ค”๊ณ  ๋งํ•  ์ •๋„๋กœ, ์™„์ „ํ•œ RESTful ์„ค๊ณ„๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊นŒ๋‹ค๋กญ๋‹ค.


4. REST API ์„ค๊ณ„ ๋ฐฉ๋ฒ•

REST API๋Š” URI + HTTP ๋ฉ”์„œ๋“œ ์กฐํ•ฉ์œผ๋กœ ํ–‰์œ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ๋จผ์ € ์•„ํ‚คํ…์ฒ˜๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

์•„ํ‚คํ…์ฒ˜

ํด๋ผ์ด์–ธํŠธ(์›น ์•ฑ, ๋ชจ๋ฐ”์ผ ์•ฑ, ํ”„๋ก ํŠธ์—”๋“œ)๊ฐ€ HTTP ์š”์ฒญ(GET, POST, PUT, DELETE)์„ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ณ , ์„œ๋ฒ„๋Š” API ์—”๋“œํฌ์ธํŠธ์—์„œ ์š”์ฒญ์„ ๋ฐ›์•„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ ๋’ค HTTP ์ƒํƒœ ์ฝ”๋“œ์™€ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ต์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” REST API์˜ ์ „์ฒด ํ๋ฆ„์ด๋‹ค.

 

REST API๋Š” ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ(Create), ์กฐํšŒ(Read), ์ˆ˜์ •(Update), ์‚ญ์ œ(Delete), ์ฆ‰ CRUD๋ฅผ HTTP ๋ฉ”์„œ๋“œ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

HTTP ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์—ญํ• 
GET ๋ฐ์ดํ„ฐ ์กฐํšŒ
POST ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
PUT ๋ฐ์ดํ„ฐ ์ „์ฒด ์ˆ˜์ •
PATCH ๋ฐ์ดํ„ฐ ์ผ๋ถ€ ์ˆ˜์ •
DELETE ๋ฐ์ดํ„ฐ ์‚ญ์ œ

 

URI ์„ค๊ณ„ ์˜ˆ์‹œ

๊ฒŒ์‹œํŒ API๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

GET    /posts         → ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ
GET    /posts/{id}    → ํŠน์ • ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ
POST   /posts         → ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ
PUT    /posts/{id}    → ๊ฒŒ์‹œ๊ธ€ ์ „์ฒด ์ˆ˜์ •
PATCH  /posts/{id}    → ๊ฒŒ์‹œ๊ธ€ ์ผ๋ถ€ ์ˆ˜์ •
DELETE /posts/{id}    → ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ

์‘๋‹ต ์˜ˆ์‹œ (JSON)

GET /posts/1 ์š”์ฒญ ์‹œ ์„œ๋ฒ„๊ฐ€ ๋Œ๋ ค์ฃผ๋Š” ์‘๋‹ต์€ ๋ณดํ†ต ์ด๋Ÿฐ ํ˜•ํƒœ๋‹ค.

{
  "id": 1,
  "title": "REST API๋ž€ ๋ฌด์—‡์ธ๊ฐ€",
  "content": "REST API๋Š” ...",
  "createdAt": "2025-01-01"
}
์‘๋‹ต ๋ฐ์ดํ„ฐ๋Š” ์ฃผ๋กœ JSON ํ˜•์‹์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ, ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค€๋‹ค.

URI ์„ค๊ณ„ ์‹œ ์ฃผ์˜ํ•  ์ 

โŒ /getPosts          → ๋™์‚ฌ ์‚ฌ์šฉ ๊ธˆ์ง€
โŒ /posts/delete/1    → URI์— ํ–‰์œ„๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค
โŒ /Posts             → ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ ์ง€์–‘
โŒ /posts/            → ๋งˆ์ง€๋ง‰ ์Šฌ๋ž˜์‹œ(/) ์‚ฌ์šฉ ์ง€์–‘

โœ… /posts
โœ… /posts/{id}
โœ… /posts/{postId}/comments
REST์—์„œ๋Š” ํ–‰์œ„๋ฅผ URI์— ๋„ฃ์ง€ ์•Š๊ณ , HTTP ๋ฉ”์„œ๋“œ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

5. HTTP ์ƒํƒœ ์ฝ”๋“œ๋„ ์ค‘์š”ํ•˜๋‹ค

REST API๋Š” ์‘๋‹ต์— ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. ๋‹จ์ˆœํžˆ 200๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ RESTfulํ•œ ์„ค๊ณ„๋ผ๊ณ  ๋ณด๊ธฐ ์–ด๋ ต๋‹ค.

์ฝ”๋“œ ์˜๋ฏธ ์˜ˆ์‹œ
200 OK ์š”์ฒญ ์„ฑ๊ณต GET, PUT, PATCH ์„ฑ๊ณต
201 Created ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต POST ์„ฑ๊ณต
204 No Content ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ ์—†์Œ DELETE ์„ฑ๊ณต
400 Bad Request ์ž˜๋ชป๋œ ์š”์ฒญ ํ•„์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ˆ„๋ฝ
401 Unauthorized ์ธ์ฆ ํ•„์š” ๋กœ๊ทธ์ธ ์•ˆ ํ•œ ์‚ฌ์šฉ์ž
403 Forbidden ๊ถŒํ•œ ์—†์Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ๊ธ€ ์‚ญ์ œ ์‹œ๋„
404 Not Found ๋ฆฌ์†Œ์Šค ์—†์Œ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ
500 Internal Server Error ์„œ๋ฒ„ ์˜ค๋ฅ˜ ์„œ๋ฒ„ ๋‚ด๋ถ€ ์—๋Ÿฌ

6. ๋งˆ์น˜๋ฉฐ

REST API๋Š” ๋‹จ์ˆœํžˆ HTTP๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ ๊ทธ ์ด์ƒ์ด๋‹ค. URI์™€ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์กฐํ•ฉํ•˜๋А๋ƒ, ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์˜๋ฏธ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ผ API์˜ ์™„์„ฑ๋„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

 

RESTful API๋Š” ๊ทธ ์›์น™์„ ์ž˜ ์ง€ํ‚จ API๋ฅผ ๋ถ€๋ฅด๋Š” ๋ง์ด๊ณ , ํ˜„์‹ค์—์„œ๋Š” ๋‘ ๋‹จ์–ด๊ฐ€ ํ˜ผ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” Spring Boot๋กœ ์‹ค์ œ REST API๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ณผ์ •์„ ๋‹ค๋ค„๋ณผ ์˜ˆ์ •์ด๋‹ค.
728x90