빙응의 공부 블로그

[스프링/Validation] 유효성 검사 쉽게 하기 본문

Spring/개인공부_이론

[스프링/Validation] 유효성 검사 쉽게 하기

빙응이 2023. 11. 15. 21:48
웹 개발을 하다 보면 서버에 들어온 요청이 서버에서 요구하는 스펙에 잘 맞게 들어왔는지 검사가 필요하다.

 

//이름이 비어있으면 exception을 던진다.
if (member.getName() == null) {
	throw Exception;
}

// 나이가 0보다 작으면 exception을 던진다.
if (member.getAge() < 0) {
	throw Exception;
}

 

이러한 검사 방법도 가능하지만 대규모 프로그램일 경우 모든 경우에 검사를 하다보면 필드가 너무 늘어난다.

 

"그럼 따로 유효성 검사를 해주는 방법이 있으면 좋겠다"

 

Hibernate Bean Validator

 

 Hibernate Bean Validator은 유효성 검사를 해야 하는 필드에 @NotEmpty, @NotNull, @Max와

 같은 어노테이션을 통해 유효성 검사를 관리할 수 있다.  

 

 


 

사용 방법 
의존성 설정
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-validation'
}

 

 

예시

변경 전

@Getter
@Setter
public class MemberDTO {
  private String id;
  private String tell;
  private String password;
  private String name;
}

변경 후 

@Getter
@Setter
public class MemberDTO {

  @NotBlank(message = "아이디는 필수 입력 값입니다.")
  @Length(min = 3,max = 16,message = "아이디를 8자 이상, 16자 이하로 입력해주세요")
  private String id;

  @NotEmpty(message = "전화번호는 필수 입력 값입니다.")
  @Pattern(regexp = "^\\d{3}-\\d{4}-\\d{4}$", message = "전화번호 형식이 올바르지 않습니다.")
  private String tell;

  @NotEmpty(message = "비밀번호는 필수 입력 값입니다.")
  @Length(min = 8,max = 16,message = "비밀번호는 8자 이상, 16자 이하로 입력해주세요")
  private String password;

  @NotEmpty(message = " 이름은 필수 입력 값입니다.")
  private String name;
}
Validation 어노테이션
어노테이션 설명
@Null null만 허용한다.
@NotNull 빈 문자열(""), 공백(" ")은 허용하되, Null은 허용하지 않음 
@NotEmpty 공백(" ")은 허용하되, Null과 빈 문자열("")은 허용하지 않음
@NotBlank null, 빈 문자열, 공백 모두 허용하지 않는다.
@Email 이메일 형식을 검사한다. 단, 빈문자열의 경우 통과
@Pattern(regexp=) 일정 형식을 가진 데이터를 검사할 때 사용한다. 형식 지정이 가능 
@Size(min=,max=) 길이를 제한할 때 사용한다.
@Max(value=)  value 이하의 값만 허용한다.
@Min(value=) value 이상의 값만 허용한다.
@Positive 양수만 허용한다.
@PositiveOrZero 양수와 0만 허용한다.
@Negative 값을 음수로 허용한다.
@NegativeOrZero 값을 음수와 0만 허용한다.
@Future Now 보다 미래의 날짜, 시간이어야 한다.
@FutureOrPresent Now 거나 미래의 날짜, 시간이어야 한다.
@Past Now 보다 과거의 날짜, 시간이어야 한다.
@PastFutureOrPresent Now 거나 과거의 날짜, 시간이어야 한다.
오류 메세지 구현
@PostMapping("/addMember")
  public String createMember(@ModelAttribute("memberDTO") @Valid MemberDTO memberDTO, Errors errors, Model model) {
    if (errors.hasErrors()) {
      // 회원가입 실패시, 입력 데이터를 유지
      model.addAttribute("memberDTO", memberDTO);

      // 유효성 통과 못한 필드와 메시지를 핸들링
      Map<String, String> validatorResult = memberService.validateHandling(errors);
      for (String key : validatorResult.keySet()) {
        model.addAttribute(key, validatorResult.get(key));
      }
      return "/addMember";
    }
    Member member = new Member(id, memberDTO.getPassword(), memberDTO.getTell(), name);
    memberService.createMember(member);
    return "redirect:/login";
 
  }

 

@Valid
클라이언트의 입력 데이터가 dto 클래스로 넘어올 때, 유효성 체크 명령을 하는 어노테이션이다. 
Errors 객체
  • DTO에서 유효성 검사 오류에 대한 정보를 저장한다. 
  • 해당 객체는 두 가지 주요 유형으로 나누어 진다. 
필드 에러(FieldError)
  • 개념 : 특정 필드에 대한 유효성 검사 오류를 나타낸다.
  • 사용 예시 : 입력 폼에서 특정 필드에 대한 제약 조건을 위반했을 때 발생 
  • 메서드 예시: "getFieldErrors()"
  • 접근 방법: "FieldError" 객체의 메서드를 사용하여 필드 이름과 오류 메시지를 받을 수 있다.
객체 에러(ObjectError)
  • 개념 : 객체 자체에 대한 유효성 검사 오류를 나타낸다. 주로 전체 객체 수준의 유효성 검사에서 발생
  • 사용 예시: 두 개 이상의 필드 간의 상호 작용을 검사할 때 발생 
  • 메서드 예시: "getGlobalErrors()"
  • 접근 방법 : objectError 객체의 메서드를 사용하여 객체 수준의 오류 메시지를 받음 

 

 

 

Errors (Spring Framework 6.0.13 API)

Stores and exposes information about data-binding and validation errors for a specific object. Field names are typically properties of the target object (e.g. "name" when binding to a customer object). Implementations may also support nested fields in case

docs.spring.io


MemberService 
 public Map<String, String> validateHandling(Errors errors) {
        Map<String, String> validatorResult = new HashMap<>();

        for (FieldError error : errors.getFieldErrors()) {
            String validKeyName = String.format("valid_%s", error.getField());
            validatorResult.put(validKeyName, error.getDefaultMessage());
        }

        return validatorResult;
    }

 

명령어 기능
errors.getFieldErrors() 유효성 검사에 실패한 필드 목록을 가져온다.
error.getField() 유효성 검사에 실패한 필드 명을 가져온다.
error.getDefaultMessage() 유효성 검사에 실패한 필드에 정의된 메시지를 가져온다.

 

 

 

 


참고 사이트

[Spring Boot] Validation 적용, @Valid로 유효성 검사하기 (tistory.com)

 

[Spring Boot] Validation 적용, @Valid로 유효성 검사하기

이전에는 spring-boot-starter-web 의존성 내부에 validation이 있었지만, spring boot 2.3 version 이상부터는 아예 모듈로 빠져 validation 의존성을 따로 추가해줘야 사용할 수 있다. 1. validation 의존성 추가 impleme

dev-coco.tistory.com

[SpringBoot] @Valid로 유효성 검사하기 :: victolee (tistory.com)