Controller - 유효성검사

jihan kong·2022년 9월 29일
0

JUnit5

목록 보기
21/25
post-thumbnail

본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.

Controller 단을 구현하는 단계에 있다. 지난 포스팅에서 책을 등록하는 Controller 를 만들었고 실제로 postman을 통해 body 데이터를 전송해보았다. book 메소드의 파라미터 값인 titleauthor 에 값을 삽입하고 전송했더니 다음과 같이 실제 DB에 생성이 되었음을 의미하는 상태코드인 201 Created 가 떴고 응답 데이터 또한 우리가 설계한대로 msg와 body부를 추가한 JSON 형태로 받아볼 수 있었다.


그런데 여기서 만약 Book class의 인자인 author 의 내용을 넣지않고 즉, null 값으로 해서 요청메시지를 보내면 어떻게 될까?

당연히 오류가 날 것이다. 우리가 애초에 book을 설계할 때, @Column 어노테이션을 통해 (nullable = false) 설정을 해주었다.

즉, null 값은 받지 않겠다고 선언한 것이다. 그런데 null 값이 들어왔고, postman 이 긴 로그를 통해 오류를 뿜어낸 것이다. 이러한 로그는 가독성도 떨어지고 어떤 오류인지 알기도 쉽지 않다.

만약 이상적인 데이터가 들어왔고, 전송에 성공했다면 프론트에서 이에 대한 code와 여러가지 msg, body를 깔끔한 형태로 받아볼 수 있을 것이다. 따라서 오류가 발생했을 때도 이와 같은 형식으로 메세지를 가공할 필요가 있다.


Validation

즉, 어떠한 데이터의 값이 유효한지, 타당한지 확인하여 그에 맞는 오류 혹은 전송메세지를 보낼 수 있도록 하는 검사가 바로 유효성검사(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 어노테이션을 붙여준다.
  • print문을 통해 실제 postman에서 공백 혹은 null 값이 들어가 에러가 터진다면 True, 아니라면 False 를 리턴할 것이다.

다시 postman을 실행해 요청 Body의 author 의 값을 null 값으로 하고 요청을 보내면...

True를 리턴하는 것을 볼 수 있다.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글