ice rabbit programming

[API] PATCH 방식 통신과 JSON PATCH 본문

Development/Web etc.

[API] PATCH 방식 통신과 JSON PATCH

판교토끼 2021. 3. 17. 22:16

PATCH 방식 통신

RESTful API로 통신할 때, 수정을 위해서는 주로 PUT 방식으로 request를 날릴 것이다. 다만 좀 세부적으로 들어가면, 전체를 날려서 수정하는 것은 PUT 통신, 일부(partial)를 날려서 수정하는 것은 PATCH 통신을 이용하는 것이 올바른 방식이다.

API를 구현하는 측에서 PUT 통신에도 일부만 와서 일부가 null인 경우에는 수정하지 않도록 처리를 해 두었으면 PUT 방식에서도 일부만 request로 보내도 괜찮으나, 만약 그런 처리가 되어있지 않다면 보내지 않는 부분이 null이 되는 불상사가 일어날 수 있다. 그렇기 때문에 partial하게 수정할 수 있는 방식은 PATCH를 명확하게 사용하는 편이 좋다.

JSON PATCH

상술한 것처럼 일부만을 보내는데, JSON PATCH는 수정 뿐 아니라 추가 및 삭제까지 동작을 아예 JSON에 담아서 보내는 방식이다. API에서는 이 JSON을 펼쳐서 맞는 동작을 수행한다.

// 실행 전
{
  "myProp": "",
  "myProp3": "test"
}

[
  {
    "op": "replace",
    "path": "/myProp",
    "value": "hi",
  },
  {
    "op": "add",
    "path": "/myProp2/myPropDepth",
    "value": "hello",
  },
  {
    "op": "remove",
    "path": "/myProp3",
  }
]

// 실행 후
{
  "myProp": "hi",
  "myProp2": {
    "myPropDepth": "hello"
  }
}

 

위는 해당 값에 대해 각각 수정/추가/삭제를 담아서 보내는 JSON PATCH이다. op는 동작(operation), path는 JSON 객체에서의 위치를 말한다. /myProp2/myPropDepth는 myProp2 안의 myPropDepth를 말한다. 위 예제를 보면 아마 단번에 이해가 갈 것이다.

물론 JSON PATCH를 자동으로 사용할 수 있는 것은 아니고, 클라이언트에서 객체로부터 JSON PATCH를 만들고, API에서 JSON PATCH를 파싱해서 알맞게 값을 넣는 것은 처리해 주어야 한다. 본인은 github.com/martindale/fast-json-patch 와 같은 라이브러리를 사용해서 generate하고 apply하였다. 기회가 된다면 저 라이브러리를 통해 다음 포스팅에서 사용하는 법을 정리하겠다.