์ธํ„ฐ๋„ท ์—”์ง€๋‹ˆ์–ด๋ง ํƒœ์Šคํฌ ํฌ์Šค(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๋Š” ๋ฐ˜๋ณต์ ์ธ ๊ฒ€ํ† ์™€ ๋งŽ์€ ์œ ์šฉํ•œ ์ œ์•ˆ์„ ํ–ˆ์œผ๋ฉฐ, ์ด ๋ฌธ์„œ์˜ ์ถœํŒ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €์ž ์ฃผ์†Œ

Lisa Dusseault
Linden Lab
945 Battery Street
San Francisco, CA 94111
USA
Email: lisa.dusseault@gmail.com
James M. Snell
Email: jasnell@gmail.com
URI: http://www.snellspace.com