이번에는 유효성 체크를 위한 Validation 기능에 대해 알아보려고 한다.
Validation 기능에는 JDK에 포함된 Validation 기능과
hybernate 라이브러리에 포함되어있는 hybernate Validation 기능이 있다.
hybernate는 자바에서 데이터베이스와 관련된 어플리케이션을 개발할 때 사용하기 위해 사용하는 API로써 java의 객체와 DB의 Entity를 매핑하기 위해 사용된다.
먼저 user 도메인의 name 과 joindate에 대한 유효성 체크를 해볼 예정이다.
@Size 를 이용하여 하려고 했지만 스프링 버전때문에 어노테이션이 적용되지않았다.
pom.xml에 dependency를 추가해주고 실행해봤지만 또 안되길래, Maven-clean으로 진행했더니 되었다~!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.7.3</version>
</dependency>
package com.example.restfulwebservice.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.util.Date;
@Data
@AllArgsConstructor
public class User { //Lombok사용으로 간단하게 선언만 해줌
private Integer id;
// 유효성 체크
@Size(min=2)
private String name;
//과거데이터로 지정
@Past
private Date joinDate;
}
이렇게 Validation 설정 후 Controller로 이동한다.
//POST 웹 브라우저에서 실행 가능 : html, js, jquery 등 필요
@PostMapping("/users")
public ResponseEntity<User> createUser( @Valid @RequestBody User user){
User savedUser = service.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id")
.buildAndExpand(savedUser.getId())
.toUri();
return ResponseEntity.created(location).build();
}
사용자로부터 /users라는 API가 호출되면 User 라는 정보를 JSON 타입으로 전달을 시킨다. 그 후 @Valid 로 인해 Validation 체크가 될 것이다!
@Size(min=2)로 잡아둔 Validation 체크가 되어 한글자만 입력했을 때는 400 Bad Request 코드가 나온 것을 볼 수 있다.
400번은 클라이언트가 무엇인가 잘못해서 나타나는 코드다.
= 두글자 이상 입력해야하는데 한글자를 입력했기 때문에 나타난 코드이다.
이번에는 Body에도 적절한 에러메시지도 같이 출려해보려고 한다.
CustomizedResponseEntityExceptionHandler 클래스에서는 클래스가 실행될 때마다 자동으로 사전에 실행 될 것이고, 문제나 오류가 발생할때마다 해당하는 오류메시지나 내용 등을 출력해준다.
상위클래스로 이동하여 handlerMethodArgumentNotValid 메서드를 검색해준다.
복사해서 그 전에 클래스에 붙여넣어 오버라이딩을 해준다. @Override 도 달아준다.
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
ExceptionResponse exceptionResponse =
new ExceptionResponse(new Date(), ex.getMessage(), ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
부모가 가진 메서드를 재정의해서 사용하는 개념이다.
Body를 보면 에러 메시지가 설정한대로 출력되는 것을 볼 수있다.
하지만 너무 중복되고 긴 것 같아 수정을 해보려고 한다.
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
ExceptionResponse exceptionResponse =
new ExceptionResponse(new Date(), "Validation Failed", ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
이렇게 Validation Failed 로 수정해 준 후 포스트맨에서 확인해보니
메시지가 달라진 것을 확인해볼 수 있다.
마지막으로 이번에는 User 도메인에서 메시지를 수정해보는 작업이다.
package com.example.restfulwebservice.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.util.Date;
@Data
@AllArgsConstructor
public class User { //Lombok사용으로 간단하게 선언만 해줌
private Integer id;
// 유효성 체크
@Size(min=2, message = "Name은 2글자 이상 입력해주세요.")
private String name;
//과거 데이터로 지정
@Past
private Date joinDate;
}
@Size 어노테이션 안에 message를 입력해 보았다.
그랬더니 마찬가지로 마지막에 입력한 에러메시지가 출력된 것을 확인해볼 수 있다.
'프로그래밍 > SPRING BOOT' 카테고리의 다른 글
[인프런 : spring-boot] XML format / 데이터 제어 Filtering (0) | 2022.09.01 |
---|---|
[인프런 : spring-boot] 다국어 처리를 위한 Internationalization (0) | 2022.09.01 |
[인프런 : spring-boot] DELETE-HTTP Method (0) | 2022.08.30 |
[인프런 : spring-boot] AOP를 이용한 예외처리 (0) | 2022.08.30 |
[인프런 : spring-boot] HTTP Status Code 제어/예외처리 활용 (0) | 2022.08.30 |