검증 기능을 매번 코드로 작성하는 것이 아닌, 어노테이션을 활용하여 모든 프로젝트에 공통적으로 적용할 수 있는 기술
build.gradle 파일에 dependency 추가
implementation 'org.springframework.boot:spring-boot-starter-validation'
검증이 필요한 필드 위에 어노테이션을 적용하여서 제약 조건을 달아 준다
(제약 조건을 나타내는 어노테이션과 관련된 내용은 아래에서 자세하게 다루어볼 예정이다)
public class ScheduleRequestDTO {
@NotBlank(message = "제목을 입력해주세요.")
@Size(min = 1, max = 200, message = "제목은 1자 이상, 200자 이내로 입력해주세요.")
private String title;
@NotBlank(message = "내용을 입력해주세요.")
@Size(min = 1, message = "내용은 1자 이상 입력해주세요.")
private String contents;
@NotBlank(message = "이메일을 입력해주세요.")
@Email(message = "이메일 형식을 지켜주세요.")
private String email;
@NotBlank(message = "비밀번호를 입력해주세요.")
private String password;
}
검증이 필요한 객체 앞에 @Valid
or @Validated
어노테이션 붙이기
@PostMapping
public ResponseEntity<ResponseMessage<ScheduleResponseDTO>> saveSchedule(@Valid @RequestBody ScheduleRequestDTO requestDTO) {
ScheduleResponseDTO responseDTO = scheduleService.saveSchedule(requestDTO);
ResponseMessage<ScheduleResponseDTO> responseMessage = ResponseMessage.<ScheduleResponseDTO>builder()
.statusCode(HttpStatus.CREATED.value())
.message("일정이 추가되었습니다.")
.data(responseDTO)
.build();
return new ResponseEntity<>(responseMessage, HttpStatus.CREATED);
}
해당 어노테이션을 선언한 곳에 유효성 검증을 실패하면, MethodArgumentNotValidException
으로 에러가 발생한다
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + " " + error.getDefaultMessage())
.collect(Collectors.joining(", "));
return new ResponseEntity<>(message, HttpStatus.BAD_REQUEST);
}
}
request
{
"title":"test",
"contents":"hello",
"email":"heesue@gmail.com",
"password":"1234"
}
response
{
"statusCode": 201,
"message": "일정이 추가되었습니다.",
"data": {
"id": 25,
"title": "test",
"contents": "hello",
"email": "heesue@gmail.com",
"createDate": "2024-05-18T23:09:11.411277",
"modifyDate": "2024-05-18T23:09:11.411277"
}
}
request
{
"title":"",
"contents":"hello",
"email":"heesue@gmail.com",
"password":"1234"
}
response
title 제목을 입력해주세요., title 제목은 1자 이상, 200자 이내로 입력해주세요.
request
{
"title":"test",
"contents":"hello",
"email":"heesue",
"password":"1234"
}
response
email 이메일 형식을 지켜주세요.
자바에서 지원하는 Validation
@Pattern(regexp="\\(\\d{3}\\)\\d{3}-\\d{4}")
flase
또는 true
여야 함하이버네이트에서 제공하는 사용자 정의 제약 조건
javax.money.MonetaryAmount
에 지정된 통화 단위의 일부인지 확인소개한 어노테이션 외에도 공식 문서를 찾아보면, 우리가 개발할 때 필요한 어노테이션들이 거의 다 제공되고 있다!
+그리고 사용자 정의 제약 조건
을 구성하여 사용할 수도 있다
하지만, 내가 아직 거기까지 사용할 것 같진 않으니... 해당 내용은 이후에 다루어 보겠다!
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}