Spring Framework

Spring Framework - 스프링 컨테이너 및 설정파일

Kimjoy 2023. 8. 17. 22:44

대부분의 IoC 컨테이너는 각 컨테이너에서 관리할 객체들을 위한 별도의 설정파일이 있다. Servlet 컨테이너는 web.xml 파일에 해당 컨테이너가 생성하고 관리할 클래스들을 등록한다. 스프링 프레임워크도 다른 컨테이너와 마찬가지로 자신이 관리할 클래스들이 등록된 XML 설정 파일이 필요하다.

 

1. 스프링 IoC 시작하기

/src/main/resources/applicationContext.xml 파일을 생성한다.

기본으로 <beans> 루트 엘리먼트와 네임 스페이스 관련 설정들이 정의되어야 한다.

<bean> 엘리멘트에서 가장 중요한 것은 class 속성값인데, 여기에 패키지 경로가 포함된 전체 클래스 명으로 지정해야 한다.

 

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

 - 클라이언트가 스프링 설정 파일을 로딩하여 컨테이너를 구동한다.

 - 스프링 설정 파일에 <bean> 등록된 객체를 생성한다.

 - getBean() 메서드로 객체를 요청한다.

 - 객체를 반환한다.

 

3. 스프링 xml 설정

<benas> 루트 엘리먼트

스프링 컨테이너는 <bean> 저장소에 해당하는 XML 설정 파일을 참조하여 <bean>의 생명주기를 관리하고 여러 가지 서비스를 제공한다. 따라서 스프링 프로젝트 전체에서 가장 중요한 역할을 담당하며, 스프링 설정 파일의 이름은 무엇을 사용하든 상관없지만 <beans>를 루트 엘리먼트로 사용해야 한다. <beans> 엘리먼트 시작 태그에 네임스페이스를 비롯한 xml 스키마 관련 저보가 설정된다. beans 네임스페이스가 기본 네임 스페이스로 선언되어 있으며 spring-beans.xsd 스키마 문서가 schemaLocation 등록되어 있다. 따라서 <bean>, <description>, <alias>, <import> 등 네 개의 엘리먼트를 자식엘리먼트로 사용할 수 있다. 이 중 <bean>, <import> 정도가 프로젝트 개발 시 사용된다.

 

<import> 엘리먼트

스프링 설정 파일 하나에 우리가 만든 모든 클래스를 <bean>으로 등록하고 관리할 수도 있지만 스프링 기반의 애플리케이션은 단순한 <bean> 등록 외에도 트랜잭션 관리, 예외처리, 다국어 처리 등 복잡하고 다양한 설정이 필요하다. 이런 모든 설정을 하나의 파일로 모두 처리할 수도 있지만, 그렇게 하면 스프링 설정 파일이 너무 길어지고 관리도 어렵다. 결국 기능별 xml 파일로 나누어 설정하는 것이 더 효율적인데, 이렇게 분리하여 작성한 설정 파일들을 하나로 통합할 때 <import> 엘리먼트를 사용한다.

 

<bean> 엘리먼트

스프링 설정 파일에 등록하려면 <bean> 엘리먼트를 사용한다. 이때 id와 class 속성을 사용하는데, id 속성은 생략할 수 있지만 class 속성은 필수이다. class 속성에 클래스를 등록할 때는 정확한 패키지 경로와 클래스 이름을 지정해야 한다. 

 

<bean> 엘리먼트 속성

💨 init-method 속성

스프링 설정 파일에 등록된 클래스로 객체를 생성할 때 디폴트 생성자를 호출한다. 따라서 객체를 생성한 후에 멤버 변수 초기화 작업이 필요하다면 Servlet의 init()과 같은 메서드가 필요하다. 이를 위해 스프링에서는 <bean> 엘리먼트 init-method 속성을 지원한다.

스프링 컨테이너는 <bean>에 등록된 클래스 객체를 생성한 후에 init-method 속성으로 지정된 init-method() 메서드를 호출한다. 이 메서드로 멤버변수에 대한 초기화 작업을 처리한다.

 

💨 destroy-method 속성

<bean> 엘리먼트에서 destroy-method 속성을 이용하여 스프링 컨테이너가 객체를 삭제하기 직전에 호출될 임의의 메서드를 지정할 수 있다.  init-method속성으로 지정된 메서드는 컨테이너가 구동되어 객체가 생성된 직후에 호출되고, 컨테이너가 종료되기 직전에 컨테이너는 자신이 관리하는 모든 객체를 삭제하는데, 이때 destroy-method 메서드는 객체가 삭제되기 직전에 호출된다.

 

💨 lazy-init 속성

ApplicationContext를 이용하여 컨테이너를 구동하면 컨테이너가 구동되는 시점에 스프링 설정 파일에 등록된 <bean>들을 생성하는 즉시 로딩방식으로 동작한다. 그런데 어떤 <bean>은 자주 사용되지 않으면서 메모리를 많이 차지하여 시스템에 부담을 주는 경우도 있다. 따라서 스프링에서는 컨테이너가 구동되는 시점이 아닌 해당 <bean>이 사용되는 시점에 객체를 생성하도록 lazy-init 속성을 제공한다. 특정 <bean>을 등록할 때 lazy-init = "true"로 설정하면 스프링 컨테이너는 해당 <bean>을 미리 생성하지 않고 클라이언트가 요청하는 시점에 생성해 메모리 관리를 효율적으로 할 수 있도록 돕는다.

 

💨 scope 속성

프로그램을 개발하다 보면 개발자도 모르는 사이에 수많은 객체가 생성된다. 그런데 이중에는 하나만 생성돼도 상관이 없는 객체들이 있다. 이때 사용하는 것이 "싱글톤패턴"이다. 클래스로부터 객체를 생성하는 쪽에서 자동으로 싱글톤 객체로 생성하는 것이 가장 바람직하며, 스프링에서는 이런 기능을 컨테이너가 제공한다. 스프링 컨테이너는 컨테이너가 생성한 <bean>을 어느 범위에서 사용할 수 있는지를 지정할 수 있는데, 이때 scope 속성을 사용한다. scope 속성값은 기본이 싱글톤이고, 이는 해당 <bean>이 스프링 컨테이너에 의해 단 하나만 생성되어 운영되도록 한다.