ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Validation
    BackEnd/Spring Boot 2022. 4. 6. 08:20
    반응형

    Overview

      해당 글에서는 유효성 검사를 위해 Validation API를 사용해 보겠습니다.

     

    의존성 추가

    // Gradle
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    
    // Maven
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

     

      유효성 검사를 할 필드에 애노테이션을 붙여줍니다. goodsName은 최소 5글자, 빈 문자열은 허용하지 않는다는 유효성을 추가합니다. 유효성 검사 실패 시 등록한 message로 예외를 던집니다.

    package com.spring.springboot.domain;
    
    import javax.validation.constraints.NotEmpty;
    import javax.validation.constraints.Size;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Goods {
    
      private int goodsCode;
    
      @Size(min = 5, message = "상품명은 최소 5글자 입력해야 합니다.")
      @NotEmpty(message = "상품명은 필수 입력 항목입니다.")
      private String goodsName;
    }

     

    Validation Annotation

      자주 사용하는 애노테이션은 아래와 같습니다.

    • @NotNull: Null을 허용하지 않습니다.
    • @NotEmtpy: Null을 허용하지 않으며, ""도 허용하지 않습니다. " "는 허용이 됩니다.
    • @NotBlank: Null을 허용하지 않으며, "" 및 " "도 허용하지 않습니다. 즉, 문자가 한 개 이상 포함되어야 합니다.
    • @AssertTrue: True인지 확인합니다.
    • @Size: 최소, 최대 사이즈를 지정합니다.

      더 많은 애노테이션 확인은 아래 링크를 참고하시면 됩니다.

     

    Jakarta Bean Validation specification

    BeanNode, PropertyNode and ContainerElementNode host getContainerClass() and getTypeArgumentIndex(). If the node represents an element that is contained in a container such as Optional, List or Map, the former returns the declared type of the container and

    beanvalidation.org

     

      GoodsController에 신규 상품을 추가하는 API를 작성하고 @RequestBody 앞에 @Valid 애노테이션을 붙여줍니다.

    package com.spring.springboot;
    
    import com.spring.springboot.domain.Goods;
    import com.spring.springboot.exception.GoodsNotFoundException;
    import javax.validation.Valid;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GoodsController {
    
      @GetMapping(path = "/goods/{goodsCode}") // endpoint
      public Goods findGoods(@PathVariable int goodsCode) throws Exception {
        /* 생략 */
      }
    
      @PostMapping(path = "/saveGoods") // endpoint
      public void createGoods(@Valid @RequestBody Goods goods) throws Exception {
        /* save logic */
        System.out.println("Save: " + goods.getGoodsName());
      }
    }

     

      POST 요청을 위해 Postman을 사용합니다. Request 시 상품명을 4글자로 하고 호출을 하면 Status: 400 Bad Request 응답을 확인할 수 있습니다.

     

      Exception Handling 처리를 위해 이전 글의 CustomizedResponseEntityExceptionHandler 파일에 handleMethodArgumentNotValid 메서드를 오버라이딩합니다.

    package com.spring.springboot.exception;
    
    import java.util.Date;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.context.request.WebRequest;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
    
    @RestController
    @ControllerAdvice
    public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    
      @ExceptionHandler(Exception.class)
      public final ResponseEntity<Object> handleAllExceptions(Exception e, WebRequest request) {
        /* 생략 */
      }
    
      @ExceptionHandler(GoodsNotFoundException.class)
      public final ResponseEntity<Object> handleGoodsNotFoundExceptions(Exception e,
          WebRequest request) {
        /* 생략 */
      }
    
      @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);
      }
    }

     

    실행결과

    반응형

    'BackEnd > Spring Boot' 카테고리의 다른 글

    XML format  (0) 2022.04.25
    다국어 처리(Internationalization)  (0) 2022.04.08
    Exception Handling  (0) 2022.04.05
    Spring Boot 설정 및 동작 원리  (0) 2022.04.05
    Spring Boot  (0) 2022.04.02

    댓글

Designed by Tistory.