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

HTTP RESTful API / ์•ˆ์ „์„ฑ๊ณผ ๋ฉฑ๋“ฑ์„ฑ

by 1mj 2023. 2. 22.

REST(Representational State Transfer)

์ž์›์„ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

HTTP ์—์„œ์˜ REST ๋ž€?

1. HTTP URI(Uniform Resource Identifier)๋กœ ์ž์›(Resource)์„ ๋ช…์‹œ

2. HTTP Method(POST, GET, PUT, DELETE, PATCH ๋“ฑ)๋กœ

3. ํ•ด๋‹น ์ž์›(URI)์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

HTTP REST ๊ตฌ์„ฑ์š”์†Œ

  • ์ž์›(Resource): HTTP URI
  • ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„(Verb): HTTP Method
  • ํ‘œํ˜„(Representations)

HTTP REST ํŠน์ง•

  • ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ(Server-Client)
  • ๋ฌด์ƒํƒœ์„ฑ(Stateless)
  • ์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ(Cacheable)
  • ๊ณ„์ธตํ™”(Layered System)
  • ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ(Uniform Interface)

 

RESTful API

RESTful ์ด๋ž€ REST ์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์„ ๋งํ•œ๋‹ค. REST ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ชจ๋‘๊ฐ€ RESTful ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ REST API ์˜ ์„ค๊ณ„ ์›์น™์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€ํ‚จ ์‹œ์Šคํ…œ๋งŒ RESTful ํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

REST API ์„ค๊ณ„ ์›์น™

  • URI ๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ, ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์–ธ๋”๋ฐ” ๋Œ€์‹  ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํŒŒ์ผํ™•์žฅ์ž๋Š” URI ์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ–‰์œ„๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

HTTP Method

์„œ๋ฒ„๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋™์ž‘์„ ์ง€์ •ํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

HTTP Method ์ข…๋ฅ˜

  • GET: ๋ฆฌ์†Œ์Šค ์กฐํšŒ
  • POST: ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ, ์ฃผ๋กœ ์‹ ๊ทœ ๋ฆฌ์†Œ์Šค์˜ ๋“ฑ๋ก์— ์‚ฌ์šฉ
  • PUT: ๋ชฉ์  ๋ฆฌ์†Œ์Šค๋ฅผ ํ˜„์žฌ ๋ฉ”์‹œ์ง€์˜ ๊ฐ’์œผ๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ฎ์–ด์“ฐ๊ธฐ
  • PATCH: ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ๋ณ€๊ฒฝ
  • DELETE: ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

HTTP Method ์†์„ฑ

  • ์•ˆ์ „์„ฑ(Safe)
  • ๋ฉฑ๋“ฑ์„ฑ(Idempotent)
  • ์บ์‹œ๊ฐ€๋Šฅ(Cacheable)

์•ˆ์ „์„ฑ(Safe)

ํ˜ธ์ถœํ•ด๋„ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š” ์„ฑ์งˆ

  • ์ฝ๊ธฐ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ์•ˆ์ „ํ•˜๋‹ค.
  • ๊ผญ ์ฝ๊ธฐ ์ „์šฉ์ด์–ด์•ผ ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๊ณ , ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ ์ •๋ณด์™€ ํ†ต๊ณ„ ๋“ฑ์„ ๊ธฐ๋กํ•จ์œผ๋กœ์จ ์ž์‹ ์˜ ์ƒํƒœ์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ชจ๋“  ์•ˆ์ „ํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋ฉฑ๋“ฑ์„ฑ๋„ ๊ฐ–์ง€๋งŒ, ๋ฉฑ๋“ฑ์„ฑ์„ ์ง€๋‹Œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์•ˆ์ „ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ง์ ‘ ์š”์ฒญํ•˜์ง€ ์•Š์•„ ์„œ๋ฒ„์— ๋ถˆํ•„์š”ํ•œ ๋ถ€ํ•˜ ์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ž์œ ๋กญ๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • GET ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฏ€๋กœ ์•ˆ์ „ํ•œ HTTP ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • ๋ฐ˜๋ฉด์— POST/PUT/PATCH/DELETE ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ์— ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ HTTP ๋ฉ”์„œ๋“œ์ด๋‹ค.

๋ฉฑ๋“ฑ์„ฑ(Idempotent)

์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ ์šฉํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์„ฑ์งˆ

  • f(f(x)) = f(x) ๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์„ฑ์งˆ์ด๋‹ค.
  • ์ ˆ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” abs() ํ•จ์ˆ˜๊ฐ€ ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง„๋‹ค.
  • ์ž‘์—… ์ˆ˜ํ–‰ ์š”์ฒญ์ด ์ตœ์†Œ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•˜๋„๋ก ๋ณด์žฅ๋˜์ง€๋งŒ ๋‘ ๋ฒˆ ์ด์ƒ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ ์„ค๊ณ„์— ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ฉฑ๋“ฑ์„ฑ์„ ๋”ฐ์งˆ ๋•Œ๋Š” HTTP ์‘๋‹ต Status์™€ ์ƒ๊ด€์—†์ด ์„œ๋ฒ„์˜ ์ƒํƒœ๋งŒ ๋น„๊ตํ•˜๊ณ  ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ์ธํ•ด ์ค‘๊ฐ„์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • HTTP Spec์— ๋ช…์‹œ๋œ ๊ฒƒ์— ์˜ํ•˜๋ฉด GET, PUT, DELETE ๋ฉ”์„œ๋“œ๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€๋„๋ก, POST, PATCH ๋ฉ”์„œ๋“œ๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๋ฉฑ๋“ฑ์ ์ด์ง€ ์•Š์€ ์„ค๊ณ„

โ˜‘๏ธ GET
๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๋ฉด ์กฐํšŒ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๋„๋ก ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ
1. GET /board/1
2. ์„œ๋ฒ„์—์„œ id ๊ฐ’์ด 1์ธ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ
3. ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ ์กฐํšŒ์ˆ˜ 1 ์ฆ๊ฐ€
4. ๋ฐ์ดํ„ฐ ์‘๋‹ต

HTTP ์ŠคํŽ™์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๊ฒŒ API๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.
์กฐํšŒ์ˆ˜ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์š”์ฒญ์„ PATCH๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
โ˜‘๏ธ DELETE
๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ
1. DELETE /board/last
2. ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
3. ๋‹ค์‹œ ์š”์ฒญ ์‹œ ๋˜ ๋‹ค๋ฅธ ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ

HTTP ์ŠคํŽ™ ์ƒ DELETE๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ •ํ™•ํ•œ ์‹๋ณ„์ž๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” POST๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
โ˜‘๏ธ PATCH
PATCH๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์ธ๋ฐ ๊ทธ ๊ตฌํ˜„์„ PUT๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•  ๊ฒฝ์šฐ ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ํŠน์„ฑ์„ ์ง€๋‹Œ๋‹ค. PUT ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ PATCH ๋ฉ”์†Œ๋“œ๋Š” ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

1. PATCH /users/1 {age: {value: 1}}
2. age๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€ํ•˜๋Š” ๋ณ€๊ฒฝ

 

๐Ÿ”Ž ์•ˆ์ „์„ฑ๊ณผ ๋ฉฑ๋“ฑ์„ฑ
์•ˆ์ „์„ฑ์€ ํ•œ ๋ฒˆ์„ ํ˜ธ์ถœํ•˜๋˜ ์—ฌ๋Ÿฌ ๋ฒˆ์„ ํ˜ธ์ถœํ•˜๋˜ ๋ฆฌ์†Œ์Šค์— ์ˆ˜์ •์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์ด๋‹ค.
๋ฉฑ๋“ฑ์„ฑ์€ ๋ฆฌ์†Œ์Šค์— ์ˆ˜์ •์ด ๋ฐœ์ƒํ•ด๋„ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•œ ๊ฒƒ๊ณผ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋งŒ์กฑํ•˜๋Š” ์†์„ฑ์ด๋‹ค.

 

์บ์‹œ๊ฐ€๋Šฅ(Cacheable)

์‘๋‹ต ๊ฒฐ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹ฑํ•ด์„œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€์— ๋Œ€ํ•œ ์—ฌ๋ถ€

  • ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹œ๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ POST, PUT, DELETE, PATCH๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ ์บ์‹œ ๋ถˆ์ผ์น˜๊ฐ€ ์ƒ๊ธธ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด GET, HEAD ์ •๋„์—๋งŒ ์ด์šฉํ•œ๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ

๋Œ“๊ธ€