코딩항해기

[Spring] Spring 컨테이너 Bean 기초 설정 (xml 방식) 본문

Spring

[Spring] Spring 컨테이너 Bean 기초 설정 (xml 방식)

miniBcake 2024. 10. 1. 15:15

 

빈 Bean

빈은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다. 즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며 하나 이상의 빈을 관리한다. 이처럼 요청에 따라 해당 객체를 주는 패턴을 팩토리 패턴이라고 하는데, 스프링 컨테이너가 이를 많이 참조하고 있다. 빈은 인스턴스화된 객체이며 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.

new대신 사용하는 느낌이며, JSP의 useBean을 떠올리면 쉽다.

 

빈 등록

Spring 컨테이너마다 하나의 xml, 설정파일(resource 폴더 하위)을 가지고 있으며, 해당 설정파일에 bean 태그를 추가하면 빈을 등록해 관리할 수 있다. 직접 작성하지 않아도 어노테이션을 통해 관리할 수 있다.

빈은 태그로 등록할 수 있고, 기본적으로 class와 id속성을 가진다.

 

루트 앨리먼트

빈을 등록하기 위해서는 루트 앨리먼트로 beans 태그를 추가해야한다.

<?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>

 

bean

<bean class="해당객체위치" id="설정할이름" 
scope="singleton 또는 prototype" 
	//[singleton이 기본이며 생략가능하다. prototype으로 하면 호출 때마다 생성된다]
lazy-init="true" 
	//[true로 설정하면 사용할 때 객체가 생성된다. 생략하면 컨테이너 생성 때 생성된다.]
init-method="init을 사용할 경우 작성" />

 

예시

<?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 class="test.AppleWatch" id="appleWatch" scope="singleton" />
    <bean class="test.GalaxyWatch" id="galaxyWatch" scope="singleton" lazy-init="true" init-method="initWatch" />
</beans>

 

appleWatch의 경우 test 패키지 아래에 있는 AppleWatch클래스 객체이며, appleWatch로 호출할 수 있다.

scope는 singleton으로 기본이라 생략이 가능하며, 여러 번 호출해도 객체를 처음 단 한 번만 실행한다. lazy-init가 설정되어 있지 않으므로 사용하지 않아도 컨테이너 생성 시 객체를 생성(pre-loading)한다.

 

galaxyWatch의 경우 test패키지 아래에 있는 GalaxyWatch클래스 객체이며 galaxyWatch로 호출할 수 있다. 여러 번 호출해도 객체를 처음 단 한 번만 실행하며, prototype이었다면 호출할 때마다 생성된다. lazy-init가 true이므로 첫 호출 시 객체를 생성하며 생성할 때 생성자 외에도 initWatch() 메서드를 실행해 필드값을 초기화한다.