개인적인 정리

전자정부표준프레임워크 validation 검증/체크 본문

전자정부표준프레임워크

전자정부표준프레임워크 validation 검증/체크

yeon.Biju 2020. 9. 6. 11:27

전자정부표준프레임워크의 validation 을 체크하는 것을 정리해보고자 한다.

 

Spring framework + Jakarta Commons Validator 의 조합으로 보인다.

 

처음볼 때는 아래 위키가 조금 헷갈렸지만, 적용을 해보고 다시 보니 아래 위키가 가장 좋은 문서였다.

아래 위키문서와 전자정부프레임워크에 있는 소스들을 같이보면서 적용을 해보니 잘 되는 것 같다.

 

www.egovframe.go.kr/wiki/doku.php?id=egovframework:%EC%9A%94%EC%86%8C%EA%B8%B0%EC%88%A0_validation_%EC%B2%B4%ED%81%AC

 

egovframework:요소기술_validation_체크 [eGovFrame]

개발된 모든 공통기술에는 기본으로 제공되는 화면(JSP)의 입력항목에 대해 validation 체크 기능이 제공되어 있으나, 요소기술의 경우 그 쓰임새가 개발하고자 하는 어플리케이션의 개발 목적에 ��

www.egovframe.go.kr

www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:ptl:security:jakarta_commons_validator

 

egovframework:rte:ptl:security:jakarta_commons_validator [eGovFrame]

입력값 검증을 위한 Validation 기능은 Valang, Jakarta Commons, Spring 등에서 제공한다. 여기서는 Jakarta Commons Validator를 Spring Framework과 연동하여 사용하는 방법에 대해서 설명하고자 한다. Jakarta Commons Vali

www.egovframe.go.kr

그리고 전자정부표준프레임워크 3.9를 all-in-one 형태로 설치해놓은 것을 기준으로 설명한다. 

 

webobj.tistory.com/72?category=832887

 

전자정부 표준프레임워크 3.9 all-in-one 처음 셋팅해보기 -3(템플릿)

이제는 템플릿 all-on-one 을 셋팅해보고자 한다. 프로그램 준비는 (데이타베이스, jdk, 톰캣) 아래 URL을 참고한다. 이 글을 보기전에 준비가 다 되어 있어야 한다. https://webobj.tistory.com/70 전자정부 표

webobj.tistory.com

 

이 글은 전자정부표준프레임워크를 사용할 때 validation을 체크하는데 있어서 Server-side와 Client-side간에 하나의 코드로 동일하게 검증하는 방법을 구현해보는데 목표가 있다.

 

1. 개요

   - 입력값 검증을 위한 Validation 기능은 Valang, Jakarta Commons, Spring 등에서 제공한다.
   - 여기서는 Jakarta Commons Validator를 Spring Framework과 연동하여 사용하는 방법에 대해서 설명하고자 한다.

 

2. 라이브러리

   - commons-validator.jar

   - spring-modules-validation-0.9.jar

전자정부표준프레임워크를 설치해보면 위 2개의 라이브러리가 잘 들어있다. 없는 경우에는 당연히 추가를 해줘야 한다.

 

3. DefaultValidatorFactory, DefaultBeanValidator 설정

   - 위키에 보면 DefaultValidatorFactory, DefaultBeanValidator 2개의 클래스에 대한 설명이 나와있으니 설명은 위키를 참조한다.

   - context-validator.xml 에 보면 아래와 같이 이미 설정이 되어 있다.

   - 아래에 있는 validator-rules.xml은 application에서 사용하는 모든 validation rule에 대해 정의하는 파일이라고 한다. 
다시 한번 얘기하지만 자세한 설명은 위키문서를 참조한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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-4.0.xsd">
    
    <!-- Integration Apache Commons Validator by Spring Modules -->                
    <bean id="beanValidator" class="org.springmodules.validation.commons.DefaultBeanValidator">
        <property name="validatorFactory" ref="validatorFactory"/>
    </bean>
    
    <bean id="validatorFactory" class="org.springmodules.validation.commons.DefaultValidatorFactory">
        <property name="validationConfigLocations">
            <list>
                <!-- 공통기술 -->
                <value>classpath:/egovframework/validator/com-rules.xml</value>
                <value>classpath:/egovframework/validator/validator-rules.xml</value>
                <value>classpath:/egovframework/validator/**/*.xml</value>
            </list>
        </property>
    </bean>
    
</beans>
 
cs

 

4. validator.xml 설정(이름을 Aaaa.xml로 생성함)

   - 적당한 위치 즉 위의 validator-rules.xml 에 있는 경로의 위치에 파일을 생성한다. 전자정부표준프레임워크의 소스들에 보면 (/src/main/resources/egovframework/validator) 이미 validator.xml  과 같은 파일들이 많이 생성이 되어 있으니 그것들과 유사하게(이름, 경로등)을 파일을 생성한다.

   - validator.xmlvalidation rulevalidation할 Form을 매핑한다.

   - form namefield property의 name-ruleServer-side와 Client-side인 경우에 따라 다르다.

 

   - 여기서는 /src/main/resources/egovframework/validator/com/zzz/Aaaa.xml로 생성을 하였다.

 

5. 파일을 생성하고 다른 파일에서 내용을 카피하여 집어넣는다.

그럼 대략적으로 아래와 같은 파일내용이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC 
    "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN" 
    "http://jakarta.apache.org/commons/dtds/validator_1_1.dtd">
 
<form-validation>
    <formset>
        <form name="aaaaVO">
            <field property="name" depends="required, maxlength">
                <arg0 key="Aaaa.regist.name" />
                <arg1 key="10" resource="true"/>
                <var>
                    <var-name>maxlength</var-name>
                    <var-value>10</var-value>
                </var>
            </field>        
        </form>
    </formset>
 
</form-validation>
cs

1) form name="aaaaVO" 는 form name 이 aaaaVO라는 얘기고

2) field property="name" 은 name 이라는 필드명이고

3) depends="required, maxlength" 는 필수값,  maxlength 라는 얘기이다.

4) arg0 key="Aaaa.regist.name" 부분은 message_en.properties 또는 message_ko.properties 파일에서 Aaaa.regist.name를 키값으로 메세지를 불러온다는 얘기이다.(오류발생시)

 

form name과 field property는 validation할 폼 클래스의 이름, 필드과 각각 매핑된다.(camel case)
폼 클래스가 Employee면 employee, DepartmentForm 이면 departmentForm을 form name으로 지정하라.

 

6. Server-Side Validation 

   - Server-Side validation 을 먼저 생각해보자.

 

1) Controller 

   - jsp파일의 form에서 action으로 넘어가는 Controller 파일에 아래 코드를 추가한다.

1
2
3
if (bindingResult.hasErrors()) {
  return "adm/zzz/AaaRegist";
}
cs

 

2) jsp 

   - Validation을 적용할 jsp를 작성한다. 

   - <form:errors path="name" /> 부분에 에러메세지가 출력되는 형태이니 <form:errors path="name" /> 를 꼭 써준다. 

   - 당연한 얘기지만 aaaaVO 클래스에 name 속성이 있어야 한다.

1
2
3
4
5
6
7
8
<form:form commandName="aaaaVO" action="/zzz/aaaaainsert.do">
<table>
        ....
    <tr>
        <th>이름</th>
        <td><form:input path="name" size="20"/><form:errors path="name" /></td>
    </tr>
</form:form>
cs

* commandName 가 에러나는 경우에는 modelAttribute 로 대체한다. 스프링 어느 버전부터 변경된 것으로 보인다.

 

3) 에러메세지 등록

   - message_en.properties, message_ko.properties 파일모두에 적당히 등록을 해줘야 하는데

   - /egov/src/main/resources/egovframework/message/com/zzz 아래에 다른 것을 카피해서 적당히 넣어준다. message_en.properties, message_ko.properties 둘다 넣어준다.

   - controller 클래스는 /egov/src/main/java/egovframework/com/zzz/......  이고

     validator.xml은 /src/main/resources/egovframework/validator/com/zzz/

     messge는 /egov/src/main/resources/egovframework/message/com/zzz 이다.

 

1
Aaaa.regist.name=이름
cs

이라고 적당한 위치에 넣어준다. message_en.properties, message_ko.properties 두 파일 모두 넣어준다. 테스트용이므로 적당히 넣어준다.

4)웹 브라우저를 열어서 submit을 실행한다. (당연 에러를 내는 방식으로)

5)필수값인데 넣지 않았기 때문에 에러가 났다. 

 

6) 다시 생각해볼 것이 좀 있다.

   - message_en.properties, message_ko.properties 파일에 "이름"만 넣었는데, "is required"가 딸려왔다. 그 내용들은 /src/main/resources/egovframework/message/com/message-common_en.properties
/src/main/resources/egovframework/message/com/message-common_ko.properties 

2개의 파일에 위치하고 있다. 

즉 에러메세지를 등록할 때에는 수정해야 할(체크해야 할) 파일들에 대해서 유의하자.

(* 아직은 message파일들이 어떤 구조로 동작하는지 충분히 생각해보지 않은 상태라 전자정부표준프레임워크내의 다른 소스들을 기반으로 추측해서 넣었다.)

 

Server-Side validation은 여기서 일단 Done.

 

7. Client-Side Validation

 

1) validator.jsp 추가

   - 아래와 같은 내용으로 validation.jsp 를 추가한다. 

   - 전자정부표준프레임워크를 설치하면 아래와 같은 내용의 소스들은 이미 많이 들어있으니 참고한다.

 

여기서는 예제로 Controller에 아래와 같이 하나 추가해준다.

1
2
3
4
5
@RequestMapping("/zzz/aaaa/validator.do")
public String validate(){
    return "egovframework/com/cmm/validator";
}    
 
cs

해당 JSP의 내용은 아래와 같다.

1
2
3
<%@ page language="java" contentType="javascript/x-javascript" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<validator:javascript dynamicJavascript="false" staticJavascript="true"/>
cs

 

2) JSP 설정(taglib,javascript) 추가

 

2-1) commons-validator taglib를 선언한다.

1
<%@ taglib prefix=“validator” uri=“http://www.springmodules.org/tags/commons-validator” %>
cs

 

2-2) 필요한 자바 스크립트 함수를 generate 하기 위한 코드를 추가 한다. validation-rules.xml에서 선언한 함수를 불러 오기 위해, 위에서 작성한 validator.jsp를 아래와 같이 호출한다.

1
<script type="text/javascript" src="<c:url value="/zzz/aaa/validator.do"/>"></script>
cs

 

2-3) 위의 자바 스크립트 함수를 이용해 필요한 validation과 메시지 처리를 위한 자바 스크립트를 generate 하기 위한 코드를 추가 한다. formName에는 validator.xml에서 정의한 form의 이름을 써준다.

1
<validator:javascript formName="aaaaVO" staticJavascript="false" xhtml="true" cdata="false"/>
cs

 

2-4) form submit시에 validateVO클래스명() 함수를 호출한다. 예제는 아래와 같다.

1
2
3
4
5
<form:form commandName="searchVO" name="aaaaVO" method="post" action="${pageContext.request.contextPath}/zzz/insertAaaa.do" onsubmit="return fn_egov_save();" >
.
.
.
</form:form 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
function fn_egov_save(){
    var varForm = document.aaaaVO;
    if(confirm("<spring:message code='common.save.msg' />")){
 
        if(!validateAaaaVO(varForm)){            
            return false;
        }else{
            varForm.submit();
        } 
    }
}
</script>
cs

 

3) 웹브라우저를 열어서 submit 을 실행.

   - alert 창으로 동일한 메세지가 출력된다.

 

이로써 Server-Side와 Client-Side상에서 동일한 로직으로 validation을 체크하는 방법을 생각해봤다. 이제 시작이라 고민해볼 요소들이 더 존재한다. 

Comments