BackEnd/Spring&SpringBoot

[Spring] Validation API 유효성 체크

Systema 2024. 8. 4. 15:01

 Validation이란?

 

어떤 데이터의 값이 유효한지, 잘못된 내용이 있는지 확인하는 단계를 뜻합니다. 예를들어 휴대폰 번호의 포멧은 "010-1234-1234"이여야 하는데, 포멧과 맞지않는 값이 들어온다면 해당 값의 저장을 막을 수 있습니다.

(휴대 폰 번호 막고도 최소길이, 최대길이, 이전날짜, 이후날짜 등 다양하게 유효성 체크를 할 수 있습니다)

 

Validation  API 사용
의존성 추가

 

Validation API를 사용하기 위해서는 먼저 아래와 같이 라이브러리를 추가 해주어야 합니다.

## maven
<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-validation</artifactId>  
    <version>3.0.2</version>  
</dependency>

## gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'

 

VO(DTO)에서 어노테이션을 통해 체크하고 @Valid 어노테이션을 통해 간단히 유효성 체크를 할 수 있습니다.

 

@Size 값이 min고 max사이에 해당하는지 확인
@NotNull Null을 허용하지 않음
@NotEmpty Null을 허용하지 않으면 공백 문자열을 허용하지 않음
@NotBlank Null을 허용하지 않으며 문자가 한 개 이상 폼하되어야함(공백제외)
@Past 과거 날짜인지 확인
@PastOrPresent 오늘이거나 과거 날짜인지 확인
@Future 미래 날짜인지 확인
@FutureOrPresent 오늘이거나 미래 날짜인지 확인
@Pattern 적용된 정규식 확
@Max 값이 최대값(Max)보다 큰지 확인
@Min 값이 최소값(Min)보다 작은지 확인
@AssertTure / False True / False 인지 확인
@Valid 해당 VO(DTO) 유효성 체크 실시

 

유효성 체크 예제 소스

 

VO(DTO)에 어노테이션을 통해 유효성 체크 할 부분을 명시해 줍니다.

@Data  
@AllArgsConstructor  
public class User {
    private Integer id;  
  
    @NotBlank(message="이름을 입력해주세요.")
    @Size(min = 2, message = "Name은 2글자 이상 입력해 주세요.")  
    private String name;  
  
    @Min(0, "나이는 0보다 커야 합니다.")
    private int age;
    
    @Email("이메일 형식이 잘못되었습니다.")
    private int email;
  
    @Past(message = "등록일은 미래 날짜를 입력하실 수 없습니다.")  
    private Date joinDate;
}

 

Controller에서 유효성이 필요한 부분에서 주로 @RequestBody 앞에 @Valid 어노테이션 입력해 줍니다.

@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
	User savedUser = userDaoService.save(user);

	URI location = ServletUriComponentsBuilder.fromCurrentRequest()
               		.path("/{id}")
                	.buildAndExpand(savedUser.getId())
                	.toUri();

    // 반환 값을 201 Created 준다. 인자로 location을 넘겨주면, 헤더에 Location이 추가된다.
    return ResponseEntity.created(location).build();
}

 

VO(DTO)에서 명시해 놓은 값에서 문제가 발생 했을 경우 예외처리를 통해 결과 값을 받아 보실 수 있습니다.

@ControllerAdvice 어노테이션을 통해 Controller에서 발생한 예외처리를 진행합니다.

@ControllerAdvice를 간단히 설명하면 Controller에서 @RequestMapping가 달린 메서드 실행 중 발생한 예외를 가로채는 exceptions interceptor라고 생각 하시면 됩니다.

또한 ResponseEntity에서 발생된 예외상황을 처리하기위해 ResponseEntityExceptionHandler 상속 받고

예외 응답 객체를 만들어 ResponseEntity에 담아 처리해주면 조금 더 상세하게 유효성 체크를 할 수 있습니다.

@ControllerAdvice
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
        ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), "Validation failed", ex.getBindingResult().toString());
        return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
    }
    
}

Validation API 유효성 체크를 통한 실행 결과

   

이번 포스팅에는 SpringBoot에서 유효성 체크 하는 방법을 정리 해보았는데요

해당 Full Source는 아래 Git주소를 통해서 확인 부탁드립니다!!

여기까지 지루한 글 읽어주셔서 감사합니다ㅎㅎ

https://github.com/LuckyStrike1989/restful-web-service