경량환경 템플릿 구성 및 환경설정(configration)

1. 템플릿 소스의 웹환경 관련 설정은 아래 3곳의 위치에 정의되어 사용된다.
 - web.xml
 - classpath*:egovframework/spring/com/context-*.xml
 - /WEB-INF/config/egovframework/springmvc/*.xml
2. 템플릿 소스의 DB관련 설정은 globlas.properties에 정의되어 사용된다.
 

web.xml 주요 설정

  • *.do로 호출되는 경우 기본 화면에 출력되는 encoding은 utf-8로 필터링 되도록 설정하여 특수문자에 의한 크로스사이트 스크립트를 방지한다. HTMLTagFilter를 설정하면 파라미터로 전달되는 값 자체를 변환하는 방식의 사용도 가능하다. 템플릿 소스에서는 화면을 통해 입력하는 값을 변환하지 않고 출력하는 시점에 encoding처리하는 방식을 기본으로 사용한다.
      <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>
	</filter>    
	<filter>
        <filter-name>HTMLTagFilter</filter-name>
        <filter-class>
            egovframework.rte.ptl.mvc.filter.HTMLTagFilter
        </filter-class>
    </filter>
    <filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>*.do</url-pattern>
    </filter-mapping>
    <!-- 템플릿은 UTF-8 인코딩 필터와 JSP 출력시 <c:out> 태그 사용이 기본정책 -->
    <!-- 아래의 HtmlTagFilter를 추가등록하고 기능을 보강하여 사용할 수도 있음 -->
    <!--
    <filter-mapping>
        <filter-name>HTMLTagFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    -->
  • spring context관련 환경설정정보 파일 위치를 등록한다.
        <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
				classpath*:egovframework/spring/com/context-*.xml
		</param-value>
	</context-param>
  • spring mvc를 위한 Listener, DispatcherServlet설정과 mvc관련 관련 추가 환경설정정보 파일위치를 등록한다.
        <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
 
	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
				/WEB-INF/config/egovframework/springmvc/*.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
  • spring security 를 사용하는 경우 포함되는 설정(내부업무, 포털사이트 템플릿만 포함됨)
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
    <listener>
        <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
    </listener>

egovframework/spring/com/context-*.xml 주요 설정

 추가 설정파일들은 템플릿 프로젝트 소스의 각 resource/egovframework/spring/com/폴더 아래에 위치한다. 
 anontation, aop, schedule, validation, security, id-generation, sqlmap, transaction 관련 설정정보가 등록된다.(템플릿 종류별로 차이 있음)
  • context-aspect.xml의 ExceptionTransfer 설정(템플릿 서비스임플 클래스에서 발생하는 경우는 Exception에 대한 개별 로그를 출력)
    <aop:config>
        <aop:pointcut id="serviceMethod"
            expression="execution(* egovframework.let..impl.*Impl.*(..)) or execution(* egovframework.com..impl.*Impl.*(..))" />
 
        <aop:aspect ref="exceptionTransfer">
            <aop:after-throwing throwing="exception"
                pointcut-ref="serviceMethod" method="transfer" />
        </aop:aspect>
    </aop:config>
    ...
  • context-common.xml의 egovMessageSource 설정(프로퍼티 파일에 등록된 메시지 활용), leavaTrace 설정(Exception발생시 개별 Trace 출력)
    <bean id="egovMessageSource" class="egovframework.com.cmm.EgovMessageSource">
        <property name="reloadableResourceBundleMessageSource">
            <ref bean="messageSource" />
        </property> 
    </bean>
    ...
 
    <!-- Exception 발생시 후처리용 별도작업을 위해 실행환경의 LeveaTrace를 활용하도록 설정 -->
    <bean id="leaveaTrace" class="egovframework.rte.fdl.cmmn.trace.LeaveaTrace">
	<property name="traceHandlerServices">
		<list>
			<ref bean="traceHandlerService" />
		</list>
	</property>
    </bean>
    ...
 
    <!-- 소스내에서 egovMessageSource의 사용 예
        @Resource(name="egovMessageSource")
        EgovMessageSource egovMessageSource;
        String message = egovMessageSource.getMessage("fail.common.login");
    -->
    <!-- 소스내에서  사용 예(템플릿에서는 특별한 후속처리 없으므로 로그아웃시에 샘플소스만 적용함)
    @Resource(name="leaveaTrace") LeaveaTrace leaveaTrace;
    ...
    } catch (ArithmeticException athex) {
        // TraceHandler에서 메시지에 따른 후속조치 등을 처리할 수 있다.
        leaveaTrace.trace("fail.common.msg", this.getClass());
    }
    ...
    -->
  • context-datasource.xml의 datasource 설정
    <!-- globals.properties 파일에 등록된 DB정보를 사용하여 datasource 정보를 정의한다. -->
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:/egovframework/egovProps/globals.properties</value>
            </list>
        </property>
    </bean>
 
    <!-- datasource 설정(propertyConfigurer 활용) -->
    <alias name="dataSource-${Globals.DbType}" alias="dataSource" />
    <alias name="dataSource-${Globals.DbType}" alias="egov.dataSource" />
 
    <!-- mysql -->
    <bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${Globals.DriverClassName}"/>
        <property name="url" value="${Globals.Url}" />
        <property name="username" value="${Globals.UserName}"/>
        <property name="password" value="${Globals.Password}"/>
    </bean>
    ...
 
    <!-- DB 4개 종류에 대한 정의 샘플이 존재한다. --> 
    <!-- 홈페이지 템플릿 globals.properties의 dbtype을 hsql로 변경후 아래 설정을 사용하여 간단한 테스트가 가능하다. -->
    <bean id="dataSource-hsql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"/>
	<property name="url" value="jdbc:log4jdbc:hsqldb:hsql://localhost/sampledb"/>
	<property name="username" value="sa"/>
    </bean>
  • context-idgen.xml의 업무별 일련번호 생성 서비스 설정
    <!-- 시스템에서 업무별로 레코드 신규발생시 일련번호를 생성하는 bean 클래스 설정 -->
    <!-- 첨부파일 ID Generation  Config-->
    <bean name="egovFileIdGnrService"
        class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrService"
        destroy-method="destroy">
        <property name="dataSource" ref="dataSource-${Globals.DbType}" />
        <property name="strategy" ref="fileStrategy" />
        <property name="blockSize"  value="10"/>
        <property name="table"      value="IDS"/>
        <property name="tableName"  value="FILE_ID"/>
    </bean>
    <!-- 첨부파일 ID Generation  Strategy Config -->
    <bean name="fileStrategy"
        class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl">
        <property name="prefix" value="FILE_" />
        <property name="cipers" value="15" />
        <property name="fillChar" value="0" />
    </bean>
    ...
 
    <!-- 소스내 사용 예
       ...
    @Resource(name = "egovFileIdGnrService") private EgovIdGnrService idgenService;
    ...
    String newId = idgenService.getNextStringId();
    ...
    -->
  • context-properties.xml의 프로퍼티 값 설정
    <!-- 프로퍼티 정보 설정 -->
    <bean name="propertiesService" class="egovframework.rte.fdl.property.impl.EgovPropertyServiceImpl" destroy-method="destroy">
        <property name="properties">
            <map>
                <entry key="pageUnit" value="10"/>
                <entry key="pageSize" value="10"/>
                <entry key="posblAtchFileSize" value="5242880"/>
                <entry key="Globals.fileStorePath" value="/user/file/sht/"/>
                <entry key="Globals.addedOptions" value="false"/>
            </map>
        </property>
    </bean>
 
    <!-- 소스 내 사용 예
    @Resource(name = "propertiesService") protected EgovPropertyService pService;
    ...
    String savePath = pService.getString("Globals.fileStorePath");
    ...
    -->
  • context-sqlMap.xml의 프로퍼티 값 설정
    <!-- 소스내 DAO에서 사용할 쿼리문의 위치정보를 확인 bean 설정으로 Dao 클래스에서 extends하는 AbstractDao내부에 포함하여 사용 -->
    <!-- configLocations properties 항목에 쿼리문 위치정보 파일들을 등록(각 위치정보 파일내에 실제 쿼리문들이 포함된 파일들의 위치정보가 존재) --> 
    <!-- SqlMap setup for iBATIS Database Layer -->
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocations">
            <list>
                <value>classpath:/egovframework/sqlmap/config/${Globals.DbType}/*.xml</value>
            </list>
        </property>
        <property name="dataSource" ref="dataSource-${Globals.DbType}"/>
        <property name="lobHandler" ref="lobHandler"/>
    </bean>
    ...
 
    <!-- 소스내 사용예 (DAO 클래스 정의시 extends를 통해 자동으로 사용 -->
    <!-- com.sqlMapClient 와 같이 새로 지정한후 EgovAbstractDAO를 재정의하여 사용할수도 있음(소스내 설정 참고) --> 
    @Repository("BBSAttributeManageDAO") 
    public class BBSAttributeManageDAO extends EgovAbstractDAO {
    ...

* context-transaction.xml의 트랜잭션 설정

        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	  <property name="dataSource" ref="dataSource"/>
	</bean>
 
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="*" rollback-for="Exception"/>
		</tx:attributes>
	</tx:advice>
 
	<aop:config>
		<aop:pointcut id="requiredTx"
			expression="execution(* egovframework.let..impl.*Impl.*(..)) or execution(* egovframework.com..*Impl.*(..))"/>
		<aop:advisor advice-ref="txAdvice"
			pointcut-ref="requiredTx" />
	</aop:config>
 
        <!-- 템플릿에서는 서비스 임플 클래스내의 함수내에서 트랜잭션을 처리한다.(Exception발생시 임플클래스의 함수내에서 호출된 DAO 함수들의 처리결과가 모두 롤백됨) -->

* context-validator.xml의 Vaildator설정

    <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/validator-rules-let.xml</value>
	            <value>classpath:/egovframework/validator/let/**/*.xml</value>
            </list>
        </property>
    </bean>
 
    <!-- validationConfigLocations 프로퍼터로 등록된 xml파일내에 validation시 사용될 함수와 validation의 대상이 되는 form 정보가 등록된다. -->
    <!-- classpath:/egovframework/validator/validator-rules-let.xml 내용 예 
        ...
        <validator name="required"
        ...
        <javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                ...
    -->
    <!-- classpath:/egovframework/validator/let/*.xml 내용 예 
        ...
        <validator name="required"
        ...
        <javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                ...
    -->
    <!--
        <formset>
		    <form name="boardMaster">
			    <field property="bbsNm" depends="required">
        		    <arg0 key="cop.bbsNm" />
        		</field>
            ...
    -->

* context-security.xml의 스프링 시큐리티 설정 (내부업무 템플릿, 포탈사이트 템플릿 해당)

    <!-- 스프링시큐리티 관련 bean들에 대한 설정으로 jdbcService를 사용한 권한컨트롤 설정을 조정하여 사용할 수 있다. -->
    <b:bean id="jdbcUserService"
            class="egovframework.let.sec.security.userdetails.jdbc.EgovJdbcUserDetailsManager" >
        <b:property name="usersByUsernameQuery" value="SELECT USER_ID, ESNTL_ID AS PASSWORD, 1 ENABLED, USER_NM, USER_ZIP, USER_ADRES, USER_EMAIL, USER_SE, usr.ORGNZT_ID, ESNTL_ID, org.ORGNZT_NM FROM COMVNUSERMASTER usr, LETTNORGNZTINFO org WHERE usr.ORGNZT_ID = org.ORGNZT_ID AND CONCAT(USER_SE, USER_ID) = ? "/>
 
        <b:property name="authoritiesByUsernameQuery" value="SELECT A.SCRTY_DTRMN_TRGET_ID USER_ID, A.AUTHOR_CODE AUTHORITY FROM LETTNEMPLYRSCRTYESTBS A, COMVNUSERMASTER B WHERE A.SCRTY_DTRMN_TRGET_ID = B.ESNTL_ID AND B.USER_ID = ? "/>
        <b:property name="roleHierarchy" ref="roleHierarchy"/>
        <b:property name="dataSource" ref="dataSource"/>
        <b:property name="mapClass" value="egovframework.let.sec.security.common.EgovSessionMapping"/>
    </b:bean>

* context-excel.xml의 excel파일 컨트롤 설정(내부업무 템플릿 해당)

    <bean id="excelZipService"	class="egovframework.rte.fdl.excel.impl.EgovExcelServiceImpl">
        <property name="propertyPath" value="excelInfo.xml" />
        <property name="mapClass" value="egovframework.let.sym.ccm.zip.service.impl.EgovCcmExcelZipMapping" />
        <property name="sqlMapClient" ref="sqlMapClient" />
    </bean>
    <!-- 소스내 사용 예 (엑셀컬럼 정보를 설정한후 정보 설정한 후 (템플릿의 EgovCcmExcelZipMapping 클래스 참조) 엑셀업로드시 uploadExcel 함수 사용)
           ...
           excelZipService.uploadExcel("ZipManageDAO.insertExcelZip", file, 2, (long) 5000);
      ...
    -->

* context-scheduling.xml의 일단위 접속통계 스케쥴링 설정(내부업무 템플릿 해당)

    <!-- 시스템 로그 요약  -->
    <bean id="sysLogging"
       class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="egovSysLogScheduling" />
        <property name="targetMethod" value="sysLogSummary" />
        <property name="concurrent" value="false" />
    </bean>
    <bean id="sysLogTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="sysLogging" />
        <!-- 시작하고 1분후에 실행한다. (milisecond) 60000-->
        <property name="startDelay" value="30000" />
        <!-- 매 24시간마다 실행한다.864000000 (milisecond) -->
        <property name="repeatInterval" value="864000000" />
    </bean>
    <bean id="sysLogScheduler"
       class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list><ref bean="sysLogTrigger" /></list>
        </property>
    </bean>
 
    <!-- 서버가동후 1분후 시점을 기준으로 일단위로 egovSysLogScheduling서비스의 sysLogSummary()를 실행  -->

* context-syslogaop.xml의 aop를 사용한 로그 기록 설정(내부업무 템플릿 해당)

    <bean id="logManage" class="egovframework.let.sym.log.clg.service.EgovLoginLogAspect" />
        <aop:config>
            <aop:aspect id="logManageAspect" ref="logManage">
                <!--  로그인 Method -->
                <aop:before pointcut="execution(public * egovframework.let.uat.uia.service.EgovLoginService.actionLogin(..))" method="logLogin" />
	    </aop:aspect>
    </aop:config>
 
    <!-- 로그인 관련 서비스 클래스내에서 actionLogin으로 시작하는 함수 동작시 logManage를 통해 접속로그 등록 -->

/WEB-INF/config/egovframework/springmvc/*.xml

 추가설정파일들은 템플릿 프로젝트 소스의 각 WEB-INF/config/egovframework/springmvc 폴더 아래에 위치한다.
 exception, view, error-page 관련 설정 정보가 등록된다. 
  • auto detect를 위한 mvc 설정
    <context:component-scan base-package="egovframework">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>
  • anotation request mapping과 commandmap형태의 argument를 전달을 위한 설정
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="webBindingInitializer">
            <bean class="egovframework.com.cmm.web.EgovBindingInitializer"/>
        </property>
        <property name="customArgumentResolvers">
            <list>
                <bean class="egovframework.rte.ptl.mvc.bind.CommandMapArgumentResolver"/>
            </list>
        </property>
    </bean>
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
  • exception 발생시 이동할 오류페이지 설정
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="cmm/error/egovError"/>
        <property name="exceptionMappings">
            <props>
                <prop key="org.springframework.dao.DataAccessException">cmm/error/dataAccessFailure</prop>
                <prop key="org.springframework.transaction.TransactionException">cmm/error/transactionFailure</prop>
                <prop key="egovframework.rte.fdl.cmmn.exception.EgovBizException">cmm/error/egovError</prop>
                <prop key="org.springframework.security.AccessDeniedException">cmm/error/accessDenied</prop>
            </props>
        </property>
    </bean>
  • 화면처리용 JSP 파일명의 prefix, suffix 처리에 대한 설정
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1" 
    p:viewClass="org.springframework.web.servlet.view.JstlView" 
    p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
  • 로그인이 필요한 URL을 체크하는 필터설정(홈페이지 템플릿만 사용하고 다른 템플릿은 시큐리티 권한 적용)
    <!--홈페이지 템플릿은 로그인한 관리자에게 허용되는 URL에 대한 제약이 필터설정과 함께 Controller클래스내에서 접근체크함수를 통해서도 체크한다.-->
    <!--필터설정이 해제되어도 소스내에서 체크로직이 존재하므로 제약 변경시 해당 Request Mapping(***.do)에 해당하는 Controller내의 소스 수정요함 -->
    <bean id="selectAnnotaionMapper"
        class="egovframework.rte.ptl.mvc.handler.SimpleUrlAnnotationHandlerMapping"
        p:order="1">
        <property name="interceptors">
            <list>
                <ref local="authenticInterceptor" />
            </list>
        </property>
        <property name="urls">
            <set>
                 <!-- 게시판 생성, 템플릿 생성은 로그인후 사용 가능하다. 관리자만 사용가능  -->
                 <value>/cop/com/*.do</value>
                 <value>/cop/bbs/*Master*.do</value>
                 <value>/uat/uia/*.do</value>
            </set>
        </property>
    </bean>
 
    <bean id="authenticInterceptor" class="egovframework.com.cmm.interceptor.AuthenticInterceptor" >
	    <!-- 로그인 체크 인터셉터의 접근허용 URL 리스트-->
            <property name="permittedURL">
            <set>
                <value>/uat/uia/actionLogin.do</value>
                <value>/uat/uia/egovLoginUsr.do</value>
            </set>
	    </property>
    </bean>

datasource관련 설정

  • globals.properties 주요 설정정보(datasource.xml의 설정 정보로 적용)
  databse 종류, databse dirver, databse 계정/암호 등을 설정한다.
  템플릿 3종 모두 동일하게 적용되는데 홈페이지의 경우는 Hsql DB를 사용할 수 있는 설정이 추가로 포함되어 있다.  
  # DB서버 타입(mysql,oracle,altibase,tibero) - datasource 및 sqlMap 파일 지정에 사용됨
    Globals.DbType = mysql
  # DB 사용자 계정  
  Globals.UserName=sht
  # DB 사용자 암호
  Globals.Password=sht01
  # driver 정보l
  Globals.DriverClassName=net.sf.log4jdbc.DriverSpy
  # DB 연결 정보
  Globals.Url=jdbc:mysql://126.0.0.1:3306/SHT
 
egovframework/let/configration.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki