๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์›น ์„œ๋น„์Šค

HTTP ๋ฉ”์„œ๋“œ

by alswlfl 2022. 11. 30.

HTTP API ๋งŒ๋“ค์–ด๋ณด๊ธฐ

ex) ์š”๊ตฌ์‚ฌํ•ญ: ํšŒ์› ์ •๋ณด ๊ด€๋ฆฌ API ๋งŒ๋“ค๊ธฐ(ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ, ํšŒ์› ์กฐํšŒ, ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ)

API URI์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฆฌ์†Œ์Šค ์‹๋ณ„

 

๋ฆฌ์†Œ์Šค?

ํšŒ์›์„ ๋“ฑ๋กํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹˜ → ํšŒ์›์ด๋ผ๋Š”๊ฐœ๋… ์ž์ฒด๊ฐ€ ๋ฆฌ์†Œ์Šค

ex) ๋ฏธ๋„ค๋ž„์„ ์บ๋ผ → ๋ฏธ๋„ค๋ž„์ด ๋ฆฌ์†Œ์Šค

๋ฆฌ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์‹๋ณ„?

ํšŒ์›์„ ๋“ฑ๋กํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ๋ฐฐ์ œ

ํšŒ์›์ด๋ผ๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์‹๋ณ„ํ•˜๋ฉด ๋จ → ํšŒ์› ๋ฆฌ์†Œ์Šค๋ฅผ URI์— ๋งคํ•‘

 

API URI ์„ค๊ณ„ → ๋ฆฌ์†Œ์Šค ์‹๋ณ„, URI ๊ณ„์ธต ๊ตฌ์กฐ ํ™œ์šฉ

ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ /members

ํšŒ์› ์กฐํšŒ /members/{id}

ํšŒ์› ๋“ฑ๋ก /members/{id}

ํšŒ์› ์ˆ˜์ • /members/{id}

ํšŒ์› ์‚ญ์ œ /members/{id}

? ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„? → ๋ฆฌ์†Œ์Šค์™€ ํ–‰์œ„๋ฅผ ๋ถ„๋ฆฌ

 

๋ฆฌ์†Œ์Šค์™€ ํ–‰์œ„์„ ๋ถ„๋ฆฌ

URI๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์‹๋ณ„

๋ฆฌ์†Œ์Šค์™€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ํ–‰์œ„๋ฅผ ๋ถ„๋ฆฌ

๋ฆฌ์†Œ์Šค: ํšŒ์›

ํ–‰์œ„: ์กฐํšŒ, ๋“ฑ๋ก, ์‚ญ์ œ, ๋ณ€๊ฒฝ

๋ฆฌ์†Œ์Šค๋Š” ๋ช…์‚ฌ, ํ–‰์œ„๋Š” ๋™์‚ฌ (๋ฏธ๋„ค๋ž„์„ ์บ๋ผ)

ํ–‰์œ„(๋ฉ”์„œ๋“œ)๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„? → HTTP๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌ๋ถ„ํ•ด์คŒ


HTTP ๋ฉ”์„œ๋“œ - GET, POST

HTTP ๋ฉ”์„œ๋“œ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ํ•  ๋•Œ ๊ธฐ๋Œ€ํ•˜๋Š” ํ–‰๋™

HTTP ๋ฉ”์„œ๋“œ ์ข…๋ฅ˜

[์ฃผ์š” ๋ฉ”์„œ๋“œ]

GET: ๋ฆฌ์†Œ์Šค ์กฐํšŒ

POST: ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์ฃผ๋กœ ๋“ฑ๋ก์— ์‚ฌ์šฉ

PUT: ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ฒด, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ

PATCH: ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ๋ณ€๊ฒฝ

DELETE: ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

[๊ธฐํƒ€ ๋ฉ”์„œ๋“œ]

HEAD:  GET๊ณผ ๋™์ผํ•˜์ง€๋งŒ ๋ฉ”์‹œ์ง€ ๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ , ์ƒํƒœ ์ค„๊ณผ ํ—ค๋”๋งŒ ๋ฐ˜ํ™˜

OPTIONS: ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ†ต์‹  ๊ฐ€๋Šฅ ์˜ต์…˜(๋ฉ”์„œ๋“œ)์„ ์„ค๋ช…(์ฃผ๋กœ CORS์—์„œ ์‚ฌ์šฉ)

CONNECT: ๋Œ€์ƒ ์ž์›์œผ๋กœ ์‹๋ณ„๋˜๋Š” ์„œ๋ฒ„์— ๋Œ€ํ•œ ํ„ฐ๋„์„ ์„ค์ • → ๊ฑฐ์˜ ์‚ฌ์šฉ ์•ˆํ•จ

TRACE: ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€ ๋ฃจํ”„๋ฐฑ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ → ๊ฑฐ์˜ ์‚ฌ์šฉ ์•ˆํ•จ

 

GET

ex)

GET /members/100 HTTP/1.1
Host: localhost:8080
  • ๋ฆฌ์†Œ์Šค ์กฐํšŒ
  • ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋Š” query๋ฅผ ํ†ตํ•ด์„œ ์ „๋‹ฌ
  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ณณ์ด ๋งŽ์•„์„œ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ

 

POST

ex)

POST /members HTTP/1.1
Content-Type: application/json

{
    "username":"hello",
    "age": 20
}
  • ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  • ์„œ๋ฒ„๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ
    • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰
  • ์ฃผ๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋กœ ์‹ ๊ทœ ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก, ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ์ž์›์ด ์ƒ์„ฑ๋œ ๊ฒฝ๋กœ๋ฅผ ๋ณด๋‚ด์คŒ
  • ์ŠคํŽ™: POST ๋ฉ”์„œ๋“œ๋Š” ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ ๊ณ ์œ  ํ•œ ์˜๋ฏธ ์ฒด๊ณ„์— ๋”ฐ๋ผ ์š”์ฒญ์— ํฌํ•จ๋œ ํ‘œํ˜„์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์š”์ฒญ
    • ex) ๊ฒŒ์‹œํŒ ๊ธ€์“ฐ๊ธฐ, ์‹ ๊ทœ ์ƒ์„ฑ, ๊ธฐ์กด ์ž์›์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋“ฑ๋“ฑ
  • ๋ฆฌ์†Œ์Šค URI์— POST ์š”์ฒญ์ด ์˜ค๋ฉด ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๋ฆฌ์†Œ์Šค๋งˆ๋‹ค ๋”ฐ๋กœ ์ •ํ•ด์•ผ ํ•จ
  • POST๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Œ, ํ•˜์ง€๋งŒ ์กฐํšŒ ๋ถ€๋ถ„์€ ์ตœ๋Œ€ํ•œ GET์„ ์‚ฌ์šฉํ•˜๊ธฐ!

[์ •๋ฆฌ]

1. ์ƒˆ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ(๋“ฑ๋ก)

- ์„œ๋ฒ„๊ฐ€ ์•„์ง ์‹๋ณ„ํ•˜์ง€ ์•Š์€ ์ƒˆ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ

2. ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

- ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

ex) ์ฃผ๋ฌธ์—์„œ ๊ฒฐ์ œ ์™„๋ฃŒ -> ๋ฐฐ๋‹ฌ ์‹œ์ž‘ -> ๋ฐฐ๋‹ฌ ์™„๋ฃŒ ์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ ๊ฐ’ ๋ณ€๊ฒฝ์„ ๋„˜์–ด ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ

- POST์˜ ๊ฒฐ๊ณผ๋กœ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

ex) POST /orders/{orderId}/start-delivery (์ปจํŠธ๋กค URI)

3. ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ

- ์• ๋งคํ•˜๋ฉด POST

ex) JSON์œผ๋กœ ์กฐํšŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์•ผ ํ•˜๋Š”๋ฐ, GET ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ

 


HTTP ๋ฉ”์„œ๋“œ - PUT, PATCH, DELETE

PUT
ex)

PUT /members/100 HTTP/1.1
Content-Type: application/json

{
      "username": "hello",
      "age": 20
}
  • ๋ฆฌ์†Œ์Šค๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒด
    • ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ€์ฒด
    • ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ
    • ๊ธฐ์กด์— ์žˆ๋˜ ํŒŒ์ผ์„ ๋ฎ์–ด๋ฒ„๋ฆผ
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค ์œ„์น˜๋ฅผ ์•Œ๊ณ  URI ์ง€์ •
    • POST์™€ ์ฐจ์ด์ 

PATCH

ex)

PATCH /members/100 HTTP/1.1
Content-Type: application/json

{
    "age": 50
}
  • ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ๋ณ€๊ฒฝ
  • PATCH๊ฐ€ ์ง€์›์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” POST ์‚ฌ์šฉ

DELETE

ex)

DELETE /members/100 HTTP/1.1
Host: localhost:8080
  • ๋ฆฌ์†Œ์Šค ์ œ๊ฑฐ

HTTP ๋ฉ”์„œ๋“œ์˜ ์†์„ฑ

์•ˆ์ „(Safe Methods)

  • ํ˜ธ์ถœํ•ด๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ → GET, HEAD
  • ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ•จ
  • ๊ณ„์† ํ˜ธ์ถœํ•ด์„œ ๋กœ๊ทธ๊ฐ€ ์Œ“์—ฌ์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊นŒ์ง€๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ →ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ์ด๋˜๋А๋ƒ ์•„๋‹ˆ๋ƒ๋งŒ ๊ณ ๋ ค

๋ฉฑ๋“ฑ(Idempotent)

  • f(f(x))=f(x)
  • ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  100๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๊ฒฐ๊ณผ๊ฐ€ ๋˜‘๊ฐ™๋‹ค.
  • ๋ฉฑ๋“ฑ ๋ฉ”์„œ๋“œ
    • GET: ํ•œ ๋ฒˆ ์กฐํšŒํ•˜๋“ , ๋‘ ๋ฒˆ ์กฐํšŒํ•˜๋“  ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์กฐํšŒ๋จ
    • PUT: ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์ฒด, ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด๋„ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๊ฐ™์Œ
    • DELETE: ๊ฒฐ๊ณผ๋ฅผ ์‚ญ์ œ. ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด๋„ ์‚ญ์ œ๋œ ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™์Œ
    • POST: ๋ฉฑ๋“ฑ์ด ์•„๋‹˜! ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ™์€ ๊ฒฐ์ œ๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ํ™œ์šฉ
    • ์ž๋™ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜
    • ์„œ๋ฒ„๊ฐ€ TIMEOUT ๋“ฑ์œผ๋กœ ์ •์ƒ ์‘๋‹ต์„ ๋ชป์ฃผ์—ˆ์„ ๋•Œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ™์€ ์š”์ฒญ์„ ๋‹ค์‹œ ํ•ด๋„ ๋˜๋Š”๊ฐ€?
  • Q: ์žฌ์š”์ฒญ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด๋ฒ„๋ฆฌ๋ฉด?
    • ์‚ฌ์šฉ์ž1: GET -> username:A, age:20
    • ์‚ฌ์šฉ์ž2: PUT -> username:A, age:30
    • ์‚ฌ์šฉ์ž1: GET -> username:A, age: 30 -> ์‚ฌ์šฉ์ž2์˜ ์˜ํ–ฅ์œผ๋กœ ๋ฐ”๋€ ๋ฐ์ดํ„ฐ ์กฐํšŒ
  • A: ๋ฉฑ๋“ฑ์€ ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ์ค‘๊ฐ„์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ๊นŒ์ง€๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ

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

  • ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • GET, HEAD, POST, PATCH ์บ์‹œ ๊ฐ€๋Šฅ
  • ์‹ค์ œ๋กœ๋Š” GET, HEAD ์ •๋„๋งŒ ์บ์‹œ๋กœ ์‚ฌ์šฉ
    • POST, PATCH๋Š” ๋ณธ๋ฌธ ๋‚ด์šฉ๊นŒ์ง€ ์บ์‹œ ํ‚ค๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ตฌํ˜„์ด ์‰ฝ์ง€ ์•Š์Œ