목차

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

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

web.xml 주요 설정

      <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>
    -->
        <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
				classpath*:egovframework/spring/com/context-*.xml
		</param-value>
	</context-param>
        <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>
    <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 관련 설정정보가 등록된다.(템플릿 종류별로 차이 있음)
    <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>
    ...
    <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());
    }
    ...
    -->
    <!-- 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>
    <!-- 시스템에서 업무별로 레코드 신규발생시 일련번호를 생성하는 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();
    ...
    -->
    <!-- 프로퍼티 정보 설정 -->
    <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");
    ...
    -->
    <!-- 소스내 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 관련 설정 정보가 등록된다. 
    <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>
    <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"/>
    <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>
<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에 대한 제약이 필터설정과 함께 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관련 설정

  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