본문 바로가기

TroubleShooting/Spring

WEB-INF 디렉토리에 있는 *Context.xml 가져오기

728x90

 스프링이 생성하는 빈이 아닌 자바 클래스에서 스프링이 관리하는 빈들을 이용해서 객체를 생성해야 하는 일이 있었다. 그런데, context 파일들이 클래스 패스와 다른 곳에 있어서 문제가 생겼다.

 보통은 클래스 패스에다가 context 파일들을 넣어서 관리하지만, 따로 context 파일들을 WEB-INF/spring/*.xml 으로 분리를 한 상태이다.



1. WebApplicationContext 를 이용하는 방법 : "servletContext" 가 먼저 있어야 한다는 에러 메시지가 출력된다. 물론 서블릿이 아닌 일반 자바 클래스라서 이 방법은 사용이 불가능.

2. FileSystemXmlApplicaionContext 를 이용하는 방법 : 컨텍스트 파일들의 위치를 절대 경로로 잡아야하기 때문에 이것도 불가능.

3. ClassPathXmlApplicaionContext 를 이용하는 방법 : ClassPathXmlApplicaion 이 기본적으로 찾는 위치가 classpath(classes/) 부터 찾는다. 그런데, WEB-INF 디렉토리에서 보면 classes/ 와 spring/ 은 같은 WEB-INF 에 존재한다. 이것을 이용해서 상대경로로 지정해서 사용할 수 있다.


MyAppLogLogic myAppLogLogic = null;
...
public void create() {
ApplicationContext context = new ClassPathXmlApplicationContext("../spring/*-context.xml");
MyAppLogLogic myAppLogLogic = (MyAppLogLogic)context.getBean("MyAppLogLogic");
...
myAppLogLogic.logWrite(1, "This is test");
...
}

참고 사이트 :

http://stackoverflow.com/questions/14262263/relative-path-to-config-in-web-inf-java-spring



추가로 내용을 덧붙이면, application context 를 refresh 하면 모든 스프링 빈들이 새로 생성되기 때문에 콘솔창에 많은 로그들이 보일것이다. 생각해보면 객체의 생성주기를 관리하는 스프링이 한번 실행될텐데 다시 load 를 하기 때문에 비효율적인 구조가 된다. 그래서 방법은 스프링 빈을 이용하는 클래스는 모두다 스프링 빈 형태로 만들어야 한다.