티스토리 뷰

728x90

PUT과 PATCH의 차이점 설명

웹 개발에서 RESTful API를 설계할 때, 리소스를 업데이트하는 방법으로 주로 사용되는 두 가지 HTTP 메소드가 PUTPATCH입니다. 이 두 메소드는 리소스의 수정이라는 공통점을 가지지만, 그 사용 방식과 목적에서 중요한 차이점이 있습니다. 이번 포스트에서는 PUT과 PATCH의 차이점에 대해 자세히 알아보겠습니다.


1. PUT (완전 업데이트)

역할

  • 완전한 리소스 교체: PUT 메소드는 지정된 리소스를 완전히 교체하는 데 사용됩니다. 즉, 클라이언트는 리소스의 전체 표현을 서버에 전송하며, 서버는 기존 리소스를 새로운 데이터로 완전히 대체합니다.

특징

  • 멱등성(Idempotency): 동일한 PUT 요청을 여러 번 보내더라도 결과는 동일합니다. 즉, 한 번 요청했을 때와 여러 번 요청했을 때 서버의 상태는 변하지 않습니다.
  • 전체 데이터 필요: 리소스의 전체 데이터를 포함해야 하므로, 일부 필드만 수정하려면 모든 필드를 다시 전송해야 합니다.

사용 예시

사용자 정보 전체를 업데이트하는 경우에 주로 사용됩니다.

PUT /users/123
Content-Type: application/json

{
  "id": 123,
  "name": "홍길동",
  "email": "hong_new@example.com",
  "age": 30
}

장점

  • 명확한 의도 표현: 리소스의 전체 상태를 교체한다는 명확한 의도를 전달할 수 있습니다.
  • 데이터 일관성 유지: 모든 필드를 제공함으로써 데이터의 일관성을 유지할 수 있습니다.

단점

  • 비효율성: 리소스의 일부만 변경할 때도 전체 데이터를 전송해야 하므로 네트워크 자원이 비효율적으로 사용될 수 있습니다.
  • 실수 가능성: 모든 필드를 다시 전송해야 하기 때문에 일부 필드를 누락시키는 실수가 발생할 수 있습니다.

2. PATCH (부분 업데이트)

역할

  • 부분 리소스 수정: PATCH 메소드는 리소스의 일부를 수정하는 데 사용됩니다. 클라이언트는 변경하고자 하는 필드만 전송하며, 서버는 해당 필드만 업데이트합니다.

특징

  • 부분 데이터 필요: 수정하려는 필드만 포함하면 되므로, 전체 데이터를 다시 전송할 필요가 없습니다.
  • 유연성: 다양한 방식으로 리소스를 업데이트할 수 있어 더 유연한 수정이 가능합니다.
  • 멱등성: PATCH는 멱등성을 보장하지 않을 수 있습니다. 이는 구현 방식에 따라 다릅니다.

사용 예시

사용자 이메일만 업데이트하는 경우에 주로 사용됩니다.

PATCH /users/123
Content-Type: application/json

{
  "email": "hong_updated@example.com"
}

장점

  • 효율성: 필요한 필드만 전송하므로 네트워크 자원을 절약할 수 있습니다.
  • 안전성: 전체 데이터를 다시 전송하지 않기 때문에 데이터 누락의 위험이 줄어듭니다.
  • 유연성: 다양한 필드를 선택적으로 업데이트할 수 있습니다.

단점

  • 복잡성: 서버 측에서 부분 업데이트를 처리하는 로직이 복잡할 수 있습니다.
  • 일관성 문제: 여러 PATCH 요청이 동시에 발생할 경우 데이터 일관성 유지가 어려울 수 있습니다.

PUT과 PATCH의 선택 기준

기준 PUT PATCH
사용 목적 리소스 전체 교체 리소스 일부 수정
데이터 전송 전체 리소스 데이터 변경할 필드만 데이터
멱등성 멱등성 보장 구현에 따라 다름
복잡성 상대적으로 단순 서버 로직이 복잡할 수 있음
효율성 비효율적일 수 있음 효율적임

언제 PUT을 사용하고, 언제 PATCH를 사용할까?

  • PUT 사용 사례

    • 리소스의 전체 상태를 완전히 교체해야 할 때
    • 클라이언트가 리소스의 전체 데이터를 가지고 있을 때
    • 데이터의 일관성을 강하게 유지해야 할 때
  • PATCH 사용 사례

    • 리소스의 일부 필드만 수정해야 할 때
    • 네트워크 효율성을 중요시할 때
    • 클라이언트가 리소스의 일부 데이터만 알고 있을 때

예제 코드: Spring Boot에서 PUT과 PATCH 사용하기

PUT 예제

@RestController
@RequestMapping("/users")
public class UserController {

    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(
            @PathVariable Long id,
            @RequestBody User updatedUser) {
        // 사용자 전체 업데이트 로직
        User user = userService.updateUser(id, updatedUser);
        return ResponseEntity.ok(user);
    }
}

PATCH 예제

@RestController
@RequestMapping("/users")
public class UserController {

    @PatchMapping("/{id}")
    public ResponseEntity<User> partialUpdateUser(
            @PathVariable Long id,
            @RequestBody Map<String, Object> updates) {
        // 사용자 일부 업데이트 로직
        User user = userService.partialUpdateUser(id, updates);
        return ResponseEntity.ok(user);
    }
}

결론

PUT과 PATCH는 모두 리소스를 업데이트하는 데 사용되지만, 그 목적과 사용 방식에서 중요한 차이점이 있습니다. PUT은 리소스를 전체적으로 교체할 때, PATCH는 리소스의 일부만 수정할 때 사용됩니다. 적절한 메소드를 선택함으로써 API의 효율성과 유지보수성을 높일 수 있습니다. RESTful API 설계 시 이러한 차이점을 명확히 이해하고 상황에 맞게 활용하는 것이 중요합니다.

728x90