[JAVA] @Valid

Yeri Kim·2024년 5월 17일

유효성 검사 Validation

값이 있는지 (null), 형식이 올바른지 (email, ...) 등 검사

@Valid

검증에 오류가 있다면 MethodArgumentNotValidException 발생
-> 400 Bad Request

build.gradle에 dependencies 추가하여 사용한다.

implementation 'org.springframework.boot:spring-boot-starter-validation'
  • @NotNull: 해당 값이 null이 아닌지 검증
  • @NotEmpty: 해당 값이 null이 아니고, 빈 스트링("") 아닌지 검증(" "은 허용됨)
  • @NotBlank: 해당 값이 null이 아니고, 공백(""과 " " 모두 포함)이 아닌지 검증함
  • @AssertTrue: 해당 값이 true인지 검증함
  • @Size: 해당 값이 주어진 값 사이에 해당하는지 검증함(String, Collection, Map, Array에도 적용 가능)
  • @Min: 해당 값이 주어진 값보다 작지 않은지 검증함
  • @Max: 해당 값이 주어진 값보다 크지 않은지 검증함
  • @Pattern: 해당 값이 주어진 패턴과 일치하는지 검증함

더 많은 제약조건 Annotation을 보고 싶다면
자바 공식 문서를 참고해보쟈~


Sping Boot로 쇼핑몰 백엔드를 쪼~끔 맛보고 있는데
회원가입에서 Validation을 구현해보았다.

@Getter
@Setter
public class UserDTO {
    @JsonProperty("user_id")
    @NotBlank(message = "아이디는 필수 입력 값입니다.")
    private String userId;

    @NotBlank(message = "비밀번호는 필수 입력 값입니다.")
    private String pw;

    @Pattern(regexp = "^[ㄱ-ㅎ가-힣a-z0-9-_]{2,10}$", message = "닉네임은 특수문자를 제외한 2~10자리여야 합니다.")
    @NotBlank
    private String name;

    @Pattern(regexp = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}$", message = "이메일 형식이 올바르지 않습니다.")
    @NotBlank(message = "이메일은 필수 입력 값입니다.")
    private String email;

    @NotBlank(message = "연락처는 필수 입력 값입니다.")
    private String contact;

    public User convertToEntity() {
        return new User(userId, pw, name, email, contact);
    }
}

DTO를 생성해서 RequestBody로 값을 받아온 다음,
Controller에 회원가입 메소드 생성자에서 Entity로 바꾸어주었다.

@PostMapping("/join/api/result")
    public ApiUtils.ApiResult<String> joinByApiResult(
            @Valid @RequestBody UserDTO userDTO, Errors errors){

        if (errors.hasErrors()) {
                return error("Validation Error", HttpStatus.BAD_REQUEST);
        }

        if (isDuplicateId(userDTO))
            return error("아이디 중복", HttpStatus.CONFLICT);

        User requestUser = userDTO.convertToEntity();
        String userId = userService.join(requestUser);
        return success(userId);
    }

@Valid를 사용해서 유효성 검사를 해주었다.
만약 error가 발생한다면,
Bad_Request를 return 해주도록 했다.

profile
Hi there!

0개의 댓글