๐Ÿ“Œ ๊น€์˜ํ•œ ๋‹˜์˜ "๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ HTTP ์›น ๊ธฐ๋ณธ ์ง€์‹" ๊ฐ•์˜ ๋“ฃ๊ณ  ์ •๋ฆฌ

 

๐Ÿ“HTTP API๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

 

*API URI์„ค๊ณ„ ์˜ˆ์‹œ (์ด๊ฒŒ ์ข‹์„ URI ์„ค๊ณ„์ผ๊นŒ?)

ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ /read-member-list
ํšŒ์› ์กฐํšŒ /read-member-by-id
ํšŒ์› ๋“ฑ๋ก /create-member
ํšŒ์› ์ˆ˜์ • /update-member
ํšŒ์› ์‚ญ์ œ  /delete-member

No!

 

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

 

๋ฆฌ์†Œ์Šค๋ž€ ๋ฌด์—‡์ผ๊นŒ?

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

๊ทธ๋Ÿผ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์‹๋ณ„ํ•  ๊นŒ?

ํ–‰์œ„์„ ๋ฐฐ์ œํ•˜๊ณ  "ํšŒ์›"์ด๋ผ๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์‹๋ณ„ํ•˜์—ฌ URI์— ๋งคํ•‘ํ•˜๋ฉด ๋œ๋‹ค. 

 

๋ฆฌ์†Œ์Šค ์‹๋ณ„๊ณผ URI ๊ณ„์ธต ๊ตฌ์กฐ ํ™œ์šฉํ•ด ๋‹ค์‹œ ์„ค๊ณ„ํ•ด๋ณด์ž

(* ๊ณ„์ธต ๊ตฌ์กฐ์ƒ ์ƒ์œ„๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณด๊ณ  ๋ณต์ˆ˜๋‹จ์–ด ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค (member -> members))

ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ /members
ํšŒ์› ์กฐํšŒ /members/{id}
ํšŒ์› ๋“ฑ๋ก /members
ํšŒ์› ์ˆ˜์ • /members/{id}
ํšŒ์› ์‚ญ์ œ  /members/{id}

???? ๊ทธ๋Ÿผ ๋˜‘๊ฐ™์€ ๊ฒƒ์ด 4๊ฐœ๋‚˜ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค. ๊ตฌ๋ถ„์ด ์•ˆ๋˜๋Š” ๋ฐ ์ด๋•Œ ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ฒŒ ํ•˜๋Š”๊ฒŒ ๋ฐ”๋กœ HTTP ๋ฉ”์„œ๋“œ์ด๋‹ค.

URI๋Š” ๋ฆฌ์†Œ์Šค๋งŒ ์‹๋ณ„ํ•˜๊ณ  ํ–‰์œ„๋Š” ๋ชจ๋‘ HTTP ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ๋ถ„ํ•˜๊ฒŒ ๋œ๋‹ค. (๋ฆฌ์†Œ์Šค๋Š” ๋ช…์‚ฌ, ํ–‰์œ„๋Š” ๋™์‚ฌ)

 

 

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

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

์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ๊ฐ„๋žตํ•˜๊ฒŒ ๋ณด์ž๋ฉด

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

๊ธฐํƒ€ ๋ฉ”์„œ๋“œ๋“ค๋„ ๋ณด๋ฉด

  • HEAD : GET๊ณผ ๋™์ผํ•˜์ง€๋งŒ ๋ฉ”์‹œ์ง€ ๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ , ์ƒํƒœ ์ค„๊ณผ ํ—ค๋”๋งŒ ๋ฐ˜ํ™˜
  • OPTIONS : ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ†ต์‹  ๊ฐ€๋Šฅ ์˜ต์…˜(๋ฉ”์„œ๋“œ)์„ ์„ค๋ช… (์ฃผ๋กœ CORS์—์„œ ์‚ฌ์šฉํ•œ๋‹ค)
  • CONNECT : ๋Œ€์ƒ ์ž์›์œผ๋กœ ์‹๋ณ„๋˜๋Š” ์„œ๋ฒ„์— ๋Œ€ํ•œ ํ„ฐ๋„์„ ์„ค์ •
  • TRACE :  ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€ ๋ฃจํ”„๋ฐฑ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰

์ด ์žˆ๋‹ค.

 

* GET

  • ๋ฆฌ์†Œ์Šค ์กฐํšŒ (path์— ์žˆ๋Š” ์ž์›์„ ์ฃผ์„ธ์š”!)
  • ๊ฒ€์ƒ‰ ๋“ฑ์œผ๋กœ ์„œ๋ฒ„์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋Š” query(query parameter, query string)๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค.
  • ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ณณ์ด ๋งŽ์•„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค
GET /members/100
Host: localhost:8080

์„œ๋ฒ„๋Š” ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด /members์˜ 100๋ฒˆ์„ ๋‹ฌ๋ผ๋Š” ๋ง๋กœ ํ•ด์„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜์—ฌ ์•„๋ž˜ ์ฒ˜๋Ÿผ Response ๋ฉ”์‹œ์ง€๋กœ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

HTTP/1.1 200 OK
Content-Type: application/json
Content-length: 34

{
   "username" : "young",
   "age" : 20
}

 

* POST

  • ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ
  • ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ
  • ์„œ๋ฒ„๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ (๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰)
POST /members HTTP/1.1
Content-Type: application/json

{
    "username" : "young",
    "age" : 20
}

์‘๋‹ต (members 100๋ฒˆ์— ํ•ด๋‹น ์ž์›์ด ์‹ ๊ทœ ๋“ฑ๋ก๋˜์—ˆ๋‹ค)

HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 34
Location: /members/100

{
    "username" : "young",
    "age" : 20
}

 

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๋œป์ผ๊นŒ?

POST ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๋ฆฌ์†Œ์Šค URI์— ๋ฆฌ์†Œ์Šค๋งˆ๋‹ค ๋”ฐ๋กœ ์ •ํ•œ๋‹ค. (์ •์˜ํ•˜๊ธฐ ๋‚˜๋ฆ„)

ํฌ๊ฒŒ ๋ฌถ์–ด๋ณด์ž๋ฉด

  • ์„œ๋ฒ„๊ฐ€ ์•„์ง ์‹๋ณ„ํ•˜์ง€ ์•Š์€ ์ƒˆ ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก(์กฐํšŒ)
  • ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ (๋ฐ์ดํ„ฐ ์ƒ์„ฑ, ์ˆ˜์ • ์™ธ์—๋„ ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ ๊ฒฝ์šฐ๋„ ์žˆ์Œ)
  • ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌ ์• ๋งคํ•œ ๊ฒฝ์šฐ (GET ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ)

 

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

 

* PUT

  • ๋ฆฌ์†Œ์Šค ๋Œ€์ฒด (๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ์™„์ „ํžˆ ๋Œ€์ฒด, ์—†๋‹ค๋ฉด ์ƒ์„ฑ)
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„
    • Post๋Š” ๊ทธ๋ƒฅ /members ์—์„œ ๋๋‚ฌ๋‹ค๋ฉด Put ๊ฒฝ์šฐ /members/100 ์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋ฅผ ์‹๋ณ„
PUT /members/100 HTTP/1.1
Content-Type: application/json

{
   "username" : "old",
   "age" : 50
}

์„œ๋ฒ„์— ํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์—†์œผ๋ฉด ์ถ”๊ฐ€, ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

/members/100 ์˜ ๊ธฐ์กด๊ฐ’ /members/100 ์˜ ๋ณ€๊ฒฝ๊ฐ’ /members/100 ์˜ ๊ฒฐ๊ณผ๊ฐ’
{
    "username" : "young",
    "age" : 20
}
{
   "username" : "old",
   "age" : 50
}
{
   "username" : "old",
   "age" : 50
}

์ด๋•Œ ์™„์ „ํžˆ ๋Œ€์ฒดํ•œ๋‹ค๋Š” ๋ง์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. 

๊ธฐ์กด ๊ฐ’ ๊ฐ€์šด๋ฐ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์–ด PUT์„ ์‚ฌ์šฉํ•˜๋ฉด

/members/100 ์˜ ๊ธฐ์กด๊ฐ’ /members/100 ์˜ ๋ณ€๊ฒฝ๊ฐ’ /members/100 ์˜ ๊ฒฐ๊ณผ๊ฐ’
{
    "username" : "young",
    "age" : 20
}
{
   "age" : 50
}
{
   "age" : 50
}
  ๋‚˜์ด๋งŒ ๋ฐ”๊ฟ€๋ž˜! ๐Ÿ˜ฑ ??????

์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์™œ๋ƒ๋ฉด ์ผ๋ถ€ ๋ณ€๊ฒฝ์ด ์•„๋‹ˆ๋ผ ์™„์ „ ๋Œ€์ฒด์ด๊ธฐ ๋•Œ๋ฌธ. ๊ธฐ์กด ๊ฑธ ์ง€์›Œ๋ฒ„๋ฆฌ๊ณ  ๋ฐ”๊ฟ”์ฃผ๋ ค๋Š” ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•ด๋ฒ„๋ฆฐ๋‹ค.

์œ„์™€ ๊ฐ™์€ ์˜๋„๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด PATCH๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

* PATCH

  • ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ๋ณ€๊ฒฝ
PATCH /members/100 HTTP/1.1
Content-Type: application/json

{
   "age" : 50
}
/members/100 ์˜ ๊ธฐ์กด๊ฐ’ /members/100 ์˜ ๋ณ€๊ฒฝ๊ฐ’ /members/100 ์˜ ๊ฒฐ๊ณผ๊ฐ’
{
    "username" : "young",
    "age" : 20
}
{
   "age" : 50
}
{
   "username" : "young",
   "age" : 50
}
  ๋‚˜์ด๋งŒ ๋ฐ”๊ฟ€๋ž˜! ๐Ÿ˜Š๐Ÿ‘

+ PATCH๊ฐ€ ์ง€์›์ด ์•ˆ๋œ๋‹ค๋ฉด POST์‚ฌ์šฉ!

 

* DELETE

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

 

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

 

* ์•ˆ์ „ (Safe Methods)

  • ํ˜ธ์ถœํ•ด๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค. (์•ˆ์ „์€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋งŒ ๊ณ ๋ คํ•จ)

* ๋ฉฑ๋“ฑ (Idenmpotent Methods)

  • ํ•œ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๋‘๋ฒˆ ํ˜ธ์ถœํ•˜๋“  100๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๊ฒฐ๊ณผ๊ฐ€ ๋˜‘๊ฐ™๋‹ค. 
  • ๋ฉฑ๋“ฑ ๋ฉ”์„œ๋“œ ("๊ฐ™์€ ๋ฐ์ดํ„ฐ, ๊ฐ™์€ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฐ™์€ ์š”์ฒญ"์„ ํ• ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ๊ฒƒ)
    • GET : ํ•œ ๋ฒˆ ์กฐํšŒํ•˜๋“ , ๋‘๋ฒˆ ์กฐํšŒํ•˜๋“  ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒ
    • PUT : ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด๋„ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค
    • DELETE : ๊ฒฐ๊ณผ๋ฅผ ์‚ญ์ œ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ญ์ œํ•ด๋„ ๊ฒฐ๊ตญ ์‚ญ์ œ๋˜๋Š” ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค
    • POST ? POST๋Š” ๋ฉฑ๋“ฑ์ด ์•„๋‹ˆ๋‹ค. ๊ฐ™์€ ์š”์ฒญ์„ ํ•ด๋„ ๋•Œ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์–ด ์ค‘๋ณต์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
๋”๋ณด๊ธฐ

+ ๋ฉฑ๋“ฑ์„ฑ (idempotent) 

๋ฉฑ๋“ฑ์„ฑ์˜ ๋ฉฑ(ๅ†ช)์€ ๊ฑฐ๋“ญ์ œ๊ณฑ์ด๋ž€ ๋œป์ด ์žˆ์œผ๋ฉฐ ๋“ฑ(็ญ‰)์€ ๊ฐ™๋‹ค๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

๊ฑฐ๋“ญํ•ด๋„ ๊ฐ™๋‹ค๋Š” ๋œป์œผ๋กœ ์ˆ˜ํ•™์—์„œ๋Š” ์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์ ์šฉํ•˜๋”๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ์„ฑ์งˆ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์›น์—์„œ๋Š” ๋™์ผํ•œ ์š”์ฒญ์„ ํ•œ ๋ฒˆ ๋ณด๋‚ด๋Š” ๊ฒƒ๊ณผ ์—ฌ๋Ÿฌ๋ฒˆ ์—ฐ์†์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์ง€๋‹ˆ๊ณ , ์„œ๋ฒ„์˜ ์ƒํƒœ์—๋„ ๋™์ผํ•˜๊ฒŒ ๋‚จ์„ ๋•Œ, ํ•ด๋‹น HTTP ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ€์กŒ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๋ฉฑ๋“ฑ์ด๋ž€ ๊ฐœ๋…์ด ์™œ ํ•„์š”ํ• ๊นŒ?

์ž๋™ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

- ์„œ๋ฒ„๊ฐ€ ์ •์ƒ ์‘๋‹ต์„ ๋ชป์ฃผ์—ˆ์„ ๋•Œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ™์€ ์š”์ฒญ์„ ๋‹ค์‹œ ํ•ด๋„ ๋˜๋Š”์ง€ ํŒ๋‹จ์˜ ๊ทผ๊ฑฐ

 

์–ด? ๊ทธ๋Ÿผ ์žฌ์š”์ฒญ ์‚ฌ์ด์— ์™ธ๋ถ€์—์„œ ๊ทธ๊ฑธ ๋ฐ”๊ฟ”๋ฒ„๋ฆฐ๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆํ…๋ฐ?

๋ฉฑ๋“ฑ์€ ์™ธ๋ถ€์š”์ธ๊นŒ์ง€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋…์ด๋‹ค. ๋‚ด๊ฐ€ ๋™์ผํ•œ ์š”์ฒญ์„ ํ–ˆ์„๋•Œ ๋งŒ์„ ํŒ๋‹จ

 

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

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

 

+ Recent posts