1. <beans> 태그
Intellij에서 spring의 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">
</beans>
위와 같이 스르링 설정 파일은 <beans> 엘리먼트를 루트 엘리먼트로 사용한다. 이때 beans에는 bean이 사용할 라이브러리들을 정의할 수 있다. <beans>는 <bean>, <description>, <alias>, <import> 등의 자식 태그를 가지며 주로 사용되는 것은 <bean>과 <import>이다.
2. <import> 태그
스프링 기반의 애플리케이션은 bean 객체 등록뿐만 아니라 트랜잭션 관리, 다국어 처리 등 여러 설정이 필요하다. 따라서 이런 설정들을 처리하는 경우 여러 파일로 나눠 설정하는데 이들을 하나로 통합할 때 <import>를 사용한다. 사용법은 아래와 같다.
<beans>
<import resource="datasource.xml"/>
<import resource="transaction.xml"/>
</beans>
3. <bean> 태그
<bean> 태그를 사용하면 스프링 설정 파일에 클래스를 등록할 수 있다. 이때 id와 class 속성을 부여하는데 id는 생략 가능하며, class는 꼭 작성해 줘야한다. id는 컨테이너에서 bean 객체를 요청할 때 사용하므로 다른 객체와 겹치지 않아야 한다. class 속성은 정확한 패키지 경로와 클래스 이름을 가져야 한다.
<bean id="tv" class="Exam1.SamTV"></bean>
단, id의 경우 특수기호를 사용하거나, 고백을 포함하거나, 숫자로 시작하는 경우 에러가 발생한다. 만약 "/"와 같은 특수문자를 사용하고 싶다면 id대신 name 속성을 사용하면 된다.
4. <bean> 태그 속성
(1) init-method / destroy-method 속성
스프링 컨테이너는 스프링 설정 파일에 등록된 클래스 객체를 생성할 때 디폴트 생성자를 호출한다. 따라서 생성자로 객체의 멤버변수를 초기화할 수 없다. 만약 객체 생성 후 멤버변수 초기화 작업이 필요하다면 init-method 속성을 사용하면 된다. 아래와 같이 init-method에 원하는 메소드를 등록하면 객체 생성 후 init-method 속성에 등록된 initMethod()를 호출한다.
# init-method 속성
<bean id="tv" class="Exam1.SamTV" init-method="initMethod"></bean>
반면 destroy-method 속성에는 스프링 객체가 객체를 삭제하기 전에 호출할 메소드를 지정한다. 아래와 같이 속성을 지정할 수 있다.
# destroy-method 속성
<bean id="tv" class="Exam1.SamTV" destory-method="destoryMethod"></bean>
아래와 같이 SamTV와 Main 클래스가 작성되어 있다고 하자.
# SamTV
public class SamTV implements TV {
public SamTV() { System.out.println("SamTV 객체 생성"); }
public void initMethod() {
System.out.println("initMethod 수행");
}
public void destoryMethod() {
System.out.println("destroyMethod 수행");
}
}
# Main
public class TVMain {
public static void main(String[] args) {
// 스프링 컨테이너 구동
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
// 객체 요청
TV tv = (TV)factory.getBean("tv");
// 컨테이너 종료
factory.close();
}
}
위에서 설명한 것과 같이 위 코드에서 spring 컨테이너는 객체를 생성 후 init-method 속성에 등록된 메소드를 실행시키는 것을 볼 수 있다. 또한 컨테이너가 객체를 삭제하기 직전에 destroy-method 속성에 등록된 메소드가 실행된 것도 확인할 수 있다.
(2) lazy-init 속성
ApplicationContext를 이용하여 컨테이너를 구동하면 bean들을 pre-loading 방식으로 생성한다. 즉, 컨테이너가 구동되는 시점에 bean들을 즉시 생성한다. 하지만 메모리를 많이 차지하는 bean이 자주 사용되지 않는다면 굉장히 비효율적일 것이다. 이를 방지하기 위해 bean이 사용되는 시점에 객체를 생성하기 위해 lazy-init 속성을 사용할 수 있다. bean 등록 시 아래와 같이 lazy-init="true"를 사용해주면 된다.
# lazy-init 속성
<bean id="tv" class="Exam1.SamTV" lazy-init="true"></bean>
(3) scope 속성
spring 컨테이너는 기본적으로 bean 객체를 단 하나만 생성하는 싱글통 패턴을 사용한다. 즉, 객체가 몇 번 호출되건 모두 같은 bean 객체를 보내준다. 만약 객체를 호출될 때마다 새로운 객체를 생성해 반환하려면 scope 속성을 "prototype"으로 지정하면 된다. scope 속성은 "singleton"이 디폴트 값이다.
# scope 속성
<bean id="tv" class="Exam1.SamTV" scope="singleton"></bean>
<bean id="tv" class="Exam1.SamTV" scope="prototype"></bean>
'BackEnd > Spring' 카테고리의 다른 글
[Spring] Constructor Injection 기본 사용법 (0) | 2023.04.27 |
---|---|
[Spring] IoC, DL, DI 란? (0) | 2023.04.27 |
[Intellij] Bean 클래스 등록 및 스프링 컨테이너 구동 (0) | 2023.04.23 |
[Intellij] Spring xml 파일 (applicationContext.xml) 생성 (0) | 2023.04.23 |
[Spring JDBC] BeanPropertyRowMapper (0) | 2023.01.28 |