@Valid, 그리고 예외처리 -Spring Boot Validation

오동근·2023년 1월 3일
0

BE

목록 보기
2/3

@Valid 영상

https://www.youtube.com/watch?v=J_7xasdHBZI

@예외처리 영상

https://www.youtube.com/watch?v=nyN4o9eXqm0

Spring Validation Annotation 총정리 (tistory.com)

  • 여러 어노테이션 예시
    @Null  // null만 혀용합니다.
    @NotNull  // null을 허용하지 않습니다. "", " "는 허용합니다.
    @NotEmpty  // null, ""을 허용하지 않습니다. " "는 허용합니다.
    @NotBlank  // null, "", " " 모두 허용하지 않습니다.
    
    @Email  // 이메일 형식을 검사합니다. 다만 ""의 경우를 통과 시킵니다. @Email 보다 아래 나올 @Patten을 통한 정규식 검사를 더 많이 사용합니다.
    @Pattern(regexp = )  // 정규식을 검사할 때 사용됩니다.
    @Size(min=, max=)  // 길이를 제한할 때 사용됩니다.
    
    @Max(value = )  // value 이하의 값을 받을 때 사용됩니다.
    @Min(value = )  // value 이상의 값을 받을 때 사용됩니다.
    
    @Positive  // 값을 양수로 제한합니다.
    @PositiveOrZero  // 값을 양수와 0만 가능하도록 제한합니다.
    
    @Negative  // 값을 음수로 제한합니다.
    @NegativeOrZero  // 값을 음수와 0만 가능하도록 제한합니다.
    
    @Future  // 현재보다 미래
    @Past  // 현재보다 과거
    
    @AssertFalse  // false 여부, null은 체크하지 않습니다.
    @AssertTrue  // true 여부, null은 체크하지 않습니다.

신규 validation annotation 만들기

신규 validation annotation 만들기 (tistory.com)

Custom annotation

SpringBoot의 Validation을 사용 해 보자

SpringBoot의 Validation을 사용 해 보자 | woolog - 개발자 울이

보통 DTO의 변수에 Validation을 적용시켜 주는 듯 하다.

  • 사용 예시 2개
    • 컨트롤러

      @RestController
      public class ContentController {
          @GetMapping("/categories/{category}/contents")
          public String contents(@PathVariable String category, @Valid ContentRequest request) {
              return "success category : " + category + ", from : " + request.getFrom();
          }
      }
      
      @RestController
      @RequiredArgsConstructor
      public class UserController {
          private final UserService userService;
      
          @PostMapping("/users")
          public ResponseEntity<Void> addUser(final @RequestBody @Valid AddUserRequest addUserRequest) {
              userService.registerUser(addUserRequest);
      
              return ResponseEntity.noContent().build();
          }
      
      }
    • Request 객체

      @Setter
      @Getter
      @NoArgsConstructor
      public class ContentRequest {
      @Length(min = 14, max = 14)
          @Pattern(regexp="[0-9]+")
          private String from;
      }
      
      @Getter
      @RequiredArgsConstructor
      public class AddUserRequest {
      
      	@Email
      	private final String email;
      	@NotBlank
      	private final String pw;
      	@NotNull
      	private final UserRole userRole;
      	@Min(12)
      	private final int age;
      
      }

[SpringBoot] Spring Validation을 이용한 유효성 검증 (velog.io)

✅ Validation

올바르지 않은 데이터를 걸러내고 보안을 유지하기 위해 데이터 검증(validation)은 여러 계층에 걸쳐서 적용됩니다.Client의 데이터는 조작이 쉬울 뿐더러 모든 데이터가 정상적인 방식으로 들어오는 것도 아니기 때문에, Client Side뿐만 아니라 Server Side에서도 데이터 유효성을 검사해야 할 필요가 있습니다.스프링부트 프로젝트에서는 @validated를 이용해 유효성을 검증할 수 있습니다.

👏 Bean Validation

스프링의 기본적인 validation인 Bean validation은 클래스 "필드"에 특정 annotation을 적용하여 필드가 갖는 제약 조건을 정의하는 구조로 이루어진 검사입니다.validator가 어떠한 비즈니스적 로직에 대한 검증이 아닌, 그 클래스로 생성된 객체 자체의 필드에 대한 유효성 여부를 검증합니다.

❗️ @Valid, @Validated 차이@Valid는 Java 에서 지원해주는 어노테이션이고 @Validated는 Spring에서 지원해주는 어노테이션입니다. @Validated는 @Valid의 기능을 포함하고, 유효성을 검토할 그룹을 지정할 수 있는 기능을 추가로 가지고 있습니다.

🛠 Exception Handling

위에 적용한 것 처럼 에러를 처리하는 객체를 따로 생성해 가공하는 것 외에도,@ExceptionHandler 어노테이션을 이용해 예외를 처리할 수 있습니다.

example1

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
public Object exception(Exception e) {
	return e.getMessage();
}

example2

@ExceptionHandler(MethodArgumentNotValidException.class)
protected ResponseEntity<ErrorResponse> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    log.error("MethodArgumentNotValidException : " + e.getMessage());
    final ErrorResponse response = ErrorResponse.of(ErrorCode.INVALID_INPUT_VALUE, e.getBindingResult());
    return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}

스프링 부트(Spring Boot) JPA 게시판 - 전역 예외 처리(Global Exception Handling) 알아보기 (tistory.com)

Spring Advanced : FootBall Club example REST 작성 - 2. Skill Entity CRUD 구현 및 전역 에러 처리, 기본 인증 로직 등록 (tistory.com)

profile
꾸준히 열심히

0개의 댓글