spring[@Valid]
1. @Valid
- 스프링에서는 서블릿 2.3 표준스펙 중 JSR-303 Validator 를 확장하고 Annotation 기반으로 제공하고 있다.
- mvc:annotation-driven 을 통해 간단하게 Bean Validation을 사용할 수 있다.
- 검증을 위한 Bean에는 @Valid 를 사용하여 자동 검증을 하게 된다.
- 실제 검증은 모델 오브젝트에 달린 제약조건 Annotation을 이용해 검증 작업이 이루어 진다.
2. Constraint Annotation
JSR 303 Spec 기본 제공
@AssertFalse : 거짓인가?
@Max : 지정 값 이하인가?
@AssertTrue : 참인가?
@Min : 지정 값 이상인가?
@DecimalMax : 지정 값 이하 실수인가?
@NotNull : Null이 아닌가?
@DecimalMin : 지정 값 이상 실수인가?
@Null : Null인가?
@Digits ( integer=, fraction=) : 대상 수가 지정된 정수, 소수 자리 수 이내 인가?
@Pattern(regex=, flag=) : 정규식을 만족 하는가?
@Future : 미래날짜인가?
@Past : 과거 날짜인가?
@Size(min=, max=) : 문자열, 배열 등의 크기가 지정크기를 만족 하는가?
Hibernate 제공
@NotEmpty : Empty 값이 아닌가?
@Email: 이메일 형식
@URL: URL 형식
@Length(min=, max=): 문자열 길이 min과 max 사이인가?
@Range(min=, max=): 숫자 범위 체크
3. 실습 (MySite 회원가입)
Dependency 추가
<!-- validation -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
UserController
@RequestMapping( value="/join", method=RequestMethod.POST )
public String join( @ModelAttribute @Valid UserVo vo, BindingResult result )
if ( result.hasErrors() ) {
// 에러 출력
List<ObjectError> list = result.getAllErrors();
for (ObjectError e : list) {
System.out.println(" ObjectError : " + e );
}
userService.join(vo);
return "redirect:/user/joinsuccess";
}
UserVo
public class UserVo {
private Long no;
@NotEmpty
@Length(min = 2, max = 8)
private String name;
@NotEmpty
@Email
private String email;
...
...
...
}
UserVo 필드의 제약조건을 만족하지 않은 경우 콘솔에 출력되는 에러 정보를 확인합니다.
에러 발생시 입력 폼으로 포워딩
@RequestMapping( value="/join", method=RequestMethod.POST )
public String join( @ModelAttribute @Valid UserVo vo, BindingResult result, Model model ) {
if ( result.hasErrors() ) {
model.addAllAttributes( result.getModel() );
return "/user/joinform";
}
userService.join(vo);
return "redirect:/user/joinsuccess";
}
입력폼(JSP) 에서 에러 메세지 출력하기
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
- 태그 라이브러리 추가
<spring:hasBindErrors name="userVo">
<c:if test="${errors.hasFieldErrors('name') }">
<strong>${errors.getFieldError( 'name' ).defaultMessage }</strong>
</c:if>
</spring:hasBindErrors>
- 메시지 출력
커스텀 메세지
- messageSource 설정
<!-- 6. MessageSource -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages/messages_ko</value>
</list>
</property>
</bean>
- classpath:message/message_ko,properities
NotEmpty.userVo.name = \uC774\uB984\uC740 \uD544\uC218 \uC785\uB825 \uD56D\uBAA9\uC785\uB2C8\uB2E4.
NotEmpty.userVo.email = \uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB825 \uD56D\uBAA9\uC785\uB2C8\uB2E4.
Email.userVo.email = \uC785\uB825 \uD615\uC2F1\uC5D0 \uB9DE\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
<spring:hasBindErrors name="userVo">
<c:if test="${errors.hasFieldErrors('email') }">
<strong style="color:red">
<spring:message
code="${errors.getFieldError( 'email' ).codes[0] }" text="${errors.getFieldError( 'email' ).defaultMessage }" />
</strong>
</c:if>
</spring:hasBindErrors>
form 태그 라이브러리 활용
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<form:form modelAttribute="userVo” .... >
....
<input id="name" name="name" type="text" value="">
<form:errors path="name" />
...
...
</form:form>
'Dev > Spring' 카테고리의 다른 글
Spring[IOC Container] (0) | 2021.10.17 |
---|---|
Spring[AOP - Aspect Oriented Programming] (0) | 2021.10.17 |
Spring[Logging] (0) | 2021.10.17 |
Spring[MultipartResolver] (0) | 2021.10.16 |
Spring[Interceptor-Annotation활용] (0) | 2021.10.16 |