๐ซ
์ผ์ ๊ด๋ฆฌ API๋ฅผ ๊ตฌํํ๋ฉฐ ๊ฒช์ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ๋ฐฉ๋ฒ, ์๋ก ์๊ฒ๋ ์ ์ ๊ธฐ๋กํฉ๋๋ค.
๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋์ฌ์ค๋๋ค.@Validย ์ด๋
ธํ
์ด์
์ ์ด์ฉํ ์ ์์ต๋๋ค.ํ ์ผ์ ์ต๋ 200์ ์ด๋ด๋ก ์ ํ, ํ์๊ฐ ์ฒ๋ฆฌ๋น๋ฐ๋ฒํธ๋ ํ์๊ฐ ์ฒ๋ฆฌ์ด๋ฉ์ผ ์ ๋ณด๊ฐ ํ์์ ๋ง๋์ง ํ์ธ๊ฐ์ฒด์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๋
ธํ
์ด์
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฐ์ดํฐ๊ฐ ์ ํจํ ์ง ํ์ธํ ์ ์๋ค.
โ๏ธ Hibernate Validator ๊ณต์๋ฌธ์
๐ ๋ฒ์ ๋ณ ๊ณต์ ๋งค๋ด์ผ
@Valid ์ด๋
ธํ
์ด์
์ด ๋ถ์ ๊ฐ์ฒด๋ ๊ทธ ์์ฑ์ ๋ํด ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ ์ ์ฉํ๋ค. ๊ฐ์ฒด์ ์ ์๋ ์ ์ฝ์กฐ๊ฑด (@NotNull, @Size, @Min, @Max ๋ฑ)์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ฌํ๋ค.build.gradle์ dependencies์ implementation 'org.springframework.boot:spring-boot-starter-validation' ์ถ๊ฐ
@Getter
public class ScheduleRequestDto {
private Long authorId;
private String author;
@NotNull(message = "ํ ์ผ์ ํ์๊ฐ์
๋๋ค.")
@Size(max = 200, message = "ํ ์ผ์ ์ต๋ 200์ ์ดํ๋ก ์
๋ ฅํด ์ฃผ์ธ์.")
private String todo;
@NotNull(message = "๋น๋ฐ๋ฒํธ๋ ํ์๊ฐ์
๋๋ค.")
private String password;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date modDate;
}
@Size: ๋ฌธ์์ด, ๋ฐฐ์ด, ๋ฆฌ์คํธ ๋ฑ์์ ๊ธธ์ด(ํฌ๊ธฐ) ์กฐ๊ฑด ๋ช
์0Integer.MAX_VALUE@Valid๋ @Validated ์ ํจ๊ป ์ฌ์ฉํด์ผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.@NotNull: ํด๋น ํ๋๊ฐ null ์ด ์๋์ด์ผ ํ๋ค๋ ์กฐ๊ฑด ๋ช
์@NotNull: ํ๋๊ฐ null์ด ์๋์ง ๊ฒ์ฆ. ๋น ๋ฌธ์์ด("")์ ํ์ฉ.@NotEmpty: ํ๋๊ฐ null์ด ์๋๊ณ , ๋น์ด ์์ง ์์์ผ ํ๋ค๋ ์ ์ฝ ์กฐ๊ฑด. @NotEmpty๋ ๋ฌธ์์ด์ด๋ ์ปฌ๋ ์
์ ์ ์ฉ๋๋ฉฐ, ๋น ๋ฌธ์์ด, ๋น ๋ฆฌ์คํธ ๋ฑ๋ ํ์ฉํ์ง ์๋๋ค.@NotBlank: ๋ฌธ์์ด ํ๋์ ์ ์ฉ๋๋ฉฐ, null์ด ์๋๊ณ , ๊ณต๋ฐฑ ๋ฌธ์์ด๋ ํ์ฉํ์ง ์๋๋ค. ์ฆ, " "์ ๊ฐ์ ๊ณต๋ฐฑ๋ง ์๋ ๋ฌธ์์ด์ ์ ํจํ์ง ์๋ค๊ณ ํ๋จํ๋ค.@Valid ์ฌ์ฉ@PostMapping
public ResponseEntity<ScheduleResponseDto> saveSchedule(@RequestBody @Valid ScheduleRequestDto dto) {
return new ResponseEntity<>(scheduleService.saveSchedule(dto), HttpStatus.OK);
}
@Valid ์ด๋
ธํ
์ด์
์ด ๋ถ์ ๊ฐ์ฒด๋ ํด๋น ๊ฐ์ฒด์ ํ๋์ ์ค์ ๋ ์ ํจ์ฑ ์ ์ฝ ์กฐ๊ฑด์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ฌ๊ฐ ์ํ๋๋ค.MethodArgumentNotValidException ์์ธ๊ฐ ๋ฐ์ํ๊ณ , Spring์ ์ด ์์ธ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ 400 (Bad Request) ์๋ต์ ๋ฐํํ๋ค.
e.getMessage() ๋ฅผ detail ์ ๋๊ธฐ๋ฉด ๋ณต์กํ ์๋ฌ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋๋ค. ์ฌ์ฉ์ ์
์ฅ์์ ์๋ฌ ๋ก๊ทธ๋ฅผ ํด์ํ๊ธฐ ์ด๋ ต๋ค.
e.getMessage() ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์์ธ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค
: ํด๋ผ์ด์ธํธ์์๋ ์ด๋ค ํ๋์ ์ ์ฉ๋ ์ ์ฝ์กฐ๊ฑด ๊ฒ์ฌ๊ฐ ์คํจํ๋์ง๋ง ์๋ฉด ๋๋ค.
ํ๋ ์ ์ฝ์กฐ๊ฑด ์ด๋
ธํ
์ด์
์ ์์ฑํ ๋ฉ์ธ์ง ์ถ๋ ฅํ๊ธฐ
โถ๏ธ GlobalExceptionHandler.java
@ExceptionHandler(MethodArgumentNotValidException.class)
private ResponseEntity<ErrorResponseDto> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
StringBuilder errorMsg = new StringBuilder();
for (ObjectError error : e.getBindingResult().getAllErrors()) {
errorMsg.append(error.getDefaultMessage()).append(" ");
}
return ErrorResponseDto.errResponseEntity(new CustomException(ErrorCode.INVALID_CONSTRAINTS, errorMsg.toString()));
}
