์„ฑ๋Šฅ ํ–ฅ์ƒ

์ด ๋ฌธ์„œ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ API ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ API์˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜์ง€๋งŒ ๊ฐ™์€ ๊ฐœ๋…์ด Compute Engine API์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

gzip์„ ์‚ฌ์šฉํ•œ ์••์ถ•

๊ฐ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋Œ€์—ญํญ์„ ์ค„์ด๋Š” ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•œ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ gzip ์••์ถ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋ฅผ ์••์ถ• ํ•ด์ œํ•˜๋ ค๋ฉด CPU ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋Œ€์‹ ์— ๋„คํŠธ์›Œํฌ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

gzip์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ์‘๋‹ต์„ ๋ฐ›์œผ๋ ค๋ฉด Accept-Encoding ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— gzip ๋ฌธ์ž์—ด์ด ํฌํ•จ๋˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ gzip ์••์ถ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑ๋œ HTTP ํ—ค๋”์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

Accept-Encoding: gzip
User-Agent: my program (gzip)

๋ถ€๋ถ„ ๋ฆฌ์†Œ์Šค ์ž‘์—…

API ํ˜ธ์ถœ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๊ด€์‹ฌ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„๋งŒ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ํ•„๋“œ๋ฅผ ์ „์†กํ•˜๊ณ  ํŒŒ์‹ฑํ•˜๊ณ  ์ €์žฅํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ, CPU, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ถ€๋ถ„ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ถ€๋ถ„ ์‘๋‹ต: ์‘๋‹ต์— ํฌํ•จํ•  ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” ์š”์ฒญ(fields ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ)
  • ํŒจ์น˜: ๋ณ€๊ฒฝํ•  ํ•„๋“œ๋งŒ ์ „์†กํ•˜๋Š” ์—…๋ฐ์ดํŠธ ์š”์ฒญ(PATCH HTTP ๋™์‚ฌ ์‚ฌ์šฉ)

๋ถ€๋ถ„ ์š”์ฒญ์„ ์ž‘์„ฑํ•˜๋Š” ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ์„น์…˜์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ์‘๋‹ต

๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„์— ์ „์ฒด ๋ฆฌ์†Œ์Šค ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์„œ๋ฒ„์— ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ์ „์†กํ•˜๋„๋ก ์š”์ฒญํ•˜์—ฌ ๋ถ€๋ถ„ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ์‘๋‹ต์„ ์š”์ฒญํ•˜๋ ค๋ฉด fields ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜๋ฐ›์„ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์—์„œ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fields ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์ค„์ด๋ ค๋ฉด ํŒจ์น˜ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜ˆ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ(๊ฐ€์ƒ์˜) 'Demo' API์— fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

๋‹จ์ˆœ ์š”์ฒญ: ์ด HTTP GET ์š”์ฒญ์€ fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ๋žตํ•˜๊ณ  ์ „์ฒด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

https://www.googleapis.com/demo/v1

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

{
  "kind": "demo",
  ...
  "items": [
  {
    "title": "First title",
    "comment": "First comment.",
    "characteristics": {
      "length": "short",
      "accuracy": "high",
      "followers": ["Jo", "Will"],
    },
    "status": "active",
    ...
  },
  {
    "title": "Second title",
    "comment": "Second comment.",
    "characteristics": {
      "length": "long",
      "accuracy": "medium"
      "followers": [ ],
    },
    "status": "pending",
    ...
  },
  ...
  ]
}

๋ถ€๋ถ„ ์‘๋‹ต ์š”์ฒญ: ๊ฐ™์€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋‹ค์Œ ์š”์ฒญ์—์„œ๋Š” ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ๋Œ€ํญ ์ค„์ด๊ธฐ ์œ„ํ•ด fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)

๋ถ€๋ถ„ ์‘๋‹ต: ์œ„ ์š”์ฒญ์— ๋Œ€ํ•ด ์„œ๋ฒ„์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‘๋‹ต์—๋Š” ์ข…๋ฅ˜(kind) ์ •๋ณด์™€ ์งง๊ฒŒ ์ค„์ธ ํ•ญ๋ชฉ(items) ๋ฐฐ์—ด๋งŒ ํฌํ•จ๋˜๋ฉฐ, ์ด ํ•ญ๋ชฉ ๋ฐฐ์—ด์—๋Š” ๊ฐ ํ•ญ๋ชฉ์˜ HTML ์ œ๋ชฉ ๋ฐ ๊ธธ์ด ํŠน์„ฑ ์ •๋ณด๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

200 OK
{
  "kind": "demo",
  "items": [{
    "title": "First title",
    "characteristics": {
      "length": "short"
    }
  }, {
    "title": "Second title",
    "characteristics": {
      "length": "long"
    }
  },
  ...
  ]
}

์ด ์‘๋‹ต์€ ์„ ํƒํ•œ ํ•„๋“œ์™€ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์†ํ•œ ์ƒ์œ„ ๊ฐ์ฒด๋งŒ ํฌํ•จํ•˜๋Š” JSON ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

fields ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ๋‹ค์Œ ๋ถ€๋ถ„์—๋Š” ์‘๋‹ต์—์„œ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

fields ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ ์š”์•ฝ

fields ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’ ํ˜•์‹์€ ๋Œ€๋žต XPath ๊ตฌ๋ฌธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ตฌ๋ฌธ์€ ์•„๋ž˜์— ์š”์•ฝ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด์–ด์ง€๋Š” ์„น์…˜์—์„œ ์ถ”๊ฐ€์ ์ธ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • a ํ•„๋“œ ๋‚ด์— ์ค‘์ฒฉ๋œ b ํ•„๋“œ๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด a/b๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , b ๋‚ด์— ์ค‘์ฒฉ๋œ c ํ•„๋“œ๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด a/b/c๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ์™ธ: data: { ... }์™€ ๊ฐ™์ด ์‘๋‹ต์ด data ๊ฐ์ฒด ๋‚ด์— ์ค‘์ฒฉ๋˜๋„๋ก 'data' ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” API ์‘๋‹ต์˜ ๊ฒฝ์šฐ fields ์‚ฌ์–‘์— 'data'๋ฅผ ํฌํ•จํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•„๋“œ๋ฅผ ์ง€์ •ํ•  ๋•Œ data/a/b์™€ ๊ฐ™์ด data ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  fields๋ฅผ a/b์™€ ๊ฐ™์ด ์ง€์ •ํ•˜์„ธ์š”.

  • ๋ฐฐ์—ด ๋˜๋Š” ๊ฐ์ฒด์˜ ํŠน์ • ํ•˜์œ„ ํ•„๋“œ ์„ธํŠธ๋ฅผ ์š”์ฒญํ•˜๋ ค๋ฉด ํ•˜์œ„ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„์‹์„ ๊ด„ํ˜ธ '( )'๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ: fields=items(id,author/email)๋Š” items ๋ฐฐ์—ด์— ํฌํ•จ๋œ ๊ฐ ์š”์†Œ์˜ ํ•ญ๋ชฉ ID์™€ ์ž‘์„ฑ์ž ์ด๋ฉ”์ผ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ํ•„๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ fields=items(id)๋Š” fields=items/id์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•„๋“œ ์„ ํƒ ๊ตฌ๋ฌธ์— ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ: fields=items/pagemap/*๋Š” ํŽ˜์ด์ง€ ์ง€๋„ ๋‚ด์˜ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

fields ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์˜ ์ถ”๊ฐ€ ์˜ˆ์‹œ

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” fields ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด ์‘๋‹ต์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ชจ๋“  ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ fields ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’๋„ URL๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์˜ ์˜ˆ์‹œ์—๋Š” ๋ณด๊ธฐ ์‰ฝ๋„๋ก ์ธ์ฝ”๋”ฉ์ด ์ƒ๋žต๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๋ฐ›์„ ํ•„๋“œ ์ง€์ •(๋˜๋Š” ํ•„๋“œ ์„ ํƒ)
fields ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํ•„๋“œ ๋ชฉ๋ก์ด๋ฉฐ ๊ฐ ํ•„๋“œ๋Š” ์‘๋‹ต์˜ ๋ฃจํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ list ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‘๋‹ต์œผ๋กœ ์ปฌ๋ ‰์…˜์ด ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์‘๋‹ต์—๋Š” ๋ฆฌ์†Œ์Šค ๋ฐฐ์—ด์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•„๋“œ๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ํ•„๋“œ๊ฐ€ ๋ฐฐ์—ด(๋˜๋Š” ๋ฐฐ์—ด์˜ ์ผ๋ถ€)์ธ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ๋Š” ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ ์ค‘์—์„œ ์„ ํƒ๋œ ๋ถ€๋ถ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ปฌ๋ ‰์…˜ ์ˆ˜์ค€์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
์˜ˆ์‹œ ํšจ๊ณผ
items items ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๊ฐ ์š”์†Œ์˜ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•„๋“œ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
etag,items etag ํ•„๋“œ ๋ฐ items ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
items/title items ๋ฐฐ์—ด์— ํฌํ•จ๋œ ๋ชจ๋“  ์š”์†Œ์˜ title ํ•„๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์ฒฉ ํ•„๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฝ์šฐ ์‘๋‹ต์—๋Š” ํ•ญ์ƒ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์†ํ•œ ์ƒ์œ„ ๊ฐ์ฒด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ํ•จ๊ป˜ ์„ ํƒํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ํ•˜์œ„ ํ•„๋“œ๋Š” ์ƒ์œ„ ํ•„๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
context/facets/label context ๊ฐ์ฒด ์•„๋ž˜์— ์ค‘์ฒฉ๋œ facets ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์›์— ๋Œ€ํ•ด label ํ•„๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
items/pagemap/*/title items ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด pagemap์˜ ํ•˜์œ„ ํ•ญ๋ชฉ์ธ ๋ชจ๋“  ๊ฐ์ฒด์˜ title ํ•„๋“œ(์žˆ๋Š” ๊ฒฝ์šฐ)๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฆฌ์†Œ์Šค ์ˆ˜์ค€์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
์˜ˆ์‹œ ํšจ๊ณผ
title ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์˜ title ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
author/uri ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์—์„œ author ๊ฐ์ฒด์˜ uri ํ•˜์œ„ ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
links/*/href
links์˜ ํ•˜์œ„ ์š”์†Œ์ธ ๋ชจ๋“  ๊ฐ์ฒด์˜ href ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์œ„ ์„ ํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ํ•„๋“œ์˜ ์ผ๋ถ€๋งŒ ์š”์ฒญ
๊ธฐ๋ณธ์ ์œผ๋กœ ์š”์ฒญ์—์„œ ํŠน์ • ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด ์š”์†Œ ์ „์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŠน์ • ํ•˜์œ„ ํ•„๋“œ๋งŒ ํฌํ•จํ•˜๋Š” ์‘๋‹ต์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด '( )' ํ•˜์œ„ ์„ ํƒ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ ํšจ๊ณผ
items(title,author/uri) items ๋ฐฐ์—ด์— ํฌํ•จ๋œ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด title ๋ฐ author์˜ uri ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ์‘๋‹ต ์ฒ˜๋ฆฌ

์„œ๋ฒ„๋Š” fields ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์œ ํšจํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ HTTP 200 OK ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. fields ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ๋Š” HTTP 400 Bad Request ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํ•„๋“œ ์„ ํƒ์— ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๋ ค ์ฃผ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(์˜ˆ: "Invalid field selection a/b")๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์œ„ ์†Œ๊ฐœ ์„น์…˜์— ๋‚˜์™€ ์žˆ๋Š” ๋ถ€๋ถ„ ์‘๋‹ต์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์—์„œ๋Š” fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•  ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)

๋ถ€๋ถ„ ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

200 OK
{
  "kind": "demo",
  "items": [{
    "title": "First title",
    "characteristics": {
      "length": "short"
    }
  }, {
    "title": "Second title",
    "characteristics": {
      "length": "long"
    }
  },
  ...
  ]
}

์ฐธ๊ณ : ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ๋‚˜๋ˆ„๊ธฐ๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜(์˜ˆ: maxResults ๋ฐ nextPageToken)๋ฅผ ์ง€์›ํ•˜๋Š” API์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ํฌ๊ธฐ๋กœ ์ค„์ด์„ธ์š”. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ถ„ ์‘๋‹ต์„ ์‚ฌ์šฉํ•ด๋„ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜(๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ)

๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ํŠน์ • ํ•„๋“œ์˜ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ „์†กํ•˜๋ ค๋ฉด HTTP PATCH ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์— ์„ค๋ช…๋œ ํŒจ์น˜ ์‹œ๋งจํ‹ฑ์Šค๋Š” ์ด์ „์— ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๊ตฌํ˜„๋˜์—ˆ๋˜ GData ๊ตฌ๋ฌธ๊ณผ๋Š” ๋‹ค๋ฅด๋ฉฐ ๋” ๊ฐ„๋‹จํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์งง์€ ์˜ˆ์—์„œ๋Š” ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์—…๋ฐ์ดํŠธํ•  ๊ฒฝ์šฐ ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ตœ์†Œํ™”๋˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

์˜ˆ

์ด ์˜ˆ์‹œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ(๊ฐ€์ƒ์˜) 'Demo' API ๋ฆฌ์†Œ์Šค์˜ ์ œ๋ชฉ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ํŒจ์น˜ ์š”์ฒญ์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์ด ๋ฆฌ์†Œ์Šค์—๋Š” comment, characteristics ์„ธํŠธ, status ์™ธ ์—ฌ๋Ÿฌ ํ•„๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์ด ์š”์ฒญ์€ title ํ•„๋“œ๋งŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •๋˜๋Š” ์œ ์ผํ•œ ํ•„๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

PATCH https://www.googleapis.com/demo/v1/324
Authorization: Bearer your_auth_token
Content-Type: application/json

{
  "title": "New title"
}

์‘๋‹ต:

200 OK
{
  "title": "New title",
  "comment": "First comment.",
  "characteristics": {
    "length": "short",
    "accuracy": "high",
    "followers": ["Jo", "Will"],
  },
  "status": "active",
  ...
}

์„œ๋ฒ„์—์„œ๋Š” 200 OK ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋œ ๋ฆฌ์†Œ์Šค์˜ ์ „์ฒด ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. title ํ•„๋“œ๋งŒ ํŒจ์น˜ ์š”์ฒญ์— ํฌํ•จ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ•„๋“œ ๊ฐ’๋งŒ ์ด์ „๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ถ€๋ถ„ ์‘๋‹ต fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํŒจ์น˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์—…๋ฐ์ดํŠธ ์š”์ฒญ์˜ ํšจ์œจ์„ ํ›จ์”ฌ ๋” ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจ์น˜ ์š”์ฒญ์€ ์š”์ฒญ์˜ ํฌ๊ธฐ๋งŒ์„ ์ค„์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์‘๋‹ต์€ ์‘๋‹ต์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์ค„์ด๋ ค๋ฉด ํŒจ์น˜ ์š”์ฒญ๊ณผ fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŒจ์น˜ ์š”์ฒญ ๊ตฌ๋ฌธ

ํŒจ์น˜ ์š”์ฒญ์˜ ๋ณธ๋ฌธ์—๋Š” ์ˆ˜์ •ํ•˜๋ ค๋Š” ๋ฆฌ์†Œ์Šค ํ•„๋“œ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์‘๋‹ต์—์„œ ํ•„๋“œ๊ฐ€ ์†ํ•œ ์ƒ์œ„ ํ•ญ๋ชฉ์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์š”์ฒญ์—์„œ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•  ๋•Œ๋„ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์†ํ•œ ๋ชจ๋“  ์ƒ์œ„ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์œ„ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ถ”๊ฐ€: ๊ธฐ์กด์— ์—†๋˜ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ƒˆ ํ•„๋“œ์™€ ํ•ด๋‹น ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์ •: ๊ธฐ์กด ํ•„๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ญ์ œ: ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ  null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด "comment": null์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ „์ฒด ๊ฐ์ฒด(๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)๋ฅผ null๋กœ ์„ค์ •ํ•˜์—ฌ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Java API ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ Data.NULL_STRING์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ JSON null์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐ์—ด ์ฐธ๊ณ ์‚ฌํ•ญ: ๋ฐฐ์—ด์ด ํฌํ•จ๋œ ํŒจ์น˜ ์š”์ฒญ์€ ๊ธฐ์กด ๋ฐฐ์—ด์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ํ•ญ๋ชฉ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ-์ˆ˜์ •-์“ฐ๊ธฐ ์ฃผ๊ธฐ๋กœ ํŒจ์น˜ ์‚ฌ์šฉ

๋จผ์ € ์ˆ˜์ •ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ถ€๋ถ„ ์‘๋‹ต์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ETag๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ์šฐ If-Match HTTP ํ—ค๋”์— ํ˜„์žฌ ETag๋ฅผ ์ œ๊ณตํ•ด์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๋ฏ€๋กœ ์ด ๋ฐฉ๋ฒ•์ด ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌํ•œ ํ›„, ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒจ์น˜ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ˆ˜์ •๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ‘œ์‹œ๋ฅผ ๋ฐ˜์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฐ๋ชจ ๋ฆฌ์†Œ์Šค๊ฐ€ ETag๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

GET https://www.googleapis.com/demo/v1/324?fields=etag,title,comment,characteristics
Authorization: Bearer your_auth_token

๋‹ค์Œ์€ ๋ถ€๋ถ„ ์‘๋‹ต์ž…๋‹ˆ๋‹ค.

200 OK
{
  "etag": "ETagString"
  "title": "New title"
  "comment": "First comment.",
  "characteristics": {
    "length": "short",
    "level": "5",
    "followers": ["Jo", "Will"],
  }
}

๋‹ค์Œ ํŒจ์น˜ ์š”์ฒญ์€ ์œ„ ์‘๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ด ์š”์ฒญ์€ fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจ์น˜ ์‘๋‹ต์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œํ•œํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

PATCH https://www.googleapis.com/demo/v1/324?fields=etag,title,comment,characteristics
Authorization: Bearer your_auth_token
Content-Type: application/json
If-Match: "ETagString"
{
  "etag": "ETagString"
  "title": "",                  /* Clear the value of the title by setting it to the empty string. */
  "comment": null,              /* Delete the comment by replacing its value with null. */
  "characteristics": {
    "length": "short",
    "level": "10",              /* Modify the level value. */
    "followers": ["Jo", "Liz"], /* Replace the followers array to delete Will and add Liz. */
    "accuracy": "high"          /* Add a new characteristic. */
  },
}

์„œ๋ฒ„์—์„œ๋Š” 200 OK HTTP ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋œ ๋ฆฌ์†Œ์Šค์˜ ๋ถ€๋ถ„ ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

200 OK
{
  "etag": "newETagString"
  "title": "",                 /* Title is cleared; deleted comment field is missing. */
  "characteristics": {
    "length": "short",
    "level": "10",             /* Value is updated.*/
    "followers": ["Jo" "Liz"], /* New follower Liz is present; deleted Will is missing. */
    "accuracy": "high"         /* New characteristic is present. */
  }
}

ํŒจ์น˜ ์š”์ฒญ ์ง์ ‘ ์ž‘์„ฑ

์ผ๋ถ€ ํŒจ์น˜ ์š”์ฒญ์˜ ๊ฒฝ์šฐ ์ด์ „์— ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๊ธฐ์กด ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ์žƒ๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋จผ์ € ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ API์—์„œ ETag๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ด์ „์˜ ETag ๊ฐ’์„ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ETag๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ "If-Match: *" HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจ์น˜๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์“ฐ๊ธฐ ์ „์— ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ํŒจ์น˜ ์š”์ฒญ์„ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•„๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์ƒˆ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํŒจ์น˜ ์š”์ฒญ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PATCH https://www.googleapis.com/demo/v1/324?fields=comment,characteristics
Authorization: Bearer your_auth_token
Content-Type: application/json

{
  "comment": "A new comment",
  "characteristics": {
    "volume": "loud",
    "accuracy": null
  }
}

์ด ์š”์ฒญ์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ comment ํ•„๋“œ์— ๊ธฐ์กด ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์ด ๊ธฐ์กด ๊ฐ’์„ ๋ฎ์–ด์“ฐ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด comment ํ•„๋“œ๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณผ๋ฅจ(volume) ํŠน์„ฑ์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฐ’์ด ๋ฎ์–ด์จ์ง€๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ accuracy ํ•„๋“œ๋Š” ์„ค์ •๋œ ๊ฒฝ์šฐ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

ํŒจ์น˜์— ๋Œ€ํ•œ ์‘๋‹ต ์ฒ˜๋ฆฌ

API๋Š” ์˜ฌ๋ฐ”๋ฅธ ํŒจ์น˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ 200 OK HTTP ์‘๋‹ต ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ˆ˜์ •๋œ ๋ฆฌ์†Œ์Šค์˜ ์ „์ฒด ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. API์— ETag๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” PUT์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒจ์น˜ ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉด ์„œ๋ฒ„์—์„œ ETag ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

fields ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์ค„์ด์ง€ ์•Š์œผ๋ฉด ํŒจ์น˜ ์š”์ฒญ์—์„œ ์ „์ฒด ๋ฆฌ์†Œ์Šค ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํŒจ์น˜ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค ์ƒํƒœ์˜ ๊ตฌ๋ฌธ ๋˜๋Š” ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„์—์„œ 400 Bad Request ๋˜๋Š” 422 Unprocessable Entity HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋ฆฌ์†Œ์Šค ์ƒํƒœ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ฑ„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•„์ˆ˜ ํ•„๋“œ์˜ ๊ฐ’์„ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

PATCH HTTP ๋™์‚ฌ๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋Œ€์ฒด ํ‘œ๊ธฐ๋ฒ•

๋ฐฉํ™”๋ฒฝ์—์„œ HTTP PATCH ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด HTTP POST ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๊ณ  ์žฌ์ •์˜ ํ—ค๋”๋ฅผ PATCH๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

POST https://www.googleapis.com/...
X-HTTP-Method-Override: PATCH
...

ํŒจ์น˜์™€ ์—…๋ฐ์ดํŠธ์˜ ์ฐจ์ด์ 

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

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ œ๊ณตํ•˜๋ฉด ๋˜๋ฉฐ, ์ƒ๋žตํ•œ ํ•„๋“œ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์š”์†Œ ๋˜๋Š” ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ์—๋งŒ ์ด ๊ทœ์น™์— ์˜ˆ์™ธ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋‘ ์ƒ๋žตํ•˜๋ฉด ์ด์ „ ์ƒํƒœ๊ฐ€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ณ , ์ด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ œ๊ณตํ•˜๋ฉด ์ „์ฒด ์„ธํŠธ๊ฐ€ ์ œ๊ณตํ•œ ์„ธํŠธ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.