본문 바로가기

프로그래밍/Spring

작성된 Java Config 클래스 파일들을 실제 등록해보자(RootContext 클래스 제작)

지금까지의 연재글에서는 전자정부 프레임워크에서 제공하는 Sample Project의 Root Context를 구성하는 환경설정 파일들을 Java Config 클래스 파일들로 변환한 작업을 진행했다. 이해하기 쉽게 하기 위해 XML과 Java 클래스 파일을 1:1 관계로 매핑해서 만들었으나 구성에 대한 융통성을 부리면 클래스 파일 갯수를 줄이면서 알아보기 쉬운 구성으로 만들수도 있다. 근데 이렇게 Java Config 클래스 파일들을 만들었는데, 프로젝트가 WAS에 로딩될 때 이렇게 만든 클래스들이 어떤 방법으로 로딩되어야 하는가에 대한 설명이 지금까지 없었다. 그래서 이번엔 이 부분에 대해 잠깐 설명하도록 하겠다.

 

지금까지 우리가 만든 Java Config 클래스는 총 9개이다(ContextAspect.class, ContextCommon.class, ContextDataSource.class, ContextIdgen.class, ContextMapper.class, ContextProperties.class, ContextSqlMap.class, ContextTransaction.class, ContextValidator.class) 이렇게 만든 클래스를 프로젝트가 WAS에 로딩될 때 환경설정 클래스라는 의미로 로딩이 되어야 이 클래스를 통해 만들어진 bean들이 등록될 것이다. 그럼 이 부분을 어떻게 해야 하는가?

 

ContextTransaction 클래스를 만들 당시에 XML을 이용한 트랜잭션 설명을 하면서 @ImportResource 어노테이션에 대해 설명을 한 적이있다. 이 어노테이션이 하는 기능을 그 당시에도 말했지만 환기시키는 차원에서 다시 언급하자면 Java Config 설정 파일에서 XML 환경설정 파일을 로딩할때 사용한다. 트랜잭션 설명할 당시엔 Source를 손 댈 수 없는 클래스여서 @Transactional 어노테이션을 Source에 붙일 수 없을 때 XML 환경설정을 이용해서 트랜잭션 설정 파일을 만든뒤 이를 @ImportResource 어노테이션을 이용해서 설정해주는 방법으로 사용한다. 그때 설명당시에 누락했지만 이 기능은 Spring XML 설정 파일에서 사용되는 <import> 태그와 하는 역할이 비슷하다. 마찬가지로 이와 같은 역할을 하는 XML 설정 파일이 아닌 자바 클래스를 환경파일로 등록하는 어노테이션이 있는데 그것이 @Import 어노테이션이다. @Import 어노테이션에 @Configuration 어노테이션이 붙은 클래스를 설정하여 @Import 어노테이션을 사용한 @Configuration 어노테이션이 붙은 클래스가 로딩될때 @Import 어노테이션에 지정된 자바 클래스들도 같이 Spring 환경 설정 클래스로 사용하는 것이다. 이러한 역할을 하는 것이 RootContext 클래스이다. 이러한 설명을 듣고 이 RootContext 클래스의 전체 소스를 보면 무슨 의미인지 이해하리라 생각한다.

 

package egovframework.example.config.root;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({ContextAspect.class, ContextCommon.class, ContextDataSource.class
	, ContextIdgen.class, ContextMapper.class, ContextSqlMap.class, ContextProperties.class
	, ContextTransaction.class, ContextValidator.class
})
public class RootContext {

}

 

RootContext 클래스가 하는 역할은 정말 단순하다. 우리가 생성해야 할 bean을 만들고 이를 설정하는 부분은 이미 앞에서 언급했던 9개의 클래스에서 다 작업을 했다. 그때문에 이 클래스는 이 9개 클래스를 환경설정 클래스로 사용하겠다는 의미의 @Import 어노테이션만 사용했다. 아까 위에서 잠시 언급했지만 융통성을 부리면 자바 클래스 갯수를 줄일 수 있다고 했다. 사실 @Import 어노테이션을 사용해야 하는 이유로 자바 클래스를 별도로 하나 더 만드는 것은 비효율일수 있다. 즉 우리가 만든 9개의 클래스 중에 하나에 @Import 어노테이션을 설정해주면 되기 때문이다. 그리고 우리가 만든 9개의 클래스 중 그러한 역할에 가장 적합한 클래스가 ContextCommon 클래스이다. 생각해보면 ContextCommon 클래스는 주로 Spring 환경 설정의 기초적인 사항이나 공통적으로 사용되는 bean 클래스 등록을 하는데 사용되고 있기 때문에 @Import 어노테이션을 사용하기에 가장 적합한 클래스이다. 그러나 여기서는 그런 설정을 하지 않았다. context-common.xml 파일에서는 이러한 설정내용이 없기 때문에 비교하는 과정에서 혼선이 있을것 같아 빼버렸다.

 

이렇게 RootContext 클래스를 통해서 우리가 만든 9개의 환경설정 관련 클래스를 사용하게끔 만들었다. 그러면 이 RootContext 클래스를 WAS에 프로젝트가 로딩될때 이 클래스를 사용하게끔 해서 Spring 환경설정이 이루어지도록 해야 할 것이다. 이러한 작업을 web.xml에서 하게 된다. 예전에 우리가 XML로 환경설정을 할 때 web.xml에 Root Context를 로딩하는 부분은 다음과 같이 되어 있었다.

 

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath*:egovframework/spring/context-*.xml</param-value>
</context-param>

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 

listener 클래스로 ContextLoaderListener 클래스를 사용하고 여기에 contextConfigLocation 파라미터에 classpath로 접근될수 있는 egovframework/spring 패키지의 context-으로 시작하는 xml 파일로 설정하도록 해서 이 파일들이 Root Context 환경설정에 이용될 수 있게끔 했다. 이 부분이 Java Config 방식을 사용하는 방법에서는 다음과 같이 바뀌게 된다.

 

<context-param>
	<param-name>contextClass</param-name>
	<param-value>
		org.springframework.web.context.support.AnnotationConfigWebApplicationContext
	</param-value>
</context-param>

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>egovframework.example.config.root.RootContext</param-value>
</context-param>

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 

ContextLoaderListener 클래스를 listener 클래스로 사용하는 것임에는 변함이 없지만 여기에 contextClass라는 파라미터를 추가로 설정하고 여기에 AnnotationConfigWebApplicationContext 클래스를 지정한다. 그리고 contextConfigLocation 파라미터에 위에서 만들었던 RootContext 클래스를 지정한다. 즉 RootContext 클래스를 ApplicationConfigWebApplicationContext 사용함으로써 RootContext 클래스 안에 설정해놓은 9개의 클래스를 읽어들여 Spring Root Context를 구성하는 것이다. 개인적으로 이 부분에서 약간 이해하는데 헷갈린 부분이 있었는데 Root Context 구성하는데 사용하는 Context 클래스와 Servlet Context를 구성하는 Context 클래스 구성이 다를 것이라고 생각했다. 그래서 ApplicationConfigWebApplicationContext 클래스가 아닌 다른 클래스를 찾아보았으나 결국은 이 ApplicationConfigWebApplicationContext 클래스로 귀결이 되었다. 그래서 Web이란 단어가 붙어서 Web Application 전용으로 사용되는 Context 클래스가 아니라 그냥 Context를 구성하는 클래스라고 이해하기로 했다. 그러니 ApplicationConfigWebApplicationContext 클래스 사용할 때 어? 이거 Web 전용 아닌가 하면서 다른 클래스를 찾는 그런 작업에 힘빼지 말았음 한다.

 

이번 글까지 해서 Root Context를 구성하는 환경설정 XML 파일들을 Java Config 방식으로 바꾸고 이를 web.xml에 설정해서 로딩하는 내용까지 모두 설명했다. 다음 글에서는 Servlet Context를 구성하는 환경설정 파일들을 Java Config 방식으로 바꾸는 내용에 대해 설명하겠다.

 

 

목     차

 1. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(환경구축)

 2. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(기초)

 3. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(context-aspect.xml 변환)

 4. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(context-common.xml 변환)

 5. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(context-datasource.xml 변환)

 6. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(context-sqlMap.xml, context-mapper.xml 변환)

 7. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(context-transaction.xml 변환)

 8. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(context-idgen.xml, context-properties.xml, context-validator.xml 변환)

 9. 작성된 Java Config 클래스 파일들을 실제 등록해보자(RootContext 클래스 제작)

 10. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(dispatcher-servlet.xml 변환) - 1

 11. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(dispatcher-servlet.xml 변환) - 2

 12. 전자정부 프레임워크를 Java Config 방식으로 설정해보자(dispatcher-servlet.xml 변환) - 3