SWM-99-degree / jariBean

SWM 14th JariBean Project
0 stars 1 forks source link

[REFACTOR] RequestBody 유효성 검사 #214

Closed isayaksh closed 11 months ago

isayaksh commented 11 months ago

✏️ Description

클라이언트에서 서버에 요청을 전송할 때 RequestBody에 데이터를 담아 전송하는 경우가 있다. 해당 과정에서 클라이언트에서 전송한 데이터의 형식이 서버에서 관리하는 데이터 형식과 다를 경우 예외 처리를 발생시켜야 한다.

모든 요청의 RequestBody의 유효성 작업이 수행될 수 있도록 코드를 수정한다.

💻 Process

RequestDTO

모든 RequestDto를 확인하여 조건을 할당한다.

@Getter
@Setter
public static class ReserveSaveReqDto {

    @NotEmpty(message = "cafeId는 필수입니다")
    private String cafeId;

    @NotEmpty(message = "tableId는 필수입니다")
    private String tableId;

    @NotNull(message = "reservedStartTime은 필수입니다")
    private LocalDateTime reservedStartTime;

    @NotNull(message = "reservedStartTime은 필수입니다")
    private LocalDateTime reservedEndTime;
}

RestController

RequestDto를 사용하는 모든 Controller에 @Valid 어노테이션을 붙인다.

@PostMapping
public ResponseEntity saveReserve(@AuthenticationPrincipal LoginUser loginUser, @Valid @RequestBody ReserveSaveReqDto reserveSaveReqDto) {
    reserveSaveReqDto.checkTimeStatus();
    reserveService.saveReserved(loginUser.getUser().getId(), reserveSaveReqDto);
    return new ResponseEntity<>(new ResponseDto<>(1, "정보가 성공적으로 등록되었습니다.", null), CREATED);
}

RestControllerAdvice

@Valid 어노테이션에서 문제가 발생할 경우 MethodArgumentNotValidException.class 예외가 발생하는데 해당 Exception을 RestControllerAdvice에 설정을 추가한다. RequestDto 중 유효성 검사를 통과하지 못한 필드에 대한 정보를 Response로 반환한다.

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e) {
    log.error(e.getMessage());

    BindingResult bindingResult = e.getBindingResult();
    Map<String, String> errorMap = new HashMap<>();

    if (bindingResult.hasErrors()) {
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        for (FieldError error : fieldErrors) {
            errorMap.put(error.getField(), error.getDefaultMessage());
        }
    }

    return new ResponseEntity<>(new ResponseDto<>(-1, "데이터 유효성 검증에 실패하였습니다.", errorMap), HttpStatus.BAD_REQUEST);
}