Spring XML 설정 - <bean> 의 여러 속성들

DEV NAHYUN·2021년 10월 5일
0

Spring

목록 보기
3/8

< bean >

스프링 설정 파일에서의 루트 엘리먼트는 < bean >.
우리가 만든 모든 클래스를 bean 으로 등록하고 관리 할 수 있다.

  • < bean > 은 클라이언트가 요청할 때 부르기 위한 이름인 id와, 실제 클래스의 패키지 정보가 담긴 class로 구성되는데..
    id는 컨테이너가 객체를 식별할 수 있도록 유일해야 한다.
    id가 없이 class 만으로 요청이 가능하긴 하다.
    id 대신 name을 쓸 수도 있다.
    name은 id와 다르게 자바 식별자 작성 규칙을 따르지 않는 문자열도 허용한다.

1. init-method, destroy-method

  • Servlet 컨테이너는 web.xml 파일에 등록된 Servlet 클래스의 객체를 생성할 때 디폴트 생성자만 인식한다. 그래서 생성자로 Servlet 객체의 멤버변수를 초기화할 수 없다. 그래서 서블릿은 init() 메소드를 오버라이딩 해 멤버 변수를 초기화 한다.
  • 스프링 컨테이너 역시 마찬가지다. init() 메소드 역할을 하는 것이 < bean > 엘리먼트의 init-method 속성이다.
  • ApplicationContext.xml
<?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 id="tv" class="polymorphism.SamsungTV" init-method="initMethod" destroy-method="destroyMethod"/>
	<!-- 클래스 하나 당 하나의 <bean> 설정이 필요하다. 
	중요한 것은 class 속성값. 여기에 패키지 경로가 포함된 전체 클래스 경로를 지정해야 한다. -->	
</beans>
  • TVUser.java
package polymorphism;


// init-method 속성이 찾아서 부를 애들
public class SamsungTV implements TV {

	public void initMethod() {
    	System.out.println("객체 초기화 작업 처리...");
    }
    
    public void destroyMethod() {
    	System.out.println("객체 삭제 전에 처리할 로직 처리...");
    }
  
    // 구동된 컨테이너로부터 SamsungTV 객체를 얻어내 보자.
    // SamsungTV 객체가 언제 생성되는지 확인하기 위해서 기본 생성자를 추가
	public SamsungTV() {
		System.out.println("===> SamsungTV 객체 생성");
	}

	// 다형성을 활용한 코드(인터페이스 메소드 재정의 필요)

	public void powerOn() {
		System.out.println("SamsungTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("SamsungTV---전원 끈다.");
	}

	public void volumeUp() {
		System.out.println("SamsungTV---소리 올린다.");
	}

	public void volumeDown() {
		System.out.println("SamsungTV---소리 내린다.");

	}
}
  • 처리 결과
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 14:09:32 KST 2021]; root of context hierarchy
===> SamsungTV 객체 생성
객체 초화 작업 처리..
SamsungTV---전원 켠다.
SamsungTV---전원 끈다.
SamsungTV---소리 올린다.
SamsungTV---소리 내린다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 14:09:32 KST 2021]; root of context hierarchy
객체 삭제 전에 처리할 로직 처리..

lazy-init

  • ApplictionContext는 컨테이너가 구동되는 시점에 < bean > 을 즉시 생성한다. 그런데 어떤 < bean > 은 잘 사용되지 않으면서 메모리를 많이 차지한다.
  • 그래서 구동 시점이 아니라 해당 < bean > 이 사용되는 시점에 객체를 생성하도록 init-lazy 속성을 제공한다.
	<bean id="tv" class="polymorphism.SamsungTV" init-lazy="true"/>

scope

  • 자세한 것은 여기서
    싱글톤 패턴이란

  • 여러 개 생성할 필요 없는 객체들이 있다. 예를 들어 SamsungTV 클래스는 객체들의 가격이 다 다른 것도 아니므로 하나만 생성되어도 된다.

  • 하나의 객체만 생성하도록 제어하는 것이 싱클톤 패턴인데, 일일이 클래스에 패턴 관련 코드를 쓰는 것은 어렵다.

  • 스프링은 이것을 scope 속성을 통해 해결한다.

  • 컨테이너가 생성한 bean을 어느 범위에서 사용할 수 있는 지를 지정할 때 사용하는 것이 scope 속성이다.

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

< import >

스프링 기반의 애플리케이션은 단순한 bean 등록 외에도 트랜잭션 관리 등의 복잡하고 다양한 설정이 필요하다. 이 모든 설정을 하나의 파일로 처리하면 복잡하고 코드가 길어지므로 기능별 여러 XML 파일로 나눠 설정하는 것이 효율적. 이들을 하나로 통합할 때 < import > 엘리먼트를 사용한다.

<beans>
	<import resource="context-datasource.xml"/>
  	<import resourse="context-transaction.xml"/>
</beans>
profile
나만 알아보면 된다는 마음으로 작더라도 조금씩

0개의 댓글

관련 채용 정보