JSR-380으로 유효성 검사
JSR-380은 필드에 대해 유효성 검사의 제약 사항 애너테이션을 선언하여
해당 멤버의 변수 값이 올바른지 검사하는 것을 말합니다.
Bean Validation 2.0이라고도 합니다.
JSR-380을 이용한 처리 과정은 다음과 같습니다.
- JSR-380 제약 사항의 애너테이션 선언 (도메인 객체)
- @Valid를 이용한 유효성 검사 실행 (요청 처리 메소드)
- <form:errors> 태그로 오류 메시지 출력 (응답 웹 페이지)
JSR-380 애너테이션 선언
JSR-380 애너테이션은 Hibernate Validator가 제공하는 애너테이션을 따릅니다.
마찬가지로 JSR-380 애너테이션도 필드에 제약 사항을 설정할 수 있습니다.
형식은 다음과 같습니다.
public class 클래스 이름 {
@JSR-380 제약 사항 애너테이션(속성[,message="오류 메시지 또는 [오류 코드]"])
private String 멤버 변수;
...
//Setter()와 Getter() 메소드 구현 생략
}
다음은 도메인 클래스의 프로퍼티에 적용할 수 있는 JSR-380 애너테이션 유형입니다.
유형 | 설명 | 속성 |
@AssertFalse | 프로퍼티 값이 거짓인지 검사 | |
@AssertTrue | 프로퍼티 값이 참인지 검사 | |
@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의 기본 메시지 사용
JSR-380이 선언된 클래스의 멤버 변수가 제약 사항을 위반하여 오류가 발생하면
hibernate-validator-xxx.jar 라이브러리에서 제공하는 기본 메시지를 출력합니다.
사용자 정의 메시지를 출력하기 위해서는 message 속성 값에 출력할 오류 메시지를 직접 설정합니다.
기본 메시지는 다음과 같습니다.
애너테이션 | 기본 메시지 |
@AssertFalse | 반드시 거짓(false)이어야 합니다. |
@AssertTrue | 반드시 참(true)이어야 합니다. |
@DecimalMax | 반드시 {value}보다 같거나 작아야 합니다. |
@DecimalMin | 반드시 {value}보다 같거나 커야 합니다. |
@Digits | 숫자 값이 허용 범위를 벗어납니다(허용 범위: <{integer} 자리>.<{fraction} 자리>). |
@Future | 반드시 미래 날짜이어야 합니다. |
@Max | 반드시 {value}보다 같거나 작아야 합니다. |
@Min | 반드시 {value}보다 같거나 커야 합니다. |
@NotNull | 반드시 값이 있어야 합니다. |
@Null | 반드시 값이 없어야 합니다. |
@Past | 반드시 과거 날짜이어야 합니다. |
@Pattern | 정규 표현식 "{regexp}" 패턴과 일치해야 합니다. |
@Size | 반드시 최솟값 {min}과(와) 최댓값 {max} 사이의 크기이어야 합니다. |
다음은 Product 클래스에서 JSR-380 애너테이션을 선언한 예시입니다.
Product.java
public class Product {
@NotNull
@Size(min=4,max=10)
private String name;
@Min(value=0)
private int price;
//Setter(), Getter()
}
사용자 정의 오류 메시지 설정
message 속성 값에 출력할 오류 메시지를 직접 정의하거나 메시지 리소스 파일(*.properties)을 만들어
'오류 코드 = 출력할 오류 메시지' 형식으로 정의합니다.
다음은 메시지 리소스 파일을 사용하여 앞서 살펴본 Product 클래스에 선언된
@NotNull 애너테이션과 @Min 애너테이션에 오류 메시지를 설정한 것입니다.
messages.properties 파일의 내용입니다.
NotNull.Product.name = 값을 입력해 주세요
Min.Product.price = 0 이상의 값을 입력해 주세요
다음은 Product 클래스에서 JSR-380 애너테이션과 사용자 정의 오류 메시지를 선언한 예시입니다.
public class Product {
@NotNull
@Size(min=4,max=10,message="4~10자 이내로 입력해 주세요")
private String name;
@Min(value=0)
private int price;
}
유효성 검사 시 name 필드에 null일 시 위에서 작성한 리소스 파일에서
NotNull.Product.name에 설정 값을 출력합니다.
name 필드에 유효성 검사 시 오류 발생하면 message 속성에 설정한 오류 메시지가 출력됩니다.
price 필드에 유효성 검사 시 오류가 발생하면 Min.Product.price의 설정 값을 출력합니다.
@Valid를 이용한 유효성 검사
스프링 MVC에서 컨트롤러의 요청 처리 메소드 내 바인딩되는 데이터 유효성 검사를 위해
직접 코드를 작성할 필요 없이 @Valid를 매개변수에 선언하는 방법이 있습니다.
@Valid를 이용하면 요청 처리 메소드 내 매개변수에 전달되는 폼 데이터 값에 대한
유효성 검사를 실행할 수 있습니다.
다은은 @Valid를 선언한 예시입니다.
package com.springmvc.controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.springmvc.domain.Product;
@Controller
@RequestMapping("/exam01")
public class Example01Controller {
@GetMapping
public String showForm(Model model) {
model.addAttribute("product",new Product());
return "webpage13_01";
}
@PostMapping
public String submit(@Valid @ModelAttribute Product product, Errors errors) {
if(errors.hasErrors())
return "webpage13_01";
return "webpage13_result";
}
}
@Valid가 선언된 객체인 product는 요청 처리 메소드가 호출되기 전에 자동으로 JSR-380 Validator로
유효성 검사를 진행합니다.
이 때 오류가 발생 시 오류 결과 값은 errors 객체에 담기고 뷰 페이지 webpage13_01.jsp 파일로 돌아갑니다.
<form:errors> 태그로 오류 메시지 출력
오류 메시지를 JSP 뷰 페이지에 출력하기 위해서는 <form:errors> 태그를 사용합니다.
다음은 <form:errors> 태그를 사용해서 오류 메시지를 뷰 페이지에 출력하는 예시입니다.
이 태그는 오류 메시지를 HTML의 <span> 태그로 출력합니다.
뷰 페이지는 다음과 같이 작성해줍니다.
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Validation</title>
</head>
<body>
<h3>유효성 검사</h3>
<form:form modelAttribute="product" method="post">
<p>품명 : <form:input path="name"/> <form:errors path="name"/>
<p>가격 : <form:input path="price"/> <form:errors path="price"/>
<p><input type="submit" value="확인"/> <input type="reset" value="취소"/>
</form:form>
</body>
</html>
name과 price 값에 오류가 발생하면 message 속성에 설정된 사용자 정의 오류 메시지를 출력합니다.
message 속성이 설정되어 있지 않다면 기본 메시지를 출력합니다.
'SPRING' 카테고리의 다른 글
[SPRING]#51 도서 쇼핑몰 구현 (유효성 검사4) (0) | 2024.02.13 |
---|---|
[SPRING]#50 도서 쇼핑몰 구현 (유효성 검사3) (0) | 2024.02.12 |
[SPRING]#48 도서 쇼핑몰 구현 (유효성 검사1) (0) | 2024.01.21 |
[SPRING]#47 도서 쇼핑몰 구현 (다국어 처리4) (0) | 2024.01.21 |
[SPRING]#46 도서 쇼핑몰 구현 (다국어 처리3) (0) | 2024.01.20 |