본문 바로가기

스프링

PATCH 와 PUT의 차이 (유효성 검사와 쓰임에 대해서) 개인적인 생각...

 

 

 

PUT(Replace)

 

클라이언트가 보낸 데이터는 리소스의 전체를 나타내야 한다.
클라이언트가 보낸 데이터로 리소스가 대체됩니다.(전체가 바뀌는 작업)
PUT 요청은 리소스를 완전히 대체하여 클라이언트가 보낸 데이터로 리소스를 설정한다.


PATCH (Modify)


PATCH 메서드는 리소스의 일부를 수정(Modify)합니다.
클라이언트가 보낸 데이터는 리소스의 일부분을 나타냅니다.
즉, 클라이언트가 보낸 데이터로 리소스의 일부가 변경됩니다.
따라서 PATCH 요청은 리소스의 일부분만을 업데이트하고, 나머지는 그대로 유지합니다.

 

 

 

위의 내용까지는 이해가 된다...

그러면 서버 입장에서

밑에와 같은 (PUT과 PATCH) 모두 같은 DTO로 받는다고 가정했을 때

PATCH메서드 에서는

어떤 값을 수정하는지 어떻게 아는가?

(무조건 NULL체크를 해줘야 하는건가?)

밑에와 같은 DTO 클래스가 있다고 생각해보자

@Getter
@Setter
public class UserProfileUpdateDto {
    private String name;
    private String email;
    private Integer age;
}

 

만약에 PUT메서드를 이용한다면 모든 데이터를 수정하기 때문에

해당하는 기존데이터의 필드가 DTO안에 모두 포함 되어 있어야 한다.

해당 데이터를 덮어 씌우는 것이기 때문에 

그래서 보통 유효성 검사를 통해서 

해당 필드 값이 들어갔는지 체크하는 부분이 있어야한다.

그렇게 되면 별도의 NULL체크 로직은 없어도 대체될 수 있다.

 

그럼 만약에 PATCH 메서드를 이용한다고 하면

PATCH는 일부만 수정하는건데 서버에서 로직을 어떻게 작성해야하지?

사용자가 수정하고 싶은 필드만 넘어오는건데

위의 필드에서 NAME만 수정할려고 넘어 온다면

AGE와 EMAIL은 NULL과 0이 들어오는거 아닌가? 

 NULL 체크를 해줘야 하는거 아닌가?

아니면 모든 데이터 값들이 NULL로 대체 되니까..

 

같은 DTO를 사용하기에는 부적합하다는 것을 알았다..

간단하게 말해서

PUT 메서드는 모든 필드가 대체 되어야

하기 때문에 @NotNull 어노테이션이 들어가야하는데

PATCH메서드는 일부만 수정을 해야하기 때문에

사용자가 어떠한 필드를 수정하는지는 서버 입장에서는 모르기 때문에

@NotNull을 보통 사용하지 않는다.

PATCH메서드는 그래서 NULL체크 로직이 들어가줘야한다...

 

예외)단!!!!!

물론 만약에 DB에 null 값을 저장해야 하는 경우가 있다면 예외

 

 

여기서 그러면 사용자가 직접 보낸 NULL인지

PATCH메서드로 인해 들어온 NULL인지를 어떻게 알지?

 

(TO DO....)

 

프로젝트도 만들어보고 직접써보면서 들었던 생각들이다 절대 이게 정답이 아닐 수도 있고,

해당 서비스에 대한 요청의 성격과  요구사항에 따라 또 다른 설계 방법이 있을 꺼라고 생각한다.

 

 

 

 

 

 

 

 

 

'스프링' 카테고리의 다른 글

@JsonCreator 이 무엇일까? 왜 쓰지?  (0) 2024.01.31