Back Ground

Spring 컨테이너 및 설정 파일 본문

Spring

Spring 컨테이너 및 설정 파일

Back 2016. 7. 19. 15:51

IoC 컨테이너는 각 컨테이너에서 관리 할 객체들을 위한 별도의 설정 파일이 있다.

Servlet 컨테이너는 web.xml 파일에

EJB      컨테이너는 ejb-jar.xml 파일에


해당 컨테이너가 생성하고 관리할 클래스들을 등록한다



web.xml 파일이란?
1. 톰캣의 실행환경에 대한 정보를 담당하는 '환경설정' 파일 이다.

2. 각종 servlet의 설정과 servlet 매핑, 필터, 인코딩 등을 담당한다.

3. web.xml은 톰캣에 있는 모든 web application의 기본설정을 정의한다.
4. web.xml은 각 application이 deploy될 때 각 application의 'WEB-INF/web.xml' deployment descripter에 따라서 처리가 된다.

5. 각 application 마다 설정시, web.xml은 파일을 복사해서 필요한 것만 적으면 된다.


참고 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=090sk&articleno=5494232





ejb-jar.xml파일이란?

EJB 2.0 파일을 위한 배치 지시자(Deployment Descriptor)


참고 : http://blog.naver.com/ksi7508/9453913






IoC 시작하기

전에 만들어 놓은 BoardWeb 프로젝트(SamsungTV, LgTV 활용했던 프로젝트) 에

src/main/resources 소스폴더를 선택하고 마우스 오른쪽 버튼을 클릭한후

New -> Other 메뉴를 클릭





Srping 폴더에 있는 Spring Bean Configuration file 선택 하고 Next 한다



File name에 applicationContext를 입력하고 <Finish>를 클릭하면 스프링 설정 파일이 생성된다.

이때, 기본으로 <beans> 루트 엘리먼트와 네임스페이스 관련 설정들이 추가되어 제공된다.







applicationContext.xml
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
 
</beans>
 


앞에서 작성한 TV예제를 스프링 기반으로 테스트하기 위해서 SamsungTV클래스를 스프링 설정 파일에 등록한다.

이때 <bean>엘리머트를 사용하는데 클래스 하나당 하나의 <bean> 설정이 필요하다.









applicationContext.xml - SamsungTV<bean> 객체생성

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id="tv" class="polymorphism.SamsungTV"/>
 
</beans>
 


<bean> 엘리먼트에서 가장 중요한 것은 class 속성값이다.

여기서 패키지 경로가 포함되는 전체클래스경로를 지정해야 한다.


(이클립스에서 Ctrl키를 누르고 마우스를 Class경로에 올리면 연결 잘 되어있을시

 경로탐색이 가능한 것으로 연결을 확인해볼 수 있다. )













스프링 컨테이너 구동 및 테스트


스프링 설정 파일을 작성했으면 이제 TV 객체를 테스트하는 클라이언트를 만들어보자.







TVUser.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package polymorphism;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class TVUser {
 
    public static void main(String[] args) {
        //1.Spring 컨테이너를 구동한다.
        AbstractApplicationContext factory = 
                new GenericXmlApplicationContext("applicationContext.xml");
        
    }
}


위 소스는 환경설정 파일인 applicationContext.xml 을 로딩하여

스프링 컨테이너 중 하나인 GenericXmlApplicationContext를 구동했다.


이때 콘소레는 다음과 같은 메세지가 출력된다.





<결과>

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader -

Loading XML bean definitions from class path resource [applicationContext.xml]


INFO : org.springframework.context.support.GenericXmlApplicationContext -

Refreshing org.springframework.context.support.GenericXmlApplicationContext@28ba21f3:

startup date [Tue Jul 19 16:48:59 KST 2016]; root of context hierarchy
INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@34b7bfc0: defining beans [tv]; root of factory hierarchy


클래스 경로에있는 applicationContext.xml 파일을 로딩한다는 메시지가 가장 먼저 출력된다.

 GenericXmlApplicationContext 객체가 생성되어 스프링 컨테이너가 구동됐다.

는 메세지가 출력된다.



이제 구동된 컨에티너로부터 SamsungTV 객체를 얻어내 보자. 먼저 SamsungTV 객체가 언제 생성되는지 확인하기 위해서

기본 생성자를 추가한다.





SamsungTV.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package polymorphism;
 
public class SamsungTV implements TV{
    public SamsungTV(){
        System.out.println("===> SamsungTV)객체 생성");
    }
    
    //인터페이스 받은것은 모두 사용하지 않으면 안된다.
    public void powerOn(){
        System.out.println("SamsungTV---전원켠다.");
    }
    public void powerOff(){
        System.out.println("SamsungTV---전원끈다.");
    }
    public void volumeUp(){
        System.out.println("SamsungTV---소리 올리다.");
    }
    public void volumeDown(){
        System.out.println("SamsungTV---소리 내린다.");
    }
}
 



이제 스프링 컨테이너를 구동하고 이름이 tv인 객체를 getBaen() 메소드를 이용하여 요청하도록 TVUser를 수정한다.








TVUser.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package polymorphism;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class TVUser {
 
    public static void main(String[] args) {
        //1.Spring 컨테이너를 구동한다.
        AbstractApplicationContext factory = 
                new GenericXmlApplicationContext("applicationContext.xml");
        
        //2.Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
        TV tv = (TV)factory.getBean("tv");
        tv.powerOn();
        tv.volumeUp();
        tv.volumeDown();
        tv.powerOff();
        
        //3.Spring 컨테이너를 종료한다.
        factory.close();
    }
}
 



작성된 프로그램을 실행하면 다음과 같은 메시지가 출력된다.


<실행 결과>





지금까지의 과정을 그림으로 표현하면 다음과 같다.

-스프링 컨테이너 동작 순서-



① TVUser 클라이언트가 스프링 설정 파일을 로딩하여 컨테이너 구동

② 스프링 설정 파일에 <bean> 등록된 SamsungTV객체 생성

③ getBean() 메소드로 이름이 'tv'인 객체를 요청(Lookup)

④SamsungTV 객체 반환


중요한 것은 실행되는 TV를 LgTV로 변경할 때, applicationContext.xml 파일만수정하면 된다는 점이다.

즉, TVUser클라이언트 소수를 수정하지 않고도 동작하는 TV를 변경할 수 있으며,

기존 BeanFactory 클래스를 사용했던 것보다 유지보수가 좀 더 편해졌다 할 수 있다.

'Spring' 카테고리의 다른 글

Spring EcoLibrary - Mybatis 순서  (0) 2016.10.12
Spring Framework: annotation 정리 #1  (0) 2016.09.22
IoC 컨테이너  (0) 2016.07.15
결합도/다형성/디자인 패턴  (2) 2016.07.14
IoC/AOP/컨테이너  (0) 2016.07.14
Comments