데이터베이스를 간단하게 여러 종류(mySQL, oracle)를 통합해서 보기 위해 DBeaver를 다운로드한다.
아이디 com / 비번 com01 - global.properties에서 확인할 수 있음
mySQL을 먼저 실행해준다.
startup 더블클릭
이클립스에 만들어져 있는 All-in-one파일에서 복사해서 테이블 만들고(DDL) 데이터 insert(DML)할 수 있다.
DB를 oralce로 바꾸고 싶을 때
: global.properties 타입을 oracle로 변경
이클립스에서 mysql로 테이블을 생성하고 싶을 때
com_DDL_mysql.sql을 이클립스로 열기
MYSQL 5.1로 설정
sql파일에서 우클릭> Excute All을 누르면 해당 SQL이 실행되어 테이블이 만들어진다.
결과 : 데이터가 다시 만들어진 것을 확인할 수 있다.
web.xml에서는 동적인코드를 작성하기 어렵기 때문에 스프링이 cmm> config와 context
오른쪽(web.xml)이 왼쪽(서버사이드)처럼 바뀌고 있는 추세(서버사이드 형식)
(web.xml과 같은 기능을 한다)
package egovframework.com.cmm.config;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.multipart.support.MultipartFilter;
import org.springframework.web.servlet.DispatcherServlet;
import egovframework.com.cmm.filter.HTMLTagFilter;
import egovframework.com.cmm.filter.SessionTimeoutCookieFilter;
import egovframework.com.cmm.service.EgovProperties;
import egovframework.com.sec.security.filter.EgovSpringSecurityLoginFilter;
import egovframework.com.sec.security.filter.EgovSpringSecurityLogoutFilter;
import egovframework.com.uat.uap.filter.EgovLoginPolicyFilter;
import egovframework.com.utl.wed.filter.CkFilter;
/**
* EgovWebApplicationInitializer 클래스
* <Notice>
* 사용자 인증 권한처리를 분리(session, spring security) 하기 위해서 web.xml의 기능을
* Servlet3.x WebApplicationInitializer 기능으로 처리
* <Disclaimer>
* N/A
*
* @author 장동한
* @since 2016.06.23
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- ------------- ----------------------
* 2016.06.23 장동한 최초 생성
* 2018.10.02 신용호 Facebook 관련 HiddenHttpMethodFilter 추가
* 2018.10.26 신용호 EgovLoginPolicyFilter 추가 (IP접근처리)
* 2018.12.03 신용호 springMultipartFilter,HTMLTagFilter 추가 (XSS방지처리)
* </pre>
*/
public class EgovWebApplicationInitializer implements WebApplicationInitializer {
private static final Logger LOGGER = LoggerFactory.getLogger(EgovWebApplicationInitializer.class);
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
LOGGER.debug("EgovWebApplicationInitializer START-============================================");
//-------------------------------------------------------------
// Egov Web ServletContextListener 설정
//-------------------------------------------------------------
servletContext.addListener(new egovframework.com.cmm.context.EgovWebServletContextListener());
//-------------------------------------------------------------
// Spring CharacterEncodingFilter 설정
//-------------------------------------------------------------
FilterRegistration.Dynamic characterEncoding = servletContext.addFilter("encodingFilter", new org.springframework.web.filter.CharacterEncodingFilter());
characterEncoding.setInitParameter("encoding", "UTF-8");
characterEncoding.setInitParameter("forceEncoding", "true");
characterEncoding.addMappingForUrlPatterns(null, false, "*.do");
//characterEncoding.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "*.do");
//-------------------------------------------------------------
// Spring ServletContextListener 설정
//-------------------------------------------------------------
XmlWebApplicationContext rootContext = new XmlWebApplicationContext();
rootContext.setConfigLocations(new String[] { "classpath*:egovframework/spring/com/**/context-*.xml" });
//rootContext.setConfigLocations(new String[] { "classpath*:egovframework/spring/com/context-*.xml","classpath*:egovframework/spring/com/*/context-*.xml" });
rootContext.refresh();
rootContext.start();
servletContext.addListener(new ContextLoaderListener(rootContext));
//-------------------------------------------------------------
// Spring ServletContextListener 설정
//-------------------------------------------------------------
XmlWebApplicationContext xmlWebApplicationContext = new XmlWebApplicationContext();
xmlWebApplicationContext.setConfigLocation("/WEB-INF/config/egovframework/springmvc/egov-com-*.xml");
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(xmlWebApplicationContext));
//dispatcher.addMapping("*.do");
dispatcher.addMapping("/"); // Facebook OAuth 사용시 변경
dispatcher.setLoadOnStartup(1);
if("security".equals(EgovProperties.getProperty("Globals.Auth").trim())) {
//-------------------------------------------------------------
// springSecurityFilterChain 설정
//-------------------------------------------------------------
FilterRegistration.Dynamic springSecurityFilterChain = servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy());
springSecurityFilterChain.addMappingForUrlPatterns(null, false, "*");
//servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain")).addMappingForUrlPatterns(null, false, "/*");
//-------------------------------------------------------------
// HttpSessionEventPublisher 설정
//-------------------------------------------------------------
servletContext.addListener(new org.springframework.security.web.session.HttpSessionEventPublisher());
//-------------------------------------------------------------
// EgovSpringSecurityLoginFilter 설정
//-------------------------------------------------------------
FilterRegistration.Dynamic egovSpringSecurityLoginFilter = servletContext.addFilter("egovSpringSecurityLoginFilter", new EgovSpringSecurityLoginFilter());
//로그인 실패시 반활 될 URL설정
egovSpringSecurityLoginFilter.setInitParameter("loginURL", "/uat/uia/egovLoginUsr.do");
//로그인 처리 URL설정
egovSpringSecurityLoginFilter.setInitParameter("loginProcessURL", "/uat/uia/actionLogin.do");
//처리 Url Pattern
egovSpringSecurityLoginFilter.addMappingForUrlPatterns(null, false, "*.do");
//-------------------------------------------------------------
// EgovSpringSecurityLogoutFilter 설정
//-------------------------------------------------------------
FilterRegistration.Dynamic egovSpringSecurityLogoutFilter = servletContext.addFilter("egovSpringSecurityLogoutFilter", new EgovSpringSecurityLogoutFilter());
egovSpringSecurityLogoutFilter.addMappingForUrlPatterns(null, false, "/uat/uia/actionLogout.do");
} else if("session".equals(EgovProperties.getProperty("Globals.Auth").trim())) {
//-------------------------------------------------------------
// EgovLoginPolicyFilter 설정
//-------------------------------------------------------------
FilterRegistration.Dynamic egovLoginPolicyFilter = servletContext.addFilter("LoginPolicyFilter", new EgovLoginPolicyFilter());
egovLoginPolicyFilter.addMappingForUrlPatterns(null, false, "/uat/uia/actionLogin.do");
}
//-------------------------------------------------------------
// CkFilter 설정 (CKEditor 사용시 설정)
//-------------------------------------------------------------
FilterRegistration.Dynamic regCkFilter = servletContext.addFilter("CKFilter", new CkFilter());
regCkFilter.setInitParameter("properties", "egovframework/egovProps/ck.properties");
regCkFilter.addMappingForUrlPatterns(null, false, "/ckUploadImage");
//-------------------------------------------------------------
// HiddenHttpMethodFilter 설정 (Facebook OAuth 사용시 설정)
//-------------------------------------------------------------
FilterRegistration.Dynamic hiddenHttpMethodFilter = servletContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter());
hiddenHttpMethodFilter.addMappingForUrlPatterns(null, false, "/*");
//-------------------------------------------------------------
// Tomcat의 경우 allowCasualMultipartParsing="true" 추가
// <Context docBase="" path="/" reloadable="true" allowCasualMultipartParsing="true">
//-------------------------------------------------------------
MultipartFilter springMultipartFilter = new MultipartFilter();
springMultipartFilter.setMultipartResolverBeanName("multipartResolver");
FilterRegistration.Dynamic multipartFilter = servletContext.addFilter("springMultipartFilter", springMultipartFilter);
multipartFilter.addMappingForUrlPatterns(null, false, "*.do");
//-------------------------------------------------------------
// HTMLTagFilter의 경우는 파라미터에 대하여 XSS 오류 방지를 위한 변환을 처리합니다.
//-------------------------------------------------------------
// HTMLTagFIlter의 경우는 JSP의 <c:out /> 등을 사용하지 못하는 특수한 상황에서 사용하시면 됩니다.
// (<c:out />의 경우 뷰단에서 데이터 출력시 XSS 방지 처리가 됨)
FilterRegistration.Dynamic htmlTagFilter = servletContext.addFilter("htmlTagFilter", new HTMLTagFilter());
htmlTagFilter.addMappingForUrlPatterns(null, false, "*.do");
//-------------------------------------------------------------
// SessionTimeoutCookieFilter는 쿠키에 타임아웃 시간을 기록한다.
//-------------------------------------------------------------
// latestServerTime - 서버 최근 시간
// expireSessionTime - 세션이 만료되는 시간
FilterRegistration.Dynamic sessionTimeoutFilter = servletContext.addFilter("sessionTimeoutFilter", new SessionTimeoutCookieFilter());
sessionTimeoutFilter.addMappingForUrlPatterns(null, false, "*.do");
//-------------------------------------------------------------
// Spring RequestContextListener 설정
//-------------------------------------------------------------
servletContext.addListener(new org.springframework.web.context.request.RequestContextListener());
LOGGER.debug("EgovWebApplicationInitializer END-============================================");
}
}
세션 타임아웃기능 => 필터로 설정할 수 있다.
아래 소스 참고
//-------------------------------------------------------------
// SessionTimeoutCookieFilter는 쿠키에 타임아웃 시간을 기록한다.
//-------------------------------------------------------------
// latestServerTime - 서버 최근 시간
// expireSessionTime - 세션이 만료되는 시간
FilterRegistration.Dynamic sessionTimeoutFilter = servletContext.addFilter("sessionTimeoutFilter", new SessionTimeoutCookieFilter());
sessionTimeoutFilter.addMappingForUrlPatterns(null, false, "*.do");
프론트 단 <-> 서버사이드
Request, Reponse객체 제어(Interceptor) => 프론트 단
자바 클래스를 제어(AOP) => 서버사이드
egovframework와 kr.or.ddit 패키지에서
Controller만 포함하고
Service와 Repository는 제외하겠다.
include가 되면 (내부에서 자동으로) instance화 되어 new로 생성하지 않아도 그대로 가져다 쓸 수 있다.
include 되면 위의 new가 아닌 아래의 instance를 가져오는 형식으로(내부적으로) 구동이 된다.
SessionLocaleResolver
CookieLocaleResolver
세션과 쿠키 두 가지 방법으로 다국어 처리가 가능하다.
<!-- 국제화 Message 설정 (다국어 처리 i18n)-->
<bean id="messageSource" class="egovframework.com.cmm.util.EgovWildcardReloadableResourceBundleMessageSource">
<property name="egovBasenames">
<list>
<value>classpath*:egovframework/message/com/**/*</value>
<value>classpath:/egovframework/rte/fdl/idgnr/messages/idgnr</value>
<value>classpath:/egovframework/rte/fdl/property/messages/properties</value>
<value>classpath:/egovframework/egovProps/globals</value>
</list>
</property>
<property name="cacheSeconds">
<value>60</value>
</property>
</bean>