DTO에서 NotNull설정이 되어 있을 때 PATCH를 어떻게 해줘야할까?

2024. 8. 26. 19:51·Backend Programming

현재 상황 및 문제점

캘린더 프로젝트를 만들면서 일정 설정, 반복 설정, 알림 설정을 한 곳에서 받아 처리하려고 했습니다. 그러나 PUT을 사용하여 구현할 경우, 현 구조에서는 반복 설정이 바뀌지 않았음에도 반복 내용을 삭제하고 재등록해야 하는 문제가 있었습니다. 이를 해결하기 위해 PATCH를 사용하여 특정 기능만 수정할 수 있도록 하려고 했습니다. 그러나 일정 설정의 필수 정보들이 NotNull로 설정되어 있어, PATCH로 데이터를 보낼 때 어떻게 처리해야 할지 고민이 되었습니다.

public class ScheduleDto {
    private int id;

    @NotNull
    private String title;

    private String description;

    @NotNull
    private LocalDateTime startAt;

    @NotNull
    private LocalDateTime endAt;

    private Integer repeatId;
}

 

일정을 설정할 때의 값들입니다. 일정을 등록하기 위해서 꼭 필요한 정보들은 NotNull로 설정해주기 위해서 valid처리를 저렇게 해주었습니다.

 

PATCH를 사용하려는 이유

PATCH를 사용하게 되면, 수정하려는 값 하나만 전송할 수 있어 데이터 크기가 감소합니다. 특히, 반복 일정에 대해 최대 500개의 일정 수정이 필요할 경우, PUT을 사용해 모든 내용을 수정하면 전송 데이터의 크기가 커질 수 있습니다. 이 문제를 해결하기 위해 PATCH를 사용하면 네트워크 대역폭을 절약할 수 있습니다.

네트워크 대역폭이란?

네트워크 대역폭은 네트워크를 통해 전송할 수 있는 데이터의 최대량을 뜻합니다. 전송 데이터의 크기를 줄이면 네트워크 대역폭을 절약할 수 있어, 특히 대규모 데이터를 처리할 때 중요한 요소가 됩니다.

 

public interface ValidGroup {
    public interface CreateGroup {}
}
public class ScheduleDto {

    private int id;

    @NotNull(groups = ValidGroup.CreateGroup.class)
    private String title;

    private String description;

    @NotNull(groups = ValidGroup.CreateGroup.class)
    private LocalDateTime startAt;

    @NotNull(groups = ValidGroup.CreateGroup.class)
    private LocalDateTime endAt;

    private Integer repeatId;
}
@PostMapping
    public ResponseEntity<ScheduleDto.Response> createSchedule(
    @Validated(ValidGroup.CreateGroup.class)
    @RequestBody ScheduleDto.Request schedule) { }

NotNull 처리와 PATCH의 적용

PATCH를 사용할 때 NotNull로 설정된 필드를 처리하는 방법으로 Group Validation을 도입했습니다. 수정 시에는 유효성 검사를 할 필요가 없으므로, create 시에만 유효성 검사를 하도록 설정했습니다. 이를 통해 PATCH 요청에서 @Validated만 작성하면 NotNull로 설정된 필드들이 유효성 검사를 하지 않게 되어 원하는 값만 수정할 수 있습니다.

POST용과 PATCH용 DTO로 나눠서 하지 않은 이유

POST용과 PATCH용 DTO를 따로 생성하는 방법도 고려할 수 있지만, 현재 상황에서는 변수들이 모두 동일한 데이터 타입과 구조를 가지고 있어 NotNull 옵션만이 다릅니다. 따라서 두 DTO를 따로 만들기보다는, Group Validation으로 묶어 관리하는 방안을 채택했습니다. 이를 통해 코드 중복을 줄이고, 각 상황에 맞는 유효성 검사를 적용할 수 있습니다.

저작자표시 (새창열림)

'Backend Programming' 카테고리의 다른 글

Spring Security, JWT을 사용하여 로그인 서비스 만들기  (2) 2024.09.22
회원가입 서비스 만들기  (2) 2024.09.20
RESTful API란?  (0) 2024.07.03
서블릿이란 무엇일까?  (0) 2024.06.30
스프링 빈과 애플리케이션 컨텍스트 그리고 AOP??  (0) 2024.06.29
'Backend Programming' 카테고리의 다른 글
  • Spring Security, JWT을 사용하여 로그인 서비스 만들기
  • 회원가입 서비스 만들기
  • RESTful API란?
  • 서블릿이란 무엇일까?
chanheess
chanheess
'왜' 그렇게 했는가?에 대한 생각으로 공부 및 작업의 저장관리
  • chanheess
    왜 그렇게 생각했는가?
    chanheess
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Backend Programming
      • Game Programming
        • Unreal
        • DirectX
      • C++
        • Memo
        • Basic
        • Effective Modern
      • Algorithm
        • Memo
        • Baekjoon
        • Programmers
        • HackerRank, LeetCode
      • Data Structure
      • Design Pattern
      • Etc
        • Memo
        • Daily Log
        • Book
  • 최근 글

  • 최근 댓글

  • 태그

    dp
    JWT
    c++ 기초 플러스
    티스토리챌린지
    Java
    위클리 챌린지
    오블완
    알고리즘
    spring
    SpringSecurity
    dfs
    프로그래머스
    JPA
    백준
  • hELLO· Designed By정상우.v4.10.0
chanheess
DTO에서 NotNull설정이 되어 있을 때 PATCH를 어떻게 해줘야할까?
상단으로

티스토리툴바