정리노트

[스프링] 유효성 검사②

망고고래 2024. 1. 26. 11:44

Ch13 유효성 검사

13.1 유효성 검사 개요

13.1.1 유효성 검사 유형

유효성 검사가 필요한 폼 데이터 항목

  • 날짜/이메일 형식
  • 나이가 숫자인지/범위 내인지
  • 입력 데이터 제한 길이 초과
  • 로그인 인증시 아이디/패스워드
  • 회원가입시 아이디 중복 여부

이때 DB와 대조해야 하는 아이디 중복 여부 확인과 같은 경우 ajax를 사용해야 한다.

 

13.1.2 @Valid를 이용한 유효성 검사

(1)pom.xml에 의존 라이브러리 등록

validation-api.jar과 hibernate-validator.jar 의존 라이브러리 등록 필요

	  <!-- Validation -->
	  <dependency>
		  <groupId>javax.validation</groupId>
		  <artifactId>validation-api</artifactId>
		  <version>2.0.1.Final</version>
	  </dependency>
	  <dependency>
		  <groupId>org.hibernate</groupId>
		  <artifactId>hibernate-validator</artifactId>
		  <version>5.4.2.Final</version>
	  </dependency>

 

(2)요청 처리 메서드의 매개변수에 @Valid 선언

@PostMapping("/...")
public String 메서드명(@Valid 매개변수, ..., BindingResult result){
    if(result.hasErrors()){
        //오류 메시지
    }
    return "뷰 이름";
}

 

(3)뷰 페이지에 오류 메시지 출력

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
...
<form:errors path="커맨드 객체의 멤버 변수명">

 

 

13.2 JSR-380으로 유효성 검사

특정 도메인 클래스의 프로퍼티(멤버 변수)에 대해 유효성 검사의 제약 사항 애너테이션 선언

Bean Validation 2.0이라고도 함

 

13.2.1 JSR-380 애너테이션 선언

public class 클래스명{
    @JSR-380 제약 사항 애너테이션(속성[, message="오류 메시지 또는 [오류 코드]"])
    private String 멤버 변수;
    ...
    // Setter()와 Getter() 메서드 구현 생략
}

 

JSR-380 애너테이션 유형

유형 설명 속성
@AssertFalse 프로퍼티 값이 false인지 검사  
@AssertTrue 프로퍼티 값이 true인지 검사  
@DecimalMax 프로퍼티 값이 가질 수 있는 최대 실수 값 검사 value: 값
inclusive: true/false
@DecimalMin 프로퍼티 값이 가질 수 있는 최소 실수 값 검사 value: 값
inclusive: true/false
@Digits 프로퍼티가 가질 수 있는 지정도니 범위(정수 부분의 자릿수와 소수 부분의 자릿수) 검사 integer: 정수의 자릿수
fraction: 소수의 자리수
@Future 프로퍼티 값이 미래 날짜인지 검사  
@Max 프로퍼티 값이 가질 수 있는 최대 길이 검사 value: 값
@Min 프로퍼티 값이 가질 수 있는 최소 길이 검사 value: 값
@NotNull 프로퍼티 값이 Null이 아닌지 검사  
@Null 프로퍼티 값이 Null인지 검사  
@Past 프로퍼티 값이 과거 날짜인지 검사  
@Pattern 프로퍼티 값이 정의된 정규 표현식에 일치하는지 검사 regexp: 정규 표현식
@Size 프로퍼티 값이 가질 수 있는 최대 최소 길이 검사 min: 최소 길이
max: 최대 길이
@Valid 객체에 대해 유효성 검사 실행  

 

JSR-380의 기본 메시지

각 애너테이션 유형별로 기본 메시지가 지정되어있음

 

선언 예시

(1)DTO에 제약조건 애너테이션 선언

Product.java
public class Product{
    @NotNull
    @Size(min=4, max=10)
    private String name;
    
    @Min(value=0)
    private int price;
    
    //Setter()/Getter()
}

 

(2)사용자 정의 오류 메시지 설정

메시지 리소스 파일(*.properties)

<!-- messages.properties -->
Notnull.Product.name = 값을 입력해주세요
Min.Product.price = 0 이상의 값을 입력해주세요

 

(3)리소스 번들 등록

servlet-context.xml에 MessageSource 환경 설정

<beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
...
</beans:bean>

 

 

 

13.2.2 @Valid를 이용한 유효성 검사

@PostMapping
public String submit(@Valid @ModelAttribute Product product, Errors errors){
    if(errors.hasErrors())
        return "webpage13_01";
        
    return "webpage13_result";
}

폼 페이지에서 입력된 값이 커맨드 객체 product로 매핑될 때 유효성 검사 진행

오류 발생시 오류 결과값이 errors 객체에 담기고 뷰 페이지로 되돌아감

 

13.2.3 <form:errors> 태그로 오류 메시지 출력

오류가 발생하면 오류 메시지를 HTML의 <span> 태그로 출력

<p>품명: <form:input path="name"/> <form:errors path="name"/>
<p>가격: <form:input path="price"/> <form:errors path="price"/>