스프링 설정 파일 분리
하나의 XML 파일에 너무 많은 내용이 담기다보면, 가독성이 떨어질뿐더러 코드의 길이도 길어진다. 스프링 설정 파일을 효율적으로 관리하기 위해서 설정파일을 분리하는 방법에 대해서 알아볼 것이다.
위 그림과 같이 한 파일에서 기능별로 파일을 보기 쉽게 분리해줘야 한다. 이후 파일을 분리하였을 때는 그럼 어떻게 여러 xml 파일들을 받아올까? 바로 파일들을 하나의 배열을 통해 받아주면 된다.
1. 파일 한 개만 받아올 때
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationContext.xml");
2. 배열로 여러 파일을 받아올 때
String[] appCtxs = {"classpath:appCtx1.xml", "classpath:appCtx2.xml", "classpath:appCtx3.xml"};
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext(appCtxs);
위 방법말고도 import구문을 통해서도 여러 파일을 받을 수 있다. appCtx 파일 중 한 개의 파일에 다른 XML 파일을 import 하는 구문을 넣어 주면 된다. 이렇게하면 스프링 설정파일을 받아올때 appCtx1번 파일만 받아오면 한 번에 다 가져오는 효과를 낼 수 있다.
3. import 구문을 통해 여러 파일을 받아올 때
/* appCtx1.xml */
...
<import resource="classpath:appCtx2.xml"/>
<import resource="classpath:appCtx3.xml"/>
...
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("classpath:appCtx1.xml");
위 두 방법다 좋은 방법이지만, 아직까진 개발자들이 사이에서 선호되는 방법은 배열을 통해 받아오는 방법이다.
빈(Bean)의 범위
이번엔 빈(Bean)의 범위에 대해서 살펴보자. Bean Scope의 종류에는 싱글톤(Singleton)과 프로토타입(Prototype) 두가지가 있다. 먼저 싱글톤을 알아보자.
1. Bean Scope: 싱글톤(Singleton)
싱글톤은 스프링 컨테이너에서 생성된 빈(Bean)객체의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성이 되어서, getBean() 메소드로 호출될 때마다 동일한 객체가 반환된다.
위 그림처럼 getBean을 통해 객체를 호출할 때, 계속해서 동일한 객체가 호출 될 것이다. 이해하기 쉽게 Java에서 new 키워드를 통해 객체를 생성할때를 보자. "new ClassName(); new ClassName(); new ClassName();" 이렇게 세번 객체를 생성하면 세 객체 모두 다른 객체를 가리킨다. 위 싱글톤에서는 반대로 모두 같은 객체를 가리킨다는 의미이다. 코드를 통해 한번 더 알아보자.
<?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="injectionBean" class="scope.ex.InjectionBean" />
<bean id="dependencyBean" class="scope.ex.DependencyBean">
<constructor-arg ref="injectionBean" />
<property name="injectionBean" ref="injectionBean" />
</bean>
</beans>
/* InjectionBean.java : 주입해주는 Bean */
public class InjectionBean {
}
----------------------------------------------------------------------------
/* DependencyBean.java : 의존받는 Bean */
public class DependencyBean {
private InjectionBean injectionBean;
public DependencyBean(InjectionBean injectionBean) {
System.out.println("DependencyBean : constructor");
this.injectionBean = injectionBean;
}
public void setInjectionBean(InjectionBean injectionBean) {
System.out.println("DependencyBean : setter");
this.injectionBean = injectionBean;
}
}
----------------------------------------------------------------------------
/* MainClass.java */
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationContext.xml");
InjectionBean injectionBean =
ctx.getBean("injectionBean", InjectionBean.class);
DependencyBean dependencyBean01 =
ctx.getBean("dependencyBean", DependencyBean.class);
DependencyBean dependencyBean02 =
ctx.getBean("dependencyBean", DependencyBean.class);
if(dependencyBean01.equals(dependencyBean02)) {
System.out.println("dependencyBean01 == dependencyBean02");
} else {
System.out.println("dependencyBean01 != dependencyBean02");
}
ctx.close();
/*
DependencyBean : constructor
DependencyBean : setter
dependencyBean01 == dependencyBean02
*/
위 코드를 통해 main에서 Bean 객체를 2번 호출해서 조건문을 통해 비교해보면 객체 둘 다 같다고 나오는 출력문을 확인할 수 있다.
이어서 싱글톤 개념과 반대로 객체를 호출할 때마다 다른 객체를 호출하는 프로토타입을 알아보자.
2. Bean Scope: 프로토타입(Prototype)
프로토타입은 개발자가 별도로 설정을 해줘야하는데, 스프링 설정 파일에서 빈(Bean) 객체를 정의할때 scope속성을 명시해주면 된다.
<bean id="dependencyBean" class="scope.ex.DependencyBean" scope="prototype">
<constructor-arg ref="injectionBean" />
<property name="injectionBean" ref="injectionBean" />
</bean>
이렇게 설정하고 똑같이 Main을 실행해보면 서로 다른 객체가 호출 됨을 알 수 있다.
/*
DependencyBean : constructor
DependencyBean : setter
DependencyBean : constructor
DependencyBean : setter
dependencyBean01 != dependencyBean02
*/
'Web[웹] > Spring Framework' 카테고리의 다른 글
[Spring] 어노테이션을 이용한 스프링 설정 (0) | 2019.11.21 |
---|---|
[Spring] 의존객체 자동 주입 : @Autowired와 @Resource (0) | 2019.11.20 |
[Spring] 의존객체와 DI(Dependency Injection) (0) | 2019.11.19 |
[Spring] 따라해보는 스프링 프로젝트 생성 (0) | 2019.11.18 |
[Spring] 스프링 프레임워크란 도대체 무엇인가? (0) | 2019.11.15 |