본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.
Controller 단을 구현하는 단계에 있다. 지난 포스팅에서 책을 등록하는 Controller 를 만들었고 실제로 postman을 통해 body 데이터를 전송해보았다. book 메소드의 파라미터 값인 title
과 author
에 값을 삽입하고 전송했더니 다음과 같이 실제 DB에 생성이 되었음을 의미하는 상태코드인 201 Created
가 떴고 응답 데이터 또한 우리가 설계한대로 msg와 body부를 추가한 JSON 형태로 받아볼 수 있었다.
그런데 여기서 만약 Book
class의 인자인 author
의 내용을 넣지않고 즉, null 값으로 해서 요청메시지를 보내면 어떻게 될까?
당연히 오류가 날 것이다. 우리가 애초에 book을 설계할 때, @Column
어노테이션을 통해 (nullable = false) 설정을 해주었다.
즉, null 값은 받지 않겠다고 선언한 것이다. 그런데 null 값이 들어왔고, postman
이 긴 로그를 통해 오류를 뿜어낸 것이다. 이러한 로그는 가독성도 떨어지고 어떤 오류인지 알기도 쉽지 않다.
만약 이상적인 데이터가 들어왔고, 전송에 성공했다면 프론트에서 이에 대한 code와 여러가지 msg, body를 깔끔한 형태로 받아볼 수 있을 것이다. 따라서 오류가 발생했을 때도 이와 같은 형식으로 메세지를 가공할 필요가 있다.
즉, 어떠한 데이터의 값이 유효한지, 타당한지 확인하여 그에 맞는 오류 혹은 전송메세지를 보낼 수 있도록 하는 검사가 바로 유효성검사(Validation) 인 것이다.
웹 개발을 진행할 때, 서버에 들어온 요청이 서버에서 요구하는 스펙에 잘 맞게 검사해야할 필요가 있다. 회원가입을 할 때에도 아이디, 패스워드는 필수로 들어와야한다던지, 성별은 꼭 표시해야하는 것 등이다.
스프링에서는 Hibernate Bean Validator 라는 인터페이스를 통해 @NotBlank
, @NotNull
등의 어노테이션으로 validation 을 편리하게 할 수 있도록 도와준다.
Hibernate bean validator을 사용하기 위해서는 먼저 의존성 설정부터 해야한다.
(https://mvnrepository.com/) 이 사이트에서 각종 라이브러리나 플러그인 등의 의존성을 내려받을 수 있다.
자신의 Spring Boot와 동일한 버젼의 Spring Boot Starter를 검색하여 나온 하단의 Gradle 부분을 복사한다.
다음과 같이 build.gradle
에 붙여넣고 저장하자.
반영이 되었다면 이제 Spring Boot Starter Validation을 사용할 수 있게 되었다.
본격적으로 유효성검사를 진행해보자.
가장 먼저 BookSaveReqDto
를 살펴보자.
BookSaveReqDto.java
package site.metacoding.junitproject.web.dto.request;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
import site.metacoding.junitproject.domain.Book;
@Getter
@Setter // Controller에서 Setter가 호출되면서 Dto에 값이 채워짐...
public class BookSaveReqDto {
@Size(min = 1, max = 50)
@NotBlank
private String title;
@Size(min = 2, max = 20)
@NotBlank
private String author;
public Book toEntity() {
return Book.builder()
.title(title)
.author(author)
.build();
}
}
@Size
는 해당 메서드의 사이즈를 지정할 수 있다.@NotBlack
는 해당 메서드에 null 값과 공백이 들어오는 것을 체크할 수 있다.but, 이렇게만 해서 바로 사용할 수 있는 것이 아니라 컨트롤러에서도 조금 수정을 해주어야 한다.
BookApiController.java
@PostMapping("/api/v1/book")
public ResponseEntity<?> saveBook(@RequestBody @Valid BookSaveReqDto bookSaveReqDto, BindingResult bindingResult) {
System.out.println("=============================");
System.out.println(bindingResult.hasErrors());
System.out.println("=============================");
BookRespDto bookRespDto = bookService.책등록하기(bookSaveReqDto);
CMRespDto<?> cmRespDto = CMRespDto.builder().code(1).msg("글 저장 성공").body(bookRespDto).build();
return new ResponseEntity<>(cmRespDto, HttpStatus.CREATED); // 201 = insert
}
@Valid
어노테이션을 붙여준다.True
, 아니라면 False
를 리턴할 것이다.다시 postman을 실행해 요청 Body의 author
의 값을 null 값으로 하고 요청을 보내면...
True를 리턴하는 것을 볼 수 있다.