1. 템플릿 소스의 웹환경 관련 설정은 아래 3곳의 위치에 정의되어 사용된다. - web.xml - classpath*:egovframework/spring/com/context-*.xml - /WEB-INF/config/egovframework/springmvc/*.xml 2. 템플릿 소스의 DB관련 설정은 globlas.properties에 정의되어 사용된다.
<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>
추가 설정파일들은 템플릿 프로젝트 소스의 각 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 폴더 아래에 위치한다. 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>
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