다음과 같은 리소스가 있다고 가정해보자.
id | balance | name |
---|---|---|
1 | 100 | 철수 |
2 | 20 | 민수 |
3 | -120 | 영희 |
보내지 않은 값은 null 로 대체
된다.
→ 대상 리소스를 나타내는 데이터를 대체한다.
id == 1 인 사람에게 두 종류의 PUT 요청을 보낸다.
종류 1 : 리소스의 모든 상태를 새로운 값을 대입하여 보낸 요청
PUT /customers?id=1
{
name : 민돌
balance : 0
}
종류 2 : 일부만 새로운 값을 보낸 요청
PUT /customers?id=1
{
name : 민돌
}
결과
종류 1 : 리소스의 모든 상태를 새로운 값을 대입하여 보낸 요청
id | balance | name |
---|---|---|
1 | 0 | 철수 |
2 | 20 | 민수 |
3 | -120 | 영희 |
종류 2 : 일부만 새로운 값을 보낸 요청
id | balance | name |
---|---|---|
1 | null | 철수 |
2 | 20 | 민수 |
3 | -120 | 영희 |
보내지 않은 값은 그대로 유지
된다.
결과
종류 1 : 리소스의 모든 상태를 새로운 값을 대입하여 보낸 요청
id | balance | name |
---|---|---|
1 | 0 | 철수 |
2 | 20 | 민수 |
3 | -120 | 영희 |
종류 2 : 일부만 새로운 값을 보낸 요청
id | balance | name |
---|---|---|
1 | 100 | 철수 |
2 | 20 | 민수 |
3 | -120 | 영희 |
새로운 자원을 생성
한다.
PUT 요청을 보낸다.
PUT /customers?id=4
{
name : 갑수
balance : 99999
}
결과
id | balance | name |
---|---|---|
1 | 100 | 철수 |
2 | 20 | 민수 |
3 | -120 | 영희 |
4 | 99999 | 갑수 |
새로운 자원을 생성하지 않는다.
결과
id | balance | name |
---|---|---|
1 | 100 | 철수 |
2 | 20 | 민수 |
3 | -120 | 영희 |
참고: POST vs PUT - 멱등 (Idempotent)
멱등성을 가진다.
= 재시도 했을 때의 결과값들이 동일하다
PUT 은 해당 리소스를 완전히 교체해 버리기 때문에 멱등이다.
멱등성을 가진다/가지지 않는다.
= 재시도 했을 때의 결과값들이 동일하지 않다.
PATCH 는 멱등으로 설계할 수도 있지만, 멱등이 아니게도 설계할 수 있다.
멱등인 경우
{
name: "kim"
}
멱등이 아닌 경우
1. 한 번 호출할 때마다, 나이를 10 더하는 식으로 변경하고자 한다.
2.
{
"operation": "add",
"age": 10"
}
좋아요 관련 Like 엔티티가 존재한다고 가정해보자.
@Entity
public class Like {
@Id
private Long id;
private Long articleId;
private Long userId;
private LikeType likeType; //** liked or disliked
...
}
이때, articleId(어떤 게시물에 대한 건지)
, userId(누가 좋아요를 한건지)
, likeType(좋아요/싫어요)
이 세가지 정보가 모두 필요하다.
user 가 포스트를 좋아요 클릭했다.
처음으로 좋아요/싫어요 를 눌렀다면, 생성이 되어야 한다.
기존에 누른 적이 있다면, 다른 타입으로 수정/취소가 되어야 한다. (기존 값을 유지하면서 새 값을 덮어 씌운다)
즉, 전체적인 수정을 할 때 PUT 을 사용한다.
유저 관련 user 엔티티가 존재한다고 가정해보자.
@Entity
public class user {
@Id
private Long id;
private String userID;
private String userPW;
private String nickname;
...
}
회원 정보 中 nickname 을 수정할 것이다.
id값만 가지고 있다면, 이 회원이 누구인지 찾을 수 있으므로
바꿀 nickname만 가져와서 nickname을 바꿔주면 된다.
즉, 부분적인 수정을 할 때 PATCH 를 사용한다.