PUT vs PATCH

박영준·2023년 3월 23일
0

Java

목록 보기
52/111

다음과 같은 리소스가 있다고 가정해보자.

idbalancename
1100철수
220민수
3-120영희

1. update 방식의 차이

PUT

보내지 않은 값은 null 로 대체된다.
→ 대상 리소스를 나타내는 데이터를 대체한다.

  1. id == 1 인 사람에게 두 종류의 PUT 요청을 보낸다.
    종류 1 : 리소스의 모든 상태를 새로운 값을 대입하여 보낸 요청

    PUT /customers?id=1
    {
        name : 민돌
            balance : 0
    }

    종류 2 : 일부만 새로운 값을 보낸 요청

    PUT /customers?id=1
    {
        name : 민돌
    }
  2. 결과
    종류 1 : 리소스의 모든 상태를 새로운 값을 대입하여 보낸 요청

    idbalancename
    10철수
    220민수
    3-120영희

    종류 2 : 일부만 새로운 값을 보낸 요청

    idbalancename
    1null철수
    220민수
    3-120영희

PATCH

보내지 않은 값은 그대로 유지된다.

  1. 결과
    종류 1 : 리소스의 모든 상태를 새로운 값을 대입하여 보낸 요청

    idbalancename
    10철수
    220민수
    3-120영희

    종류 2 : 일부만 새로운 값을 보낸 요청

    idbalancename
    1100철수
    220민수
    3-120영희

2. 요청한 URI에 자원이 존재하지 않을 때

PUT

새로운 자원을 생성한다.

  1. PUT 요청을 보낸다.

    PUT /customers?id=4
    {
        name : 갑수
            balance : 99999
    }
  2. 결과

    idbalancename
    1100철수
    220민수
    3-120영희
    499999갑수

PATCH

새로운 자원을 생성하지 않는다.

  1. 결과

    idbalancename
    1100철수
    220민수
    3-120영희

3. 멱등성의 관점

참고: POST vs PUT - 멱등 (Idempotent)

PUT

멱등성을 가진다.
= 재시도 했을 때의 결과값들이 동일하다

PUT 은 해당 리소스를 완전히 교체해 버리기 때문에 멱등이다.

PATCH

멱등성을 가진다/가지지 않는다.
= 재시도 했을 때의 결과값들이 동일하지 않다.

PATCH 는 멱등으로 설계할 수도 있지만, 멱등이 아니게도 설계할 수 있다.

멱등인 경우

{ 
	name: "kim"
}

멱등이 아닌 경우
1. 한 번 호출할 때마다, 나이를 10 더하는 식으로 변경하고자 한다.
2.

{
	"operation": "add",
	"age": 10"
}
  1. 해당 코드를 2번 호출하면, +10 + 10이 되어버려서 먹등이 아니다.

4. 활용 예시

put

  1. 좋아요 관련 Like 엔티티가 존재한다고 가정해보자.

    @Entity
    public class Like {
    
      @Id
      private Long id;
    
      private Long articleId;
    
      private Long userId;
    
      private LikeType likeType;   //** liked or disliked
      
      ...
     
    }

    이때, articleId(어떤 게시물에 대한 건지), userId(누가 좋아요를 한건지), likeType(좋아요/싫어요)
    이 세가지 정보가 모두 필요하다.

  2. user 가 포스트를 좋아요 클릭했다.

  3. 처음으로 좋아요/싫어요 를 눌렀다면, 생성이 되어야 한다.
    기존에 누른 적이 있다면, 다른 타입으로 수정/취소가 되어야 한다. (기존 값을 유지하면서 새 값을 덮어 씌운다)

즉, 전체적인 수정을 할 때 PUT 을 사용한다.

patch

  1. 유저 관련 user 엔티티가 존재한다고 가정해보자.

    @Entity
    public class user {
    
      @Id
      private Long id;
    
      private String userID;
    
      private String userPW;
    
      private String nickname;   
    
      ...
      
    }
  2. 회원 정보 中 nickname 을 수정할 것이다.

  3. id값만 가지고 있다면, 이 회원이 누구인지 찾을 수 있으므로
    바꿀 nickname만 가져와서 nickname을 바꿔주면 된다.

즉, 부분적인 수정을 할 때 PATCH 를 사용한다.


참고: [ 기술 스터디 ] PUT과 PATCH 차이
참고: Patch 메서드가 멱등이 아닌 이유

profile
개발자로 거듭나기!

0개의 댓글