현재 상황 및 문제점
캘린더 프로젝트를 만들면서 일정 설정, 반복 설정, 알림 설정을 한 곳에서 받아 처리하려고 했습니다. 그러나 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' 카테고리의 다른 글
JWT을 사용하여 로그인 서비스 만들기 (2) | 2024.09.22 |
---|---|
회원가입 서비스 만들기 (2) | 2024.09.20 |
RESTful API란? (0) | 2024.07.03 |
서블릿이란 무엇일까? (0) | 2024.06.30 |
스프링 빈과 애플리케이션 컨텍스트 그리고 AOP?? (0) | 2024.06.29 |