먼저 저번 프로젝트 파일의
BoardWeb의 src/main/resources를 마우스 우클릭 후 new -> other를 클릭한 후 spring Bean Configuration File을 선택한다.
그 후 next 클릭 후 File name은 applicationContext 입력하고 Finish를 클릭하면 스프링 설정 파일이 생성된다.
<beans>의 루트 엘리먼트와 네임스페이스 관련 설정들이 추가되어 제공된다.
TV 예제를 스프링 기반 테스트
**<bean> 엘리먼트에서 가장 중요한 것은 class 속성값이다.
class에는 패키지 경로가 포함된 전체 클래스 경로를 지정해야 한다.
스프링 컨테이너 구동 및 테스트
TV 객체를 테스트하는 클라이언트를 만들기.
TVUser.java 파일을 다음과 같이 수정하고 실행해본다.
먼저 applicationContext.xml파일을 로딩한다는 메시지가 출력되고, GenericXmlApplicationContext 객체가 생성되어 스프링 컨테이너가 구동됐다는 메시지가 출력된다.
구동된 컨테이너로부터 SamsungTV 객체를 얻어내기
먼저 SamsumTV 객체가 언제 생성되는지 확인하기 위해 SamsungTV.java에 기본 생성자 추가
그리고 getBean() 메소드를 이용해 요청하도록 TVUser를 수정한다.
TVUser를 실행시키기.
동작 순서
- TVUser 클라이언트가 스프링 설정 파일을 로딩해 컨테이너 구동
- 스프링 설정 파일에 <bean> 등록된 SamsungTV 객체 생성
- getBean() 메소드로 이름이 'tv'인 객체를 요청(Lookup)
- SamsungTV 객체 반환
스프링 컨테이너의 종류
BeanFactory
- BeanFactory는 스프링 설정 파일에 등록된 <bean> 객체를 생성하고 관리하는 가장 기본적인 컨테이너만 제공한다.
- BeanFactory는 클라이언트의 요청에 의해서만 <bean> 객체가 생성되는 지연 로딩(Lazy Loading) 방식을 사용한다. 따라서 일반적인 스프링 프로젝트에서 BeanFactory를 사용할 일은 없다.
ApplicationContext
- 트랜잭션 관리나 메시지 기반의 다국어 처리 등 다양한 기능 지원
- 컨테이너가 구동되는 시점에 <bean> 등록된 클래스들을 객체 생성하는 즉시 로딩(pre-loading) 방식으로 동작한다.
- 웹 애플리케이션 개발도 지원하므로 대부분 스프링 프로젝트는 ApplicationContext 유형의 컨테이너를 이용한다.
스프링 XML 설정
<beans> 루트 엘리먼트
- 스프링 컨테이너는 <bean> 저장소에 해당하는 XML 설정 파일을 참조해 <bean>의 생명주기를 관리하고 여러 가지 서비스를 제공한다.
- 따라서 스프링 프로젝트 전체에서 가장 중요한 역할을 담당하며, 이 설정 파일을 정확하게 작성하고 관리하는 것이 매우 중요하다.
- STS를 이용해 만든 스프링 설정 파일에는 beans 네임스페이스가 기본 네임스페이스로 선언되어 있으며, spring-beans.xsd 스키마 문서가 schemalLocation 형식으로 등록되어 있다.
- <bean>, <description>, <alias>, <import>등 네 개의 엘리먼트를 자식 엘리먼트로 사용할 수 있다.
- 이 중에서 <bean>과 <import> 정도가 실제 프로젝트에 사용된다.
<import> 엘리먼트
- 분리해 작성한 설정 파일들을 하나로 통합할 때 <import> 엘리먼트를 사용한다.
- <import> 태그를 이용해 여러 스프링 설정 파일을 포함함으로 한 파일에 작성하는 것과 같은 효과를 낼 수 있다.
<bean> 엘리먼트
- 스프링 설정 파일에 클래스를 등록하려면 <bean> 엘리먼트를 사용한다.
- id와 class 속성을 사용하는데, id 속성은 생략할 수 있지만, class 속성은 필수다.
- class 속성에 클래스를 등록하려면 정확한 패키지 경로와 클래스 이름을 지정해야 한다.
- id 속성값에 해당하는 문자열은 자바의 식별자 작성 규칙을 따르며, 일반적으로 '낙타 표기법'을 사용한다.
<bean> 엘리먼트 속성
init-method 속성
- 생성자로 Servlet 객체의 멤버변수를 초기화 할 수 없다. 그래서 서블릿은 init() 메소드를 재정의(Overriding)하여 멤버변수를 초기화한다.
- 스프링 컨테이너 역시 객체를 생성한 후에 멤버변수 초기화 작업이 필요하다면, Servlet의 init()같은 메소드가 필요하다.
<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod"/>
SamsungTV.java에 멤버변수에 대한 초기화 작업 처리
destroy-method 속성
- <bean> 엘리먼트에서 destroy-method 속성을 이용해 스프링 컨테이너가 객체를 삭제하기 직전에 호출될 임의의 메소드를 지정할 수 있다.
<bean id = "tv" class ="polymorphism.SamsungTV.java" destroy-method="destroyMethod"/>
SamsungTV.java에 추가
initMethod() 메소드는 컨테이너가 구동되어 SamsungTV 객체가 생성된 직후에 호출된다.
destroyMethod()메소드는 객체가 삭제되기 직전에 호출된다.
scope 속성
- 스프링 컨테이너는 컨테이너가 생성한 bean을 어느 범위에서 사용할 수 있는지 지정할 수 있는데 이게 scope 속성
- scope 속성값의 기본은 싱글톤이다. 해당 bean이 스프링 컨테이너에 의해 단 하나만 생성되어 운용되도록 한다.
<bean id="tv" class="polymorphism.SamsungTV" scope="singleton"/>
세 번을 요청해도 메모리에 하나만 생성되어 유지된다.
<bean id="tv" class="polymorphism.SamsungTV" scope="prototype"/>
prototype의 경우 스프링 컨테이너는 해당 <bean>이 요청될 때마다 새로운 객체를 생성해 반환한다.
최근댓글