티스토리 뷰

728x90
Validator를 내가 직접 만들어 보는 것은 우뜰까~?
주어진 것 이외의 유효성 검사가 필요한 순간이 있을 수도 있고,

내가 맘에 안들 수도 있는거니까

XML ver

 

 

 

 

 

 

 

 

 

 

 

Properties software Download

여기서 받을꾸임

 

Add 버튼 누르고

 

Name : properties
Location : http://propedit.sourceforge.jp/eclipse/updates 

 

PropertiesEditor 체크 후 next>

 

next>
accept 선택 후 finish

 

 

 

 

프로젝트 생성

Project Explorer에서 빈공간에 우클릭하면 Dynamic Web Project 만들 수 있다!
여기까진 할 수 있잖아

 

방금 만든 그 프로젝트를 Maven Project로 만들어주자!

혹시 다시 Maven 제거하고 싶다면, 위의 그림처럼 Disabled Maven Nature 해주믄 되니꽈

아! 메이븐 설정하고 프로젝트에 오류뜨면 그냥 alt+F5로 마무리해주십시다

 

Maven 기본설정 해보자!

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <!-- pom모델버전 -->
  <modelVersion>4.0.0</modelVersion>
  <!-- 프로젝트 생성하는 조직의 고유 아이디 like 도메인 이름 -->
  <groupId>Ex01JavaSetting</groupId>
  <!-- Maven 프로젝트 식별하는 아이디 like 프로젝트명 -->
  <artifactId>Ex01JavaSetting</artifactId>
  <!-- 프로젝트 현재 버전 -->
  <version>0.0.1-SNAPSHOT</version>
  <!-- 어떤 형태로 프로젝트를 패키징할 지 결정 -->
  <packaging>war</packaging>
  
  <!-- 소스의 디렉토리 구조, 빌드 산출물 디렉토리 구조, 빌드시 사용할 플러긴 정보 관리 -->
  <build>
  	<!-- sourceDirectory : 자바 소스 코드를 관리하는 디렉토리 -->
  	<sourceDirectory>src/main/java</sourceDirectory>
  
	<!-- Maven제공 기능은 플러긴 기반으로 작동 따라서 설정 필요 -->  
    <plugins>
    
	  <!-- 컴파일 플러그인 설정 -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
        	<!-- 16>14변경 -->
          <release>14</release>
        </configuration>
      </plugin>
      
      <!-- 배포 패키징 플러긴 설정 -->
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
        <!-- configuration 추가 -->
        <configuration>
        	<!-- 배포할 위치 directory -->
        	<warSourceDirectory>src</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
  <!-- 라이브러리 버전관리 : properties -->
  <properties>
  	<javax.servlet-version>4.0.1</javax.servlet-version>
  	<javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
  	<javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
  	<org.springframework>5.2.2.RELEASE</org.springframework>
  </properties>
  
  <!-- 라이브러리 셋팅 : dependencies 프로그램과 의존관계인 라이브러리 관리 -->
  <dependencies>
  
  	<!-- servlet-api 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${javax.servlet-version}</version>
	    <scope>provided</scope>
	</dependency>
	
  	<!-- javax.servlet.jsp-api 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>javax.servlet.jsp</groupId>
	    <artifactId>javax.servlet.jsp-api</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${javax.servlet.jsp-version}</version>
	    <scope>provided</scope>
	</dependency>

	<!-- javax.servlet/jstl 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>jstl</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${javax.servlet.jsp.jstl-version}</version>
	</dependency>
	
	<!-- spring-webmvc 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${org.springframework}</version>
	</dependency>
    
    
	<!-- validation-api를 사용하기 위한 설정 -->
	<dependency>
	    <groupId>javax.validation</groupId>
	    <artifactId>validation-api</artifactId>
	    <version>2.0.1.Final</version>
	</dependency>
	
	
	<!-- hibernate-validator를 사용하기 위한 설정 -->
	<dependency>
  	  	<groupId>org.hibernate.validator</groupId>
  	 	<artifactId>hibernate-validator</artifactId>
 	 	<version>6.2.1.Final</version>
	</dependency>
	
	
	
  </dependencies>
</project>

Validation api를 사용하기 위해 dependency를 추가했고,
Hibernate-validator가 같이 있어야 하나베.. 뭐 설명도 안해주고 그냥 막 깔으라네... 차음내

https://mvnrepository.com/artifact/javax.validation/validation-api/2.0.1.Final

https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator/6.2.1.Final

자 여그서 받으이소~

 

 

 

 

Spring MVC XML 기본설정

일단 Spring MVC를 어떻게 구현할지 구조부터 대충 살펴보면,
전에 JSP MVC 패턴때 bean.xml 만들어서 bean을 정의해주었지
그 역할을 이젠 web.xml 이용해서 XML버전으로 만들어보자

아까 Java버전으로 치자면 ServletConfigClass의 역할을 얘가 하는거여

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
 	<!-- 현재 웹 애플리케이션에러 받아들이는 모든 요청에 대해 appServlet이란 이름으로 정의된 서블릿 사용 -->
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 설정 정보를 분석해 controller 선택하는 서블릿 지정 -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<!-- Spring MVC에서 저공하는 기본 서블릿 지정 -->
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- Spring MVC 설정을 위한 XML파일 지정 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/config/servlet-context.xml</param-value>
		</init-param>
		<!-- 로드는 딱 한 번만 시키기 : 서버 꺼질 때까지 한 번만 실행 -->
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Bean정의할 XML 파일 지정 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/root-context.xml</param-value>
	</context-param>

	<!-- 리스너 설정 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 파라미터 인코딩 필터 설정 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

 

 

이제 web.xml에서 context-param을 보면 bean을 정의할 xml파일을 지정해두었잖아?
root-context.xml 그걸 한 번 만들어보자

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

간단하지? bean을 설정할 수 있는 xmlns, xmls:xsi, xsi:schemaLocation을 삽입해준게 전부야

 

 

 

 

이번엔 web.xml에서 servlet을 보면 설정 정보 분석해서 controller를 선택해주는 서블릿 경로를 만들어뒀어
servlet-context.xml이건데, 그걸 한 번 해보자고

<?xml version="1.0" encoding="UTF-8"?>
<!-- mvc는 beans:beans로 태그 변경해야 인식함 -->
<beans:beans
	xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc
						http://www.springframework.org/schema/mvc/spring-mvc.xsd
						http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context.xsd">


	<!-- 스캔한 패키지 내부 클래스 중 @Controller 있는 클래스 controller로써 로딩하도록 설정 -->
	<annotation-driven />

	<!-- 스캔할 bean들이 모여있는 패키지 지정 -->
	<context:component-scan
		base-package="kr.co.goodee39.controller" />

	<!-- Controller의 메서드에서 반환하는 문자열 앞, 뒤에 붙일 경로 정보 셋팅 -->
	<beans:bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>


	<!-- 정적파일(img, video, audio) 로드 설정 -->
	<resources mapping="/**" location="/resources/" />
	
	<!-- ReloadableResourceBundleMessageSource 등록하기 -->
	<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
		<beans:property name="basename">
				<beans:value>/WEB-INF/properties/error_message</beans:value>
		</beans:property>
	</beans:bean>
	
	<!-- MessageSource 사용위한 Accessor 등록하기 -->
	<beans:bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
		<!-- ref에는 바로 위의 Reloadalble설정시 명명한 id값을 넣어주기 -->
		<beans:constructor-arg ref="messageSource"/>
	</beans:bean>
</beans:beans>

Java때랑 내용이 같은데, 표현법이 다른거야
annotaion-driven은 클래스에 @Controller달린걸 찾을 수 있게 도와주는 아이야
context:component-scan으로 controller 찾아낼 경로 설정해주고, 

beans:bean에서는 아까 Java에서 경로 자동으로 /WEB-INF/views/파일명.jsp 완성되도록 설정했어
prefix, suffix가 위치에 따른 설정인거쥐

마찬가지로 정적파일 즉 오디오, 사진, 비디오를 위한 파일을 불러오기 위한 폴더를 설정해주는데
resources로 할 수 있다.
mapping="/**"라는건 어떤 위치이든 뭐 그런 뜻일까...?ㅎㅎㅎㅎ

 

ReloadableResourceBundleMessageSource라는 객체 이올시다~
이 설정이 있어야만 Properties를 Message이용해서 JSP상에 띄우고, 바꾸고 하는 것이 가능해진다

단수개의 properties를 사용한다면 위처럼 적용하면 되고,
복수개의 properties를 사용한다면

<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
		<beans:property name="basenames">
			<beans:list>
				<beans:value>/WEB-INF/properties/data1</beans:value>
				<beans:value>/WEB-INF/properties/data2</beans:value>
			</beans:list>
		</beans:property>
	</beans:bean>

beans:list를 이용해 설정한다!

 

 

 

 

 

 

 

Controller 클래스 만들기

아까 위에서 web.xml보면 servlet에서 appServlet이란 이름으로 설정한 controller 선택 서블릿이 있는데,
servlet-context.xml라고 파일 하나 만들었좌나,
그리고 @Controller로 지정한 파일 알 수 있도록 annotaion-driven 태그 달아줬고,
context:component-scan으로 controller 찾아낼 경로 설정까지 했으니 이제 @Controller단 클래스를 하나 만들기야

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
	
	//ServletAppContext에서 설정한 configureViewResolvers()메소드 통해서 
	///WEB-INF/views/index.jsp로 변환됨
	@RequestMapping(value="/", method=RequestMethod.GET)
	public String home() {
		return "index";
		
	}
}

별건 없어
그냥 무슨 역할하는지 보자고!

위에서 계속 언급했듯 이 클래스는 controller의 역할을 할 클래스이므로 어노테이션으로 이름표 달아주고,
메소드를 하나 만드는데, 이 메소드는 무어냐
첫 페이지 역할, 그러니까 home 역할을 할 페이지를 설정하는 메서드야
그래서 이름도 home이야 후후
value는 우리 JSP MVC 패턴에서 servlet만들면 맨 상단에 

@WebServlet("/블라블라")하는 공간이 있어 (ㄴㅇㄹ는 무시혀~ 걍 쓴거임)
저 블라블라는 보통 servlet이름이 들어가는데, 파일을 실행시켜서 이동한다거나 하면
url에 저기 작성된 이름이 뒤에 뜨더라고?
근데 이걸 /만 남기고 지워주면?!
그냥 RequestDispatcher rdp = request.getRequestDispatcher("");에서 설정한 jsp파일이 home으로 떠부러
servlet이라는 위치가 jsp파일 앞전에 안붙기 때문이지!
그거랑 같은 이치야 value = "/"는

아무턴, return "문자열";은 이따가 만들 home이 될 jsp파일 이름을 넣어준거야
이 controller가 실행되면 index라는 홈이름이 아까 위에서 servlet-context.xml로 설정한 beans를 통해
prefix="/WEB-INF/views/"와 suffix=".jsp"를 만나 /WEB-INF/views/문자열.jsp가 되는거지

그리고 index.jsp에 이미지가 있다면 resources태그 통해서
src 앞에 /resources/가 콱 붙어주겠지~ 

 

이 아래부터는 Java버전이랑 동일합니다!

 

 

 

 

 

 

 

 

 

필드명 파서 그 안에 메세지 추가하기 위해 객체 생성
import javax.validation.constraints.Size;

public class DataVO1 {

	@Size(min = 2, max = 10)
	private String data1;
	
	//어노테이션으로 제공되는 validator 대신 직접 커스텀해서 사용해보자
	//rejectIfEmpty 객체 이용해서 처리해보자
	private String data2;
	
	//rejectIfEmptyOrWhiteSpace 객체 이용해서 처리해보자
	private String data3;
	
	public DataVO1() {
		// TODO Auto-generated constructor stub
	}

	public String getData1() {
		return data1;
	}

	public void setData1(String data1) {
		this.data1 = data1;
	}

	public String getData2() {
		return data2;
	}

	public void setData2(String data2) {
		this.data2 = data2;
	}

	public String getData3() {
		return data3;
	}

	public void setData3(String data3) {
		this.data3 = data3;
	}
	
}

data1은 기존에 했던 JSR-303사용해서 유효성 검사해보고,
data2, data3에는 validator이용해서 custom된 유효성 검사를 해볼꾸

 

 

 

 

 

 

 

 

properties 폴더 생성 및 properties 파일 만들기

 

WEB-INF내부에 properties 폴더 하나 파주고
error_message.properties라는 properties 확장자 타입의 파일 생성

Size.dataVO1.data1 = data1은 2 ~ 10자리 문자입니다.
# error2, error3는 DataVO1Validator에서 정의한 error명칭으로 임의의 이름이라 validator에서 정의한대로 사용하면 됨!
error2.dataVO1.data2 = data2는 공백 포함 1자리 이상이어야 합니다.
error3.dataVO1.data3 = data3은 공백 불포함 1자리 이상이어야 합니다.
# validator통해서 객체 받아와 필드마다 조건 커스텀한 내용 만족시 에러 발생 문구 
error22.dataVO1.data2 = data2는 10자리 이하여야 합니다.
error33.dataVO1.data3 = data3는 @을 포함해야 합니다.
# 어노테이션이름.커맨드객체(첫글자 소문자).변수로 설정해야함!

만약 이 파일이 없거나, 내용이 없다면
그냥 기본 문구인 이상이어야 합니다10 이런 식으로 출력되는데
뒤에 10은 임의의 숫자를 준 것으로 실제로는 입력한 값이 출력된다

 

 

 

 

 

 

 

 

Validator만들기
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import kr.co.goodee39.vo.DataVO1;

//validator를 커스텀하기 위해서는 Validator 인터페이스를 상속받아서 사용하기 위한 패키지가 필요하다
//패키지를 하나 만들고 validator 인페의 깡통 메서드를 재정의해서 사용하기 위한 클래스를 만들었다
public class DataVO1Validator implements Validator {

	//Validator 인터페이스의 내장 메서드 override
	@Override
	public boolean supports(Class<?> clazz) {
		// DataVO1.class.isAssignableFrom(clazz)를 return하기 
		return DataVO1.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		// rejectIfEmpty(errors객체, "필드이름(커맨드객체필드명)", "코드이름(임의설정)")
		//rejectIfEmpty : 값이 비어있으면 에러로 처리, but 공백 인정됨
		//필드에 값이 비어있으면 validator 처리 거절됨 reject!
		ValidationUtils.rejectIfEmpty(errors, "data2", "error2");
		
		//rejectIfEmptyOrWhiteSpace(errors객체, "필드이름(커맨드객체필드명)", "코드이름(임의설정)")
		//rejectIfEmptyOrWhitespace : 공백만 존재해도 유효성 검사시 에러로 처리
		//다만 아예 null, ""이라면 거절됨 reject!
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "data3", "error3");
		
		//타겟으로 DataVO1의 필드 받아오기 
		DataVO1 vo = (DataVO1)target;
		String data2 = vo.getData2();
		String data3 = vo.getData3();
		
		//받아온 필드에 대해 조건 달아주고
		if(data2.length() > 10) {
			//조건 만족시 발생할 에러 이름 만들어주고, properties에서 정의해두면 실행됨
			errors.rejectValue("data2", "error22");
		}
		
		if(data3.contains("@") == false) {
			errors.rejectValue("data3", "error33");
		}
	}

}

 

Validator통해 커스텀된 유효성 검사를 통한 에러 메세지 호출을 처리할 예정!
이걸 Controller에 등록만 하면 수행되는데,
이 Validator가 될 클래스는 Validator인터페이스를 상속받아야 한다!!!
그래야 그 내부의 깡통 메서드를 가져다가 사용할 수 있음!

 

supports메서드, validate 메서드가 깡통 메서드인데,
supports 메서드는 유효성 검사 대상으로 등록된 객체가 검사가 가능한지 확인하는 메서드야
DataVO1.class.isAssignableFrom(clazz); 를 return 해서 확인할 수 있쥐

validate메서드는 실제 유효성 검사를 하는 메서드야
여기에는 사실 다른 조건 없이도 기본적으로 사용할 수 있는 내장 메서드가 있는데,

rejectIfEmpty(errors객체, "필드이름(커맨드객체필드명)", "코드이름(임의설정)")
rejectIfEmptyOrWhiteSpace(errors객체, "필드이름(커맨드객체필드명)", "코드이름(임의설정)")

요 두가지야
rejectIfEmpty : 필드 이름이 없으면 거절돼! 그리고 공백 역시 채워진 것으로 인정돼! 암튼 이 조건들이 맞춰진다면
"코드이름"으로 properties에 정의된 오류를 호출해서 보여줘

rejectIfEmptyOrWhiteSpace : 얘는 위에 쟤랑 똑같은데 공백을 채워지지 않은 것으로 생각해서 오류를 송출해버려!
마찬가지로 "코드이름"으로 properties에 정의된 오류를 호출해서 보여줘

 

고 밑에 보면 왠 유효성 검사 대상인 객체를 가져와가지고는 내부 필드까지 쏙쏙 받아오지?
저건 이제 본격적으로 Validator를 커스텀하는 과정이야
각각 필드에다가 변수 줘서 그 변수마다 조건을 주는거지 직접!
그 조건에 만족하면 이제 errors.rejectValue("필드명", "properties에서 정의해둔 에러명")를 통해서
해당하는 에러가 뿅 나오는거임

 

 

 

 

 

HomeController에서 설정한 첫 페이지가 되어줄 index.jsp를 만들자
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 유효성 검사하기 -->
	<a href="input_data">Input_data</a>
</body>
</html>

누르면 유효성 검사할 값 넣고, 검사해서 오류 메시지 보여줄 페이지로 이동!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Controller 만들기
import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PostMapping;

import kr.co.goodee39.validator.DataVO1Validator;
import kr.co.goodee39.vo.DataVO1;

@Controller
public class TestController {

	@GetMapping("/input_data")
	public String inputData(DataVO1 dataVO1) {
		
		return "input_data";
	}
	
	@PostMapping("/input_pro")
	public String inputPro(@Valid DataVO1 dataVO1, BindingResult result) {
		
		if(result.hasErrors()) {
			return "input_data";
		}
		return "input_success";
	}
	
	//bind할 클래스(DataVO1Validator)를 bind해서 사용하겠다.
	@InitBinder
	public void initBinder(WebDataBinder binder) {
		DataVO1Validator validator1 = new DataVO1Validator();
		binder.addValidators(validator1);
	}
}

 

@Controller 설정 해주고,
a태그니까 GetMapping으로 페이지 이동 설정해주는데,
커맨드 객체를 받아와서 에러메세지 판단할 수 있도록 해주기

검사할 페이지에서는 spring form 태그를 사용하기 때문에 @PostMapping을 이용한다
form태그 action을 input_pro로 설정할꾸

검사할 커맨드 객체에 @Valid 달아주고, BindingResult객체 사용해 결과에 에러가 있는지 검사해준다
에러 메시지가 뜨면 그 페이지 고대로 머물러서 에러만 띄우고,
에러 없으면 success페이지로 이동한다

그리고 Controller에서 만들어둔 validator를 등록해주어야함!
@intBinder 어노테이션을 통해 설정 가능
커맨드 객체로 WebDataBinder를 필요로하며,
validator로 만든 객체 타입의 변수를 선언하고 binder통해 validator로서 추가하는데,
validator가 단수개라면 setValidator를 써도 무방하나
복수개라면 addValidator를 사용해야 한다!!!

 

 

 

 

 

 

 

 

 

값을 입력하고, 유효성 검사 결과를 표시할 input_data 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Input_Data</h1>
	
	<form:form action="input_pro" method="post" modelAttribute="dataVO1">
		data1 : <form:input path="data1"/><br />
				<form:errors path="data1"></form:errors><br />
				
		data2 : <form:input path="data2"/><br />
				<form:errors path="data2"></form:errors><br />
				
		data3 : <form:input path="data3"/><br />
				<form:errors path="data3"></form:errors><br />
				
		<form:button type="submit">확인</form:button>
	</form:form>
</body>
</html>

form:form태그 사용해 form 영역 생성하고
modelAttribute로 @Valid 설정해둔 객체 넣어준다
form:input에 삽입한 내용을 토대로 어노테이션으로 설정한 유효성 조건에 따라 form:errors로 메세지 띄우기~

에러 메시지도 스타일 설정 가능한데,
f12눌러서 개발자모드로 확인하면 span태그로 메세지가 들어감
거기서 id보고 설정할 수 있음!

로직을 보면, 일단 커맨드 객체에 달아둔 @Valid에 의해
어노테이션으로 유효성 조건 달아준 것들 검사하기도 하지만,

data2, data3는 커스텀한 validator를 따라서 유효성 검사를 실시한다.
큰 로직에서 보면 어쨌든 정해진 조건 이외는 모두 에러로 판단하고 에러 메시지를 호출한다는 것!

 

 

만약 유효성 검사 통과하면 아래 페이지로 이동

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

 <h1>Input_success</h1>
</body>
</html>

 

 

 

 

 

 

 

 

 

 

home으로 만들었던 index페이지에서 진짜 이동 되는지 한 번 해보자!

Run on Server를 클릭해주쟈

 

결과

 

 

 

 

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함