정리노트
[스프링] 유효성 검사②
망고고래
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"/>