Valid란?
- 사용자가 입력한 객체를 바인딩하는 과정에서 검증을 진행한다.
dependencies 추가하기
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
Controller 수정하기
@PostMapping("")
public ResponseEntity<TeamDTO> createTeams(@Valid @RequestBody TeamDTO teamDTO) {
TeamDTO savedTeam = teamService.createTeam(teamDTO);
URI location = ServletUriComponentsBuilder
.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedTeam.getId())
.toUri();
return ResponseEntity.created(location).build();
}
- @Valid: 다음을 붙이면 검증을 할 수 있다.
DTO 수정하기
package com.chan.ssb.team;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
public class TeamDTO {
private long id;
@Size(min = 3, max = 50)
private String name;
@NotEmpty
private String city;
@Min(0)
private int championships;
}
- @Size: 문자의 길이를 제한
- @NotNull: Null을 허용하지 않음
- @NotEmpty: Null 또는 빈 문자열을 허용하지 않음
- @Past: 과거 날짜만 입력 가능
- @Future: 미래 날짜만 입력 가능
- @FutureOrPresent: 미래 또는 오늘 날짜만 입력 가능
- @Max: 최댓값 이하의 값만 입력 가능
- @Min: 최솟값 이상의 값만 입력 가능
- @Pattern: 정규식 패턴으로 검증
Exception 추가하기
- 다음을 실행하면 우리가 설정한 ErrorDetail을 출력하지 않는다.
- CustomizedResponseEntityExceptionHandler.java
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(LocalDate.now(), ex.getFieldError().getDefaultMessage(), request.getDescription(false));
return new ResponseEntity(errorDetails, HttpStatus.BAD_REQUEST);
}
- NotVaild를 오버라이딩해서 오류 메시지를 수정하였다.
- ex.getMessage()를 사용하면 오류메시지가 길어진다.
message 설정하기
@NotEmpty(message = "City must not be empty")
- 다음과 같이 설정하면 정상적으로 출력한다.

DTOList를 검증하기
- DTOList의 경우 바로 검증을 할 수없다.
Wrapper 만들기
- 입력을 받기위한 wrapper를 만들어야 한다.
- TeamDTOListWrapper.java
package com.chan.ssb.team;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Size;
import java.util.List;
public class TeamDTOListWrapper {
@Valid
private List<TeamDTO> teamDTOList;
}
Controller
@PostMapping("/")
public ResponseEntity<List<TeamDTO>> createTeams(@Valid @RequestBody TeamDTOListWrapper teamDTOList) {
teamService.createTeams(teamDTOList.getTeamDTOList());
URI location = ServletUriComponentsBuilder
.fromCurrentRequest()
.path("")
.build()
.toUri();
return ResponseEntity.created(location).build();
}
- 다음과 같은 방법으로 데이터를 받아올 수 있다.