728x90
반응형

먼저 저번 프로젝트 파일의

BoardWeb의 src/main/resources를 마우스 우클릭 후 new -> other를 클릭한 후 spring Bean Configuration File을 선택한다.

 

[그림1] Spring Bean Configuration File 만들기

 

그 후 next 클릭 후 File name은 applicationContext 입력하고 Finish를 클릭하면 스프링 설정 파일이 생성된다.

[그림2] 스프링 설정 파일 생성

 

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

[그림3]beans 루트 엘리먼트와 네임스페이스

TV 예제를 스프링 기반 테스트 

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

class에는 패키지 경로가 포함된 전체 클래스 경로를 지정해야 한다.

[그림4] bean 클래스 추가

 

 

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

 

TV 객체를 테스트하는 클라이언트를 만들기.

 

TVUser.java 파일을 다음과 같이 수정하고 실행해본다.

먼저 applicationContext.xml파일을 로딩한다는 메시지가 출력되고, GenericXmlApplicationContext 객체가 생성되어 스프링 컨테이너가 구동됐다는 메시지가 출력된다.

[그림5] TVUser.java 파일 수정

 

 

구동된 컨테이너로부터 SamsungTV 객체를 얻어내기

 

먼저 SamsumTV 객체가 언제 생성되는지 확인하기 위해 SamsungTV.java에 기본 생성자 추가

[그림6] SamsungTV 기본 생성자 추가하기

 

그리고 getBean() 메소드를 이용해 요청하도록 TVUser를 수정한다.

 

[그림7] TVuser.java 수정

 

TVUser를 실행시키기.

[그림8] TVUser 실행 화면

 

동작 순서

  1. TVUser 클라이언트가 스프링 설정 파일을 로딩해 컨테이너 구동
  2. 스프링 설정 파일에 <bean> 등록된 SamsungTV 객체 생성
  3. getBean() 메소드로 이름이 'tv'인 객체를 요청(Lookup)
  4. SamsungTV 객체 반환

 

 

스프링 컨테이너의 종류

 

BeanFactory

 

  • BeanFactory는 스프링 설정 파일에 등록된 <bean> 객체를 생성하고 관리하는 가장 기본적인 컨테이너만 제공한다.
  • BeanFactory는 클라이언트의 요청에 의해서만 <bean> 객체가 생성되는 지연 로딩(Lazy Loading) 방식을 사용한다. 따라서 일반적인 스프링 프로젝트에서 BeanFactory를 사용할 일은 없다.

ApplicationContext

  • 트랜잭션 관리나 메시지 기반의 다국어 처리 등 다양한 기능 지원
  • 컨테이너가 구동되는 시점에 <bean> 등록된 클래스들을 객체 생성하는 즉시 로딩(pre-loading) 방식으로 동작한다.
  • 웹 애플리케이션 개발도 지원하므로 대부분 스프링 프로젝트는 ApplicationContext 유형의 컨테이너를 이용한다.

 

 

[그림9] GenericXml, XmlWebApplication

 

 

 

스프링 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에 멤버변수에 대한 초기화 작업 처리

 

[그림10] 멤머변수에 대한 초기화 진행

 

 

destroy-method 속성

  • <bean> 엘리먼트에서 destroy-method 속성을 이용해 스프링 컨테이너가 객체를 삭제하기 직전에 호출될 임의의 메소드를 지정할 수 있다.
<bean id = "tv" class ="polymorphism.SamsungTV.java" destroy-method="destroyMethod"/>

 

SamsungTV.java에 추가

[그림11] SamsungTV.java에 추가
[그림12] 실행 결과

 

initMethod() 메소드는 컨테이너가 구동되어 SamsungTV 객체가 생성된 직후에 호출된다.

destroyMethod()메소드는 객체가 삭제되기 직전에 호출된다.

 

 

scope 속성

  • 스프링 컨테이너는 컨테이너가 생성한 bean을 어느 범위에서 사용할 수 있는지 지정할 수 있는데 이게 scope 속성
  • scope 속성값의 기본은 싱글톤이다. 해당 bean이 스프링 컨테이너에 의해 단 하나만 생성되어 운용되도록 한다.
<bean id="tv" class="polymorphism.SamsungTV" scope="singleton"/>

[그림13] singleton 결과

세 번을 요청해도 메모리에 하나만 생성되어 유지된다.

 

 

<bean id="tv" class="polymorphism.SamsungTV" scope="prototype"/>

[그림14] prototype 결과

 

 prototype의 경우 스프링 컨테이너는 해당 <bean>이 요청될 때마다 새로운 객체를 생성해 반환한다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기