Dev/Spring

Spring[@Valid]

OK-가자 2021. 10. 17. 14:15

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