์ด ๋ฌธ์์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ ๋ช ๊ฐ์ง ๊ธฐ์ ์ ๋ํด ์ค๋ช ํฉ๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ 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
๋์ฌ๋ฅผ ์ฌ์ฉํ๋ ์
๋ฐ์ดํธ์ ๊ฒฝ์ฐ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ์์ฒญ์ด ์คํจํ๊ณ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ์ด์ ์ ์ค์ ํ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ํจ์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์์ ํฉ๋๋ค. ๋ณ๊ฒฝํ๋ ค๋ ํ๋์ ๋ฐ์ดํฐ๋ง ์ ๊ณตํ๋ฉด ๋๋ฉฐ, ์๋ตํ ํ๋๋ ์ญ์ ๋์ง ์์ต๋๋ค. ๋ฐ๋ณต ์์ ๋๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ์๋ง ์ด ๊ท์น์ ์์ธ๊ฐ ์ ์ฉ๋ฉ๋๋ค. ์ฆ, ๋ชจ๋ ์๋ตํ๋ฉด ์ด์ ์ํ๊ฐ ๊ทธ๋๋ก ์ ์ง๋๊ณ , ์ด ์ค ํ๋๋ผ๋ ์ ๊ณตํ๋ฉด ์ ์ฒด ์ธํธ๊ฐ ์ ๊ณตํ ์ธํธ๋ก ๋์ฒด๋ฉ๋๋ค.