[REST API] REST API 유효성 검사하기

민지·2024년 3월 13일
0

REST API - Spring Boot

목록 보기
13/27

뭐 할건데?

POST http://localhost:8080/users with Validation Errors
아래와 같이 null 값인 name을 request를 보낼 때, Validation Failed 라고 알려주는 것을 추가해주고 싶다!

검증을 위한 pom.xml modified

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

1. UserResource.java modified - @Valid

현재 POST /users과 mapping된 createUser 함수에서 유효성 검사를 할 거니까, 해당 함수를 수정할 것

	@PostMapping("/users")
	public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
		//NO_CHANGE
	}

이때, @Valid 어노테이션을 붙이면, 메서드 파라미터에서 바인딩이 수행될 때, 객체에 정의된 유효성 검증이 자동으로 수행되는 것!

하지만 아직, 매개변수인 User클래스에 대한 유효성 검증 규칙을 정의하지 않았다 !

2. User.java modified

import jakarta.validation.constraints.Past;
import jakarta.validation.constraints.Size;
	
@Size(min=2, message = "Name should have atleast 2 characters")
private String name;

@Past(message = "Birth Date should be in the past")
private LocalDate birthDate;

즉, @Size나 @Past 검증 규칙에 어긋나는 것을 POST method에 추가한다면, HTTP response status를 400 (Bad request)를 반환할 것이다!!

그렇다면, 이제 추가로, 컨트롤러에서 입력 검증 실패 시 예외를 처리하는 부분을 추가해줘야 한다!

3. CustomizedResponseEntityExceptionHandler.java modified

ResponseEntityExceptionHandler → handleMethodArgumentNotValid 원형 함수

	@Nullable
	protected ResponseEntity<Object> handleMethodArgumentNotValid(
			MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {

		return handleExceptionInternal(ex, null, headers, status, request);
	}

위의 handleMethodArgumentNotValid 원형 함수를 오버라이딩

	@Override
	protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
			HttpHeaders headers, HttpStatusCode status, WebRequest request) {
		ErrorDetails errorDetails = new ErrorDetails(LocalDateTime.now(),
				"Total Errors : " + ex.getErrorCount() + " First Error : " + ex.getFieldError().getDefaultMessage(),
				request.getDescription(false));

		return new ResponseEntity(errorDetails, HttpStatus.BAD_REQUEST);
	}
  • 개발자(나)가 정의한 에러 응답을 반환하도록 구현!
  • response 400을 리턴한 걸 확인했으니, return 값은 HttpStatus.BAD_REQUEST
  • errorDetails → ex customized
    getErrorCount()로 총 에러의 개수를 반환했고, getFieldError().getDefaultMessage()로 첫번째로 발생한 에러를 반환시켰다.

실행결과

빈 문자열과 미래 시점의 user를 post시키면, response status 400과 함께 다음 형태의 response body가 리턴된다.

// response body BODY

{
"timestamp": "2024-03-05T15:57:59.109858",
"message": "Total Errors : 2 First Error : Birth Date should be in the past",
"details": "uri=/users"
}

이처럼 MethodArgumentNotValidException ex 의 클래스 원형을 들어가보면, 에러를 다루는 다양한 함수가 있음. REST API를 만들 때 소비자가 에러 메세지를 이해하기 쉽게 만들면 된다.



참고 및 출처
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/

profile
배운 내용을 바로바로 기록하자!

0개의 댓글