Spring | 스프링 퀵 스타트 - IOC 컨테이너 2/n

파과·2022년 8월 13일

IOC 컨테이너는 각 컨테이너에서 관리할 객체들을 위한 별도의 설정 파일이 존재한다.
Servlet 컨테이너는 web.xml 파일에 EJB 컨테이너는 ejb.xml 파일에 해당 컨테이너가 생성하고 관리할 클래스들을 등록한다.

스프링 설정 파일 생성

위치 : src/main/resources
유형 : Spring Bean Configuration File 선택
이름 : applicationContext 입력

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

  • 클래스 하나당 하나의 <bean> 엘리먼트 설정이 필요하다. <beans></beans> 사이에 작성해 클래스를 '등록'한다.
<bean id="tv" class="polymorphism.SamsungTV"/>
  • class 속성값에는 패키지 경로가 포함된 전체 클래스 경로를 지정한다. ctrl+space로 자동완성하자.

스프링 컨테이너 구동하기

  • 해당 클래스에서 스프링 컨테이너를 구동하려면 다음과 같이 코드를 작성한다.
public class TVUser{
	public static void main(String[] args){
    	// 1. Spring 컨테이너를 구동한다.
        AbstractApplicationContext factory = 
        	new GenericXmlApplicationContext("applicationContext.xml");
    }
}

위 소스는 환경설정 파일인 applicationContext.xml을 로딩하여 스프링 컨테이너 중 하나인 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();
    }
}
  • 이름이 tv인 객체를 getBean()으로 요청
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.powerOff();
		
		// 3. Spring 컨테이너 종료
		factory.close();
	}
}

참고 : log4j.xml에서 info나 debug레벨로 바꿔도 콘솔에 로그가 출력되지 않을 때.

→ 프로젝트 삭제하고 재생성하는 게 빠르다..

참고 : 파일명

파일명을 파일시스템에서 바꾸게 되면 파일이 없어진다. 프로젝트 우클릭 > Refresh를 통해 다시 불러오도록 한다.
파일명은 파일 우클릭 > Refactor > Rename 혹은 Alt + Shift + R로 변경한다.



스프링 컨테이너를 통해 IOC를 구현하는 위의 과정을 다시 정리해보자.

  1. applicationContext.xml (스프링 설정 파일)에 삼성티비 클래스를 id가 tv인 빈으로 추가한다.
  2. TVUser 클라이언트가 스프링 설정 파일을 로딩하여 스프링 컨테이너(ApplicationContext)를 구동한다.
  3. 스프링 설정 파일에 빈으로 등록된 삼성티비 객체를 생성한다.
  4. getBean() 메소드로 이름(id)이 tv인 객체를 요청(Lookup)한다.
  5. 삼성티비 객체를 반환한다.

여기서 중요한 것은 티비의 브랜드를 바꿀 때, 설정파일인 applicationContext.xml파일만 수정하면 된다는 것이다. 즉 클라이언트 소스를 수정할 필요가 없다 - 기존 BeanFactory 클래스 사용할 때보다 유지보수가 편리해졌다.

스프링 컨테이너

스프링에서는 BeanFactory와 ApplicationContext의 두 가지 컨테이너를 제공하는데, 보통 ApplicationContext를 쓰게 된다. 이를 구현하는 클래스 중 xml 설정 파일을 구동하는 GenericXmlApplicationContext와, 웹기반 스프링 애플리케이션을 개발할 때 사용하는 XmlWebApplicationContext를 가장 많이 사용한다. 우리는 일단 GenericXmlApplicationContext만 기억하고 있으면 되겠다.

<beans> 루트 엘리먼트

자식 엘리먼트 중 <bean><import>가 많이 사용된다.

<bean>

스프링 설정 파일에 클래스를 등록하기 위해 사용한다.
id속성은 생략할 수 있지만 class속성은 필수다. 패키지 경로와 클래스 이름을 정확하게 등록해야 하므로 자동완성 기능을 꼭 이용하자.
bean에 클래스 속성만 등록해도 객체가 생성된다. 하지만 id속성까지 지정해야 객체를 요청(lookup)할 수 있다. 고유한 값으로 지정해야 하고, Camel Case를 사용한다. 특수기호를 포함할 때는 id대신 name속성을 쓴다.

init-method 속성

객체 생성시 디폴트 생성자를 호출하기 때문에 초기화할 수 없는데, 생성 후 초기화 작업이 필요하면 init-method 속성을 사용한다.

init-method="initMethod"

예를 들면 삼성티비 클래스에서 initMethod() 메소드를 만들어 멤버변수에 대한 초기화 작업을 실행하도록 작성한다.

destroy-method 속성

스프링 컨테이너가 객체 삭제 직전에 호출될 임의의 메소드를 지정한다.

lazy-init 속성

ApplicationContext는 구동 시점에 빈 생성 즉시 로딩하는 방식으로 동작한다.
자주 사용되지도 않으면서 메모리를 차지하는 빈을 해결하기 위해 컨테이너 구동 시점이 아니라 해당 빈 사용 시점에 객체를 생성하도록 한다.

lazy-init="true"

scope 속성

하나만 생성해도 되는 객체는 '싱글톤 패턴'을 구현해 제어한다. scope속성의 기본값은 singleton이다. 해당 빈이 스프링 컨테이너에 의해 단 하나만 생성되도록 한다. 여러 번 요청되어도 메모리에 하나만 생성되어 유지된다.
prototype으로 지정할 경우 매번 새로운 객체를 생성한다.

0개의 댓글