| ์ธํฐ๋ท ์์ง๋์ด๋ง ํ์คํฌ ํฌ์ค(IETF) | L. Dusseault |
| Request for Comments: 5789 | Linden Lab |
| ์นดํ ๊ณ ๋ฆฌ: Standards Track | J. Snell |
| ISSN: 2070-1721 | 2010๋ 3์ |
HTTP์ฉ PATCH ๋ฉ์๋
์์ฝ
ํ์ดํผํ ์คํธ ์ ์ก ํ๋กํ ์ฝ(HTTP)์ ํ์ฅํ๋ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ถ๋ถ์ ์ธ ๋ฆฌ์์ค ์์ ์ ์ํํ๋ ๊ธฐ๋ฅ์ ํ์๋ก ํฉ๋๋ค. ๊ธฐ์กด์ HTTP PUT ๋ฉ์๋๋ ๋ฌธ์์ ์ ์ฒด ๊ต์ฒด๋ง ํ์ฉํฉ๋๋ค. ๋ณธ ์ ์์ ๊ธฐ์กด์ HTTP ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ธฐ ์ํด PATCH๋ผ๋ ์๋ก์ด HTTP ๋ฉ์๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ด ๋ฉ๋ชจ์ ์ํ
์ด ๋ฌธ์๋ ์ธํฐ๋ท ํ์ค ํธ๋ ๋ฌธ์์ ๋๋ค.
์ด ๋ฌธ์๋ ์ธํฐ๋ท ์์ง๋์ด๋ง ํ์คํฌ ํฌ์ค(IETF)์ ์ฐ๋ฌผ์ ๋๋ค. ์ด๋ IETF ์ปค๋ฎค๋ํฐ์ ํฉ์๋ฅผ ๋ฐ์ํฉ๋๋ค. ๊ณต๊ฐ ๊ฒํ ๋ฅผ ๊ฑฐ์ณค์ผ๋ฉฐ ์ธํฐ๋ท ์์ง๋์ด๋ง ์ด์ ๊ทธ๋ฃน(IESG)์ ์ํด ์ถํ ์น์ธ์ ๋ฐ์์ต๋๋ค. ์ธํฐ๋ท ํ์ค์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ RFC 5741์ ์น์ 2์์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์์ ํ์ฌ ์ํ, ์ ์คํ, ๋ฐ ์ด์ ๋ํ ํผ๋๋ฐฑ ์ ๊ณต ๋ฐฉ๋ฒ์ ๊ดํ ์ ๋ณด๋ http://www.rfc-editor.org/info/rfc5789์์ ํ์ธํ ์ ์์ต๋๋ค.
Copyright Notice
Copyright (c) 2010 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
1. ์๊ฐ
์ด ๋ช ์ธ์๋ ๋ฆฌ์์ค์ ๋ถ๋ถ ์์ ์ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์๋ก์ด HTTP/1.1 [RFC2616] ๋ฉ์๋์ธ PATCH๋ฅผ ์ ์ํฉ๋๋ค.
์ํธ์ด์ฉ์ฑ์ ๊ฐ์ ํ๊ณ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ก์ด ๋ฉ์๋๊ฐ ํ์ํฉ๋๋ค. PUT ๋ฉ์๋๋ ์ด๋ฏธ ๋ฌธ์๋ฅผ ์ ์ฒด ์ ๋ณธ๋ฌธ์ผ๋ก ๋ฎ์ด์ฐ๋๋ก ์ ์๋์ด ์์ด ๋ถ๋ถ ๋ณ๊ฒฝ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋ก์์ ์บ์, ์ฌ์ง์ด ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ์ฐ์ฐ ๊ฒฐ๊ณผ์ ๋ํด ํผ๋ํ ์ ์์ต๋๋ค. POST๋ ์ด๋ฏธ ์ฌ์ฉ๋๊ณ ์์ง๋ง ๊ด๋ฒ์ํ ์ํธ์ด์ฉ์ฑ์ ๊ฐ์ถ๊ณ ์์ง ์์ต๋๋ค(์: ํจ์น ํ์ ์ง์์ ๋ฐ๊ฒฌํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ด ์์). PATCH๋ ์ด์ HTTP ๋ช ์ธ์์ ์ธ๊ธ๋์์ง๋ง ์์ ํ๊ฒ ์ ์๋์ง๋ ์์์ต๋๋ค.
์ด ๋ฌธ์์์ ํต์ฌ ๋จ์ด "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", ๋ฐ "OPTIONAL"์ [RFC2119]์ ์ค๋ช ๋ ๋๋ก ํด์๋ฉ๋๋ค.
๋ํ, ์ด ๋ฌธ์๋ [RFC2616]์ ์น์ 2.1์ ์ ์๋ ABNF ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
2. PATCH ๋ฉ์๋
PATCH ๋ฉ์๋๋ ์์ฒญ ์ํฐํฐ์ ๊ธฐ์ ๋ ๋ณ๊ฒฝ ์งํฉ์ Request-URI๋ก ์๋ณ๋ ๋ฆฌ์์ค์ ์ ์ฉํ๋๋ก ์์ฒญํฉ๋๋ค. ๋ณ๊ฒฝ ์งํฉ์ ๋ฏธ๋์ด ํ์ ์ผ๋ก ์๋ณ๋๋ "ํจ์น ๋ฌธ์"๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ์์ผ๋ก ํํ๋ฉ๋๋ค. Request-URI๊ฐ ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ๊ฐ๋ฆฌํค์ง ์๋ ๊ฒฝ์ฐ, ์๋ฒ๋ ํจ์น ๋ฌธ์ ํ์(๋ ๋ฆฌ์์ค๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์์ ํ ์ ์๋์ง ์ฌ๋ถ)๊ณผ ๊ถํ ๋ฑ์ ๋ฐ๋ผ ์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค(MAY).
PUT ์์ฒญ๊ณผ PATCH ์์ฒญ์ ์ฐจ์ด๋ ์๋ฒ๊ฐ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ธฐ ์ํด ํฌํจ๋ ์ํฐํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์์ ๋ฐ์๋ฉ๋๋ค. PUT ์์ฒญ์์๋ ํฌํจ๋ ์ํฐํฐ๊ฐ ์์ ์๋ฒ์ ์ ์ฅ๋ ๋ฆฌ์์ค์ ์์ ๋ ๋ฒ์ ์ผ๋ก ๊ฐ์ฃผ๋์ด, ํด๋ผ์ด์ธํธ๋ ์ ์ฅ๋ ๋ฒ์ ์ ๊ต์ฒด๋ฅผ ์์ฒญํฉ๋๋ค. ๋ฐ๋ฉด PATCH์์๋ ํฌํจ๋ ์ํฐํฐ๊ฐ ์์ ์๋ฒ์ ํ์ฌ ์กด์ฌํ๋ ๋ฆฌ์์ค๋ฅผ ์๋ก์ด ๋ฒ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ์ด๋ป๊ฒ ์์ ํด์ผ ํ๋์ง๋ฅผ ์ค๋ช ํ๋ ๋ช ๋ น ์งํฉ์ ํฌํจํฉ๋๋ค. PATCH ๋ฉ์๋๋ Request-URI๋ก ์๋ณ๋ ๋ฆฌ์์ค์ ์ํฅ์ ์ฃผ๋ฉฐ, ๋ํ ๋ค๋ฅธ ๋ฆฌ์์ค์ ๋ถ์์ฉ์ ๊ฐ์ง ์๋ ์์ต๋๋ค; ์ฆ, PATCH ์ ์ฉ์ผ๋ก ์ ๋ฆฌ์์ค๊ฐ ์์ฑ๋๊ฑฐ๋ ๊ธฐ์กด ๋ฆฌ์์ค๊ฐ ์์ ๋ ์ ์์ต๋๋ค.
PATCH๋ [RFC2616] ์น์ 9.1์์ ์ ์๋ ๋ฐ์ ๊ฐ์ด ์์ ๋(safe)๋ ๋ฉฑ๋ฑ(idempotent)์ด ์๋๋๋ค.
PATCH ์์ฒญ์ ๋ฉฑ๋ฑํ๊ฒ ๋ฐํ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ ์ฌํ ์์ ์ ๋์ผํ ๋ฆฌ์์ค์ ๋ํ ๋ ๊ฐ์ PATCH ์์ฒญ์ด ์ถฉ๋ํ ๋ ๋ฐ์ํ ์ ์๋ ์ข์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฌ๋ฌ PATCH ์์ฒญ์ผ๋ก ์ธํ ์ถฉ๋์ ์ผ๋ถ ํจ์น ํ์์ด ์๋ ค์ง ๊ธฐ์ค์ (base-point)์์ ๋์ํด์ผ ํ๊ฑฐ๋ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฆฌ์์ค๋ฅผ ์์์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ PUT ์ถฉ๋๋ณด๋ค ๋ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจ์น ์ ์ฉ์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ์์์ด ํด๋ผ์ด์ธํธ๊ฐ ๋ง์ง๋ง์ผ๋ก ์ ๊ทผํ ์ดํ ์ ๋ฐ์ดํธ๋์์ ๊ฒฝ์ฐ ์์ฒญ์ด ์คํจํ๋๋ก ํ๋ ์กฐ๊ฑด๋ถ ์์ฒญ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค(SHOULD). ์๋ฅผ ๋ค์ด, ํด๋ผ์ด์ธํธ๋ PATCH ์์ฒญ์ If-Match ํค๋์ ๊ฐํ ETag๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ก๊ทธ ํ์ผ์ ํ ์คํธ ๋ผ์ธ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ถฉ๋ํ์ง ์๋ ํ์ ์ถ๊ฐํ๋ ๋ฑ ํจ์น ํ์์ด ์๋ ค์ง ๊ธฐ์ค์ ์์ ๋์ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฉฐ, ์ด๋ฐ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ ์์ฒญ์์ ๋์ผํ ์ฃผ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์๋ฒ๋ ์ ์ฒด ๋ณ๊ฒฝ ์งํฉ์ ์์์ ์ผ๋ก ์ ์ฉํด์ผ ํ๋ฉฐ(์: ์ด ์์ ๋์ค GET์ ์๋ตํ ๋) ๋ถ๋ถ์ ์ผ๋ก ์์ ๋ ํํ์ ์ ๊ณตํด์๋ ์ ๋ฉ๋๋ค. ํจ์น ๋ฌธ์๋ฅผ ์ ์ฒด์ ์ผ๋ก ์ฑ๊ณต์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ๊ฒฝ์ฐ, ์๋ฒ๋ ์ด๋ค ๋ณ๊ฒฝ๋ ์ ์ฉํด์๋ ์ ๋ฉ๋๋ค. PATCH์ ์ฑ๊ณต์ ๋ฌด์์ผ๋ก ์ ์ํ ์ง๋ ํจ์น ๋ฌธ์์ ์์ ๋๋ ๋ฆฌ์์ค ์ ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ฐ์ ์ธ 'diff' ์ ํธ๋ฆฌํฐ๋ ๋๋ ํฐ๋ฆฌ ๊ณ์ธต์ ์ฌ๋ฌ ํ์ผ์ ์ ์ฉ๋๋ ํจ์น ๋ฌธ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์์์ฑ ์๊ตฌ์ฌํญ์ ๋ชจ๋ ์ง์ ์ํฅ์ ๋ฐ๋ ํ์ผ์ ๋ํด ์ ์ฉ๋ฉ๋๋ค. ์ํ ์ฝ๋ ๋ฐ ๊ฐ๋ฅํ ์ค๋ฅ ์กฐ๊ฑด์ ๋ํ ์ธ๋ถ์ฌํญ์ "์ค๋ฅ ์ฒ๋ฆฌ", ์น์ 2.2๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์์ฒญ์ด ์บ์๋ฅผ ํต๊ณผํ๊ณ Request-URI๊ฐ ํ๋ ์ด์์ ํ์ฌ ์บ์๋ ์ํฐํฐ๋ฅผ ์๋ณํ๋ ๊ฒฝ์ฐ, ํด๋น ์ํธ๋ฆฌ๋ ์ค๋๋ ๊ฒ์ผ๋ก ์ทจ๊ธ๋์ด์ผ ํฉ๋๋ค(SHOULD). ์ด ๋ฉ์๋์ ๋ํ ์๋ต์ ๋ช ์์ ์ ์ ๋ ์ ๋ณด(์: Expires ํค๋ ๋๋ "Cache-Control: max-age" ์ง์์)์ ํจ๊ป Content-Location ํค๋๊ฐ Request-URI์ ์ผ์นํ์ฌ PATCH ์๋ต ๋ณธ๋ฌธ์ด ๋ฆฌ์์ค ํํ์์ ๋ํ๋ด๋ ๊ฒฝ์ฐ์๋ง ์บ์ ๊ฐ๋ฅ(cacheable)ํฉ๋๋ค. ์บ์๋ PATCH ์๋ต์ ์ดํ์ GET ๋ฐ HEAD ์์ฒญ์ ์๋ตํ๋ ๋ฐ๋ง ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ฉ์๋(ํนํ PATCH)์ ์๋ตํ๋ ๋ฐ๋ ์ฌ์ฉ๋์ด์๋ ์ ๋ฉ๋๋ค.
์์ฒญ์ ํฌํจ๋ ์ํฐํฐ-ํค๋๋ ํฌํจ๋ ํจ์น ๋ฌธ์์๋ง ์ ์ฉ๋๋ฉฐ ์์ ๋๋ ๋ฆฌ์์ค์ ์ ์ฉ๋์ด์๋ ์ ๋ฉ๋๋ค(MUST NOT). ๋ฐ๋ผ์ ์์ฒญ์ Content-Language ํค๋๊ฐ ์์ ์ ์์ง๋ง, ์ด๋ ํจ์น ๋ฌธ์๊ฐ ํน์ ์ธ์ด๋ฅผ ๊ฐ์ง์ ์๋ฏธํ ๋ฟ์ ๋๋ค. ์๋ฒ๋ ์ด๋ฌํ ํค๋๋ฅผ ์ถ์ ์ ๋ณด๋ก๋ง ์ ์ฅํด์ผ ํ๋ฉฐ(SHOULD), PUT ์์ฒญ์์ ์ฌ์ฉ๋ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ํค๋ ๊ฐ์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด ๋ฌธ์๋ ํค๋๋ฅผ ํตํด ๋ฌธ์์ Content-Type ๋๋ Content-Language ๊ฐ์ ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋ช ์ํ์ง ์์ต๋๋ค. ๋ค๋ง ํจ์น ๋ฌธ์๋ฅผ ํตํด ์ด ๋ชฉํ๋ฅผ ๋ฌ์ฑํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ด ์ค๊ณ๋ ์ ์์ต๋๋ค.
๋ฆฌ์์ค๋ฅผ PATCH๋ก ์์ ํ ์ ์๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค. ๋ํ ์๋ก ๋ค๋ฅธ ํจ์น ๋ฌธ์ ํ์์ด ์๋ก ๋ค๋ฅธ ์ ํ์ ๋ฆฌ์์ค์ ์ ํฉํ ๊ฒ์ด๊ณ ๋จ์ผ ํ์์ด ๋ชจ๋ ๋ฆฌ์์ค ์ ํ์ ์ ํฉํ์ง ์์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ตฌํ์ฒด๊ฐ ๋ฐ๋์ ์ง์ํด์ผ ํ๋ ๋จ์ผ ๊ธฐ๋ณธ ํจ์น ๋ฌธ์ ํ์์ ์์ต๋๋ค. ์๋ฒ๋ ์์ ๋ ํจ์น ๋ฌธ์๊ฐ Request-URI๋ก ์๋ณ๋ ๋ฆฌ์์ค ์ ํ์ ์ ํฉํ์ง ํ์ธํด์ผ ํฉ๋๋ค(MUST).
ํด๋ผ์ด์ธํธ๋ PATCH ๋์ ์ธ์ PUT์ ์ฌ์ฉํ ์ง ์ ํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํจ์น ๋ฌธ์์ ํฌ๊ธฐ๊ฐ PUT์ ์ฌ์ฉํ ์ ๋ฆฌ์์ค ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ PATCH ๋์ PUT์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ์ ํ ์ ์์ต๋๋ค. POST์์ ๋น๊ต๋ ๋ ์ด๋ ค์ด๋ฐ, POST๋ ๋งค์ฐ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ์๋ฒ๊ฐ ์ ํํ๋ฉด PUT ๋ฐ PATCH ์ ์ฌ ๋์์ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ ์ด Request-URI๋ก ์๋ณ๋ ๋ฆฌ์์ค๋ฅผ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์์ ํ์ง ์๋ ๊ฒฝ์ฐ์๋ PATCH๋ PUT ๋์ POST๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
2.1. ๊ฐ๋จํ PATCH ์
PATCH /file.txt HTTP/1.1 Host: www.example.com Content-Type: application/example If-Match: "e0023aa4e" Content-Length: 100 [description of changes]
์ด ์์๋ ๊ธฐ์กด ๋ฆฌ์์ค์ ๊ฐ์์ ํจ์น ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๊ธฐ์กด ํ ์คํธ ํ์ผ์ ๋ํ ์ฑ๊ณต์ ์ธ PATCH ์๋ต:
HTTP/1.1 204 No Content Content-Location: /file.txt ETag: "e0023aa4f"
์๋ต์ด ๋ฉ์์ง ๋ณธ๋ฌธ์ ํฌํจํ์ง ์์ผ๋ฏ๋ก(200 ์๋ต๊ณผ ๋ฌ๋ฆฌ) 204 ์๋ต ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค๋ฅธ ์ฑ๊ณต ์ฝ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ํ ETag ์๋ต ํค๋ ํ๋๋ Content-Location ์๋ต ํค๋ ํ๋๋ก ํ์๋ ๋๋ก http://www.example.com/file.txt์์ PATCH๋ฅผ ์ ์ฉํ์ฌ ์์ฑ๋ ์ํฐํฐ์ ETag๋ฅผ ํฌํจํฉ๋๋ค.
2.2. ์ค๋ฅ ์ฒ๋ฆฌ
PATCH ์์ฒญ์ด ์คํจํ ์ ์๋ ์ฌ๋ฌ ์๋ ค์ง ์กฐ๊ฑด์ด ์์ต๋๋ค.
- ์๋ชป๋ ํจ์น ๋ฌธ์ ํ์:
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ ํจ์น ๋ฌธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ๋์ง ์์๋ค๊ณ ํ๋จํ๋ ๊ฒฝ์ฐ, 400 (Bad Request) ์๋ต์ ๋ฐํํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค(SHOULD). ์๋ชป๋ ํ์์ ์ ์๋ ์ ํ๋ ํจ์น ๋ฌธ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
- ์ง์๋์ง ์๋ ํจ์น ๋ฌธ์:
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๊ฐ Request-URI๋ก ์๋ณ๋ ๋ฆฌ์์ค์ ๋ํด ์ง์ํ์ง ์๋ ํจ์น ๋ฌธ์ ํ์์ ๋ณด๋ธ ๊ฒฝ์ฐ, 415 (Unsupported Media Type) ์๋ต์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๋ต์๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ง์๋๋ ํจ์น ๋ฌธ์ ๋ฏธ๋์ด ํ์ ์ ์๋ฆฌ๊ธฐ ์ํด ์น์ 3.1์ ์ค๋ช ๋ Accept-Patch ์๋ต ํค๋๋ฅผ ํฌํจํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค(SHOULD).
- ์ฒ๋ฆฌ ๋ถ๊ฐ ์์ฒญ:
- ์๋ฒ๊ฐ ํจ์น ๋ฌธ์๋ฅผ ์ดํดํ๊ณ ๋ฌธ์์ ๊ตฌ๋ฌธ์ด ์ ํจํด ๋ณด์ด์ง๋ง ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ์๋ 422 (Unprocessable Entity) ์๋ต([RFC4918] ์น์ 11.2)์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ์ฑ๋ XML ๋ฌธ์๋ฅผ ๋ ์ด์ ์ ํ์ฑ๋์ง ์๊ฒ ๋ง๋๋ ์์ ์ ์๋ํ๋ ๊ฒฝ์ฐ ๋ฑ์ด ์ด์ ํด๋นํฉ๋๋ค. ๋ํ "์ถฉ๋ ์ํ(Conflicting State)"์ ๊ฐ์ ๋ ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ๊ฐ ์ด ์ํ ์ฝ๋๋ก ์ ํธ๋ ์ ์์ง๋ง, ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ์ฉํฉ๋๋ค.
- ๋ฆฌ์์ค ์์:
- ํด๋ผ์ด์ธํธ๊ฐ ์กด์ฌํ์ง ์๋ ๋ฆฌ์์ค์ ํจ์น ๋ฌธ์๋ฅผ ์ ์ฉํ๋ ค๊ณ ์๋ํ์ผ๋ ์ ํ๋ ํจ์น ๋ฌธ์๊ฐ ์กด์ฌํ์ง ์๋ ๋ฆฌ์์ค์ ์ ์ฉ๋ ์ ์๋ ๊ฒฝ์ฐ 404 (Not Found) ์ํ ์ฝ๋๋ก ์ง์ ํ ์ ์์ต๋๋ค.
- ์ํ ์ถฉ๋:
- ์์ฒญ์ด ๋ฆฌ์์ค์ ์ํ๋ก ์ธํด ์ ์ฉ๋ ์ ์๋ ๊ฒฝ์ฐ 409 (Conflict) ์ํ ์ฝ๋๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์กฐ์ ์์ ์ ์๋ํ๋๋ฐ ์์๋๋ ๊ตฌ์กฐ๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ(XML์ ๊ฒฝ์ฐ 'foo' ์์๋ฅผ 'bar'๋ก ๋ณ๊ฒฝํ๋ผ๋ ํจ์น๊ฐ ์์ง๋ง 'foo' ์์๊ฐ ์กด์ฌํ์ง ์์ ์ ์์)๊ฐ ์ด์ ํด๋นํฉ๋๋ค.
- ์์ ์ถฉ๋:
- ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ ์กฐ๊ฑด์ ์ ์ํ๊ธฐ ์ํด If-Match ๋๋ If-Unmodified-Since ํค๋๋ฅผ ์ฌ์ฉํ๊ณ ๊ทธ ์ฌ์ ์กฐ๊ฑด์ด ์คํจํ ๊ฒฝ์ฐ, 412 (Precondition Failed)๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๊ฐ์ฅ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญ์ ์ฌ์ ์กฐ๊ฑด์ด ์์๋ค๋ฉด ์ด ์๋ต์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์๋ฒ๊ฐ ๊ฐ๋ฅํ ์ถฉ๋ ์์ ์ ๊ฐ์งํ๊ณ ์์ฒญ์ ์ฌ์ ์กฐ๊ฑด์ด ์ ์๋์ง ์์ ๊ฒฝ์ฐ, ์๋ฒ๋ 409 (Conflict) ์๋ต์ ๋ฐํํ ์ ์์ต๋๋ค.
- ๋์ ์์ :
- PATCH์ ์ผ๋ถ ์ ์ฉ์ ์๋ฒ๊ฐ ์์ฒญ์ ์์ ๋ ์์๋๋ก ์ฒ๋ฆฌํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์ด๋ฌํ ์ ์ฝ ํ์ ์ด์๋๊ณ ์๊ณ ๋์ผ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ธฐ ์ํ ๋์ ์์ฒญ์ ๋ฐ์์ผ๋ ํด๋น ์์ฒญ์ ํ์ํ ์ ์๋ ๊ฒฝ์ฐ, ์๋ฒ๋ 409 (Conflict) ์๋ต์ผ๋ก ์ด ์ค๋ฅ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
409 Conflict ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ๋น๊ต์ ์ผ๊ด๋ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ํจ์น ํ์์ ํน์ฑ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ๊ทธ๋๋ก ์ฌ์ ์กํ ์ ์๊ฑฐ๋(์: ๋ก๊ทธ ํ์ผ์ ๋ผ์ธ์ ์ถ๊ฐํ๋ ์ง์), ํจ์น๋ฅผ ์ฌ๊ณ์ฐํ๊ธฐ ์ํด ๋ฆฌ์์ค ์ฝํ ์ธ ๋ฅผ ๋ค์ ๊ฐ์ ธ์์ผ ํ๊ฑฐ๋, ์์ ์ด ์คํจํ์ฌ ์ฌ์ฉ์ ํ์ธ์ด ํ์ํ ์ ์์ต๋๋ค.
์ ์ ํ ์ํฉ์์๋ ๋ค๋ฅธ HTTP ์ํ ์ฝ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค๋ฅ ์๋ต์ ์ํฐํฐ ๋ณธ๋ฌธ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ค๋ฅ์ ์ฑ๊ฒฉ์ ์ ๋ฌํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค(SHOULD). ์๋ต ์ํฐํฐ์ Content-Type์ ๊ตฌํ๋ง๋ค ๋ค๋ฅผ ์ ์์ต๋๋ค.
3. OPTIONS์์์ ์ง์ ๊ด๊ณ
์๋ฒ๋ HTTP/1.1์์ ์ ์๋ "Allow" OPTIONS ์๋ต ํค๋์ ํ์ฉ๋ ๋ฉ์๋ ๋ชฉ๋ก์ PATCH๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ PATCH ์ง์์ ๊ด๊ณ ํ ์ ์์ต๋๋ค. Accept-Patch ํค๋๊ฐ ์๋๋ผ๋ PATCH ๋ฉ์๋๋ "Allow" ํค๋์ ๋ํ๋ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ํ์ฉ๋ ํจ์น ๋ฌธ์ ๋ชฉ๋ก์ ๊ด๊ณ ๋์ง ์์ต๋๋ค.
3.1. Accept-Patch ํค๋
์ด ๋ช ์ธ์๋ ์๋ฒ๊ฐ ์์ฉํ๋ ํจ์น ๋ฌธ์ ํ์์ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๋ก์ด ์๋ต ํค๋ Accept-Patch๋ฅผ ๋์ ํฉ๋๋ค. Accept-Patch๋ PATCH ๋ฉ์๋ ์ฌ์ฉ์ ์ง์ํ๋ ๋ชจ๋ ๋ฆฌ์์ค์ OPTIONS ์๋ต์ ๋ํ๋๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค(SHOULD). ์ด๋ค ๋ฉ์๋์ ๋ํ ์๋ต์์ Accept-Patch ํค๋๊ฐ ์กด์ฌํ๋ฉด ์ด๋ ์๋ฌต์ ์ผ๋ก Request-URI๋ก ์๋ณ๋ ๋ฆฌ์์ค์์ PATCH๊ฐ ํ์ฉ๋จ์ ๋ํ๋ ๋๋ค. ์ด ํค๋์ ํน์ ํจ์น ๋ฌธ์ ํ์์ด ์กด์ฌํ๋ฉด ํด๋น ํ์์ด Request-URI๋ก ์๋ณ๋ ๋ฆฌ์์ค์์ ํ์ฉ๋๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
Accept-Patch = "Accept-Patch" ":" 1#media-type
Accept-Patch ํค๋๋ [RFC2616] ์น์ 3.7์ ์ ์๋ ๋๋ก ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ฏธ๋์ด ํ์ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค.
์:
Accept-Patch: text/example;charset=utf-8
3.2. ์์ OPTIONS ์์ฒญ ๋ฐ ์๋ต
[request]
OPTIONS /example/buddies.xml HTTP/1.1 Host: www.example.com
[response]
HTTP/1.1 200 OK Allow: GET, PUT, POST, OPTIONS, HEAD, DELETE, PATCH Accept-Patch: application/example, text/example
์์๋ ์๋ฒ๊ฐ ์ผ๋ฐ์ ์ผ๋ก PATCH๋ฅผ ์ง์ํ๋ฉฐ ๋ ๊ฐ์ง ๊ฐ์์ ํจ์น ๋ฌธ์ ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
4. IANA ๊ณ ๋ ค์ฌํญ
4.1. Accept-Patch ์๋ต ํค๋
Accept-Patch ์๋ต ํค๋๊ฐ ์๊ตฌ ๋ ์ง์คํธ๋ฆฌ์ ์ถ๊ฐ๋์์ต๋๋ค(์์ธํ ๋ด์ฉ์ [RFC3864] ์ฐธ์กฐ).
- ํค๋ ํ๋ ์ด๋ฆ:
- Accept-Patch
- ์ ์ฉ ํ๋กํ ์ฝ:
- HTTP
- ์ ์/๋ณ๊ฒฝ ์ ์ด์:
- IETF
- ๋ช ์ธ ๋ฌธ์:
- ๋ณธ ๋ช ์ธ์
5. ๋ณด์ ๊ณ ๋ ค์ฌํญ
PATCH์ ๋ํ ๋ณด์ ๊ณ ๋ ค์ฌํญ์ PUT์ ๋ํ ๋ณด์ ๊ณ ๋ ค์ฌํญ([RFC2616] ์น์ 9.6)๊ณผ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์ฒญ ๊ถํ ๋ถ์ฌ(์ก์ธ์ค ์ ์ด๋ ์ธ์ฆ์ ํตํด) ๋ฐ ์ ์ก ์ค๋ฅ๋ ์ฐ๋ฐ์ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์์๋์ง ์๋๋ก ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. PUT์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฉ์ปค๋์ฆ์ PATCH์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์ ๊ณ ๋ ค์ฌํญ๋ค์ ํนํ PATCH์ ์ ์ฉ๋ฉ๋๋ค.
ํจ์น๋ ๋ฌธ์๋ ์ ์ฒด๋ฅผ ๋ฎ์ด์ฐ๋ ๋ฌธ์๋ณด๋ค ์์๋ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ ์ ์์ง๋ง, ์ด๋ ์น์ 2์์ ์ค๋ช ๋ ๋๋ก ETag์ If-Match ์์ฒญ ํค๋๋ฅผ ์ฌ์ฉํ๋ ์กฐ๊ฑด๋ถ ์์ฒญ๊ณผ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. PATCH ์์ฒญ์ด ์คํจํ๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ฆฌ์์ค ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด GET ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์ผ๋ถ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ PATCH ์์ฒญ์ ์ฌ์ ์กํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ฆฌ์์ค ๋ด์ฉ์ ๊ฒ์ฌํ ์ ์์ง๋ง, ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์๋๊ฐ ์คํจํ๊ณ /๋๋ ์ฌ์ฉ์๊ฐ ์๋๋ฅผ ํ์ธํด์ผ ํ ์ ์์ต๋๋ค. ์ ์ก ์ฑ๋์ ์คํจ๋ก ์ธํด PATCH ์๋ต์ด ์ฑ๋ ์คํจ ๋๋ ์๊ฐ ์ด๊ณผ ์ ์ ์์ ๋์ง ์์ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ด ์ ์ฉ๋์๋์ง ํ์ธํ๊ธฐ ์ํด GET ์์ฒญ์ ๋ฐํํด์ผ ํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ GET ์์ฒญ์ด ์บ์๋ฅผ ์ฐํํ๋๋ก HTTP ๋ช ์ธ์ ์ค๋ช ๋ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋๋ก ํ ์ ์์ต๋๋ค(์: [RFC2616] ์น์ 13.1.6 ์ฐธ์กฐ).
๋๋๋ก HTTP ์ค๊ฐ์๋ PUT/POST ์์ฒญ์ ๋ณธ๋ฌธ์ด๋ GET ์๋ต์ ๊ฒ์ฌํ์ฌ ์ ์ก๋๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ํ์งํ๋ ค๊ณ ํ ์ ์์ต๋๋ค. PATCH ๋ฉ์๋๋ ์์ค ๋ฌธ์๋ ํจ์น ๋ฌธ์ ์์ฒด๊ฐ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์ ์์ง๋ง ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ด๋ฌ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฐ์๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค. ์ด ๋ณด์ ๊ณ ๋ ค์ฌํญ์ ๋ฐ์ดํธ ๋ฒ์ ๋ค์ด๋ก๋, ํจ์น ๋ฌธ์ ๋ค์ด๋ก๋, ์์ถ๋(zip) ํ์ผ ์ ๋ก๋ ๋ฑ ์ด๋ฏธ ๋์ ๋ ๊ฒ๋ค๊ณผ ์ค์ง์ ์ผ๋ก ๋ค๋ฅด์ง ์์ต๋๋ค.
๊ฐ๋ณ ํจ์น ๋ฌธ์๋ ํจ์น๋๋ ๋ฆฌ์์ค ์ ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ณ ์ ํ ๋ณด์ ๊ณ ๋ ค์ฌํญ์ ๊ฐ์ง ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ด๋๋ฆฌ ๋ฆฌ์์ค๋ฅผ ํจ์นํ๋ ๊ฒฝ์ฐ์ XML ๋ฌธ์๋ฅผ ํจ์นํ๋ ๊ฒฝ์ฐ์ ๊ณ ๋ ค์ฌํญ์ ๋ค๋ฆ ๋๋ค. ์๋ฒ๋ ์ ์์ ์ธ ํด๋ผ์ด์ธํธ๊ฐ PATCH๋ฅผ ํตํด ๊ณผ๋ํ ์๋ฒ ์์(์: CPU, ๋์คํฌ I/O)์ ์๋นํ์ง ๋ชปํ๋๋ก ์ ์ ํ ์๋ฐฉ ์กฐ์น๋ฅผ ์ทจํด์ผ ํฉ๋๋ค(MUST).
6. ์ฐธ๊ณ ๋ฌธํ
6.1. ๊ท๋ฒ์ ์ฐธ์กฐ
- [RFC2119]
- Bradner, S., โKey words for use in RFCs to Indicate Requirement Levelsโ, BCP 14, RFC 2119, 1997๋ 3์.
- [RFC2616]
- Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, โHypertext Transfer Protocol -- HTTP/1.1โ, RFC 2616, 1999๋ 6์.
- [RFC3864]
- Klyne, G., Nottingham, M., and J. Mogul, โRegistration Procedures for Message Header Fieldsโ, BCP 90, RFC 3864, 2004๋ 9์.
6.2. ์ ๋ณด์ ์ฐธ์กฐ
- [RFC4918]
- Dusseault, L., โHTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)โ, RFC 4918, 2007๋ 6์.
Appendix A. ๊ฐ์ฌ์ ๊ธ
PATCH๋ ์๋ก์ด ๊ฐ๋ ์ด ์๋๋ฉฐ, ์ฒ์์๋ Roy Fielding๊ณผ Henrik Frystyk๊ฐ ์์ฑํ HTTP 1.1 ์ด์์ ๋ฑ์ฅํ์ผ๋ฉฐ RFC 2068์ ์น์ 19.6.1.1์๋ ๋ํ๋ฉ๋๋ค.
Adam Roach, Chris Sharp, Julian Reschke, Geoff Clemm, Scott Lawrence, Jeffrey Mogul, Roy Fielding, Greg Stein, Jim Luther, Alex Rousskov, Jamie Lokier, Joe Hildebrand, Mark Nottingham, Michael Balloni, Cyrus Daboo, Brian Carpenter, John Klensin, Eliot Lear, SM, ๋ฐ Bernie Hoeneisen์๊ฒ ์ด ๋ฌธ์์ ๊ฒํ ๋ฐ ์กฐ์ธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํนํ Julian Reschke๋ ๋ฐ๋ณต์ ์ธ ๊ฒํ ์ ๋ง์ ์ ์ฉํ ์ ์์ ํ์ผ๋ฉฐ, ์ด ๋ฌธ์์ ์ถํ์ ์ค์ํ ์ญํ ์ ํ์ต๋๋ค.