Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240106 [스프링-프레임워크] - 8강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[inflearn] 20240106 [스프링-프레임워크] - 8강 필기

Jelly-fish 2024. 1. 7. 16:48

[8강 - 스프링 설정 파일 분리]

8-1. 스프링 설정 파일 분리
8-2. 빈(Bean)의 범위

 

8-1. 스프링 설정 파일 분리

 

전체적인 `applicationContext.xml` 파일을

`appCtx1.xml`, `appCtx2.xml`, `appCtx3.xml` 로 분리한다.

 

 

일반적으로 applicatonContext.xml을 기능별로 분리한다.

ⓐ DAO, 서비스

ⓑ DataBase 관련 객체

ⓒ Information 서비스

 

 

`applicationContext.xml` 파일을 단독으로만 사용할 때는

Main class에서

GenericXmlApplicationContext
= new GenericXmlApplicationContext("classpath:applicationContext.xml");

로  하나의 스프링 컨테이너(IoC) 파일명만 명시하여 스프링 컨테이너를 생성했었다.

 

 

하지만, 이제는 3개의 xml 파일로 `applicationContext.xml`을 분리하였으므로

다음과 같이 총 3개의 스프링 컨테이너를 생성할 수 있도록 한다.

// ① 생성해야 하는 스프링 컨테이너(applicaionContext.xml)의 분리된 xml 파일들의 파일명을
//   "classpath:파일명.xml" 형식으로 구성한 문자열 배열로 만든다.
String[] appCtxs = {"classpath:appCtx1.xml", "classpath:appCtx2.xml", "classpath:appCtx3.xml"};


// ② 스프링 컨테이너를 GenericXmlApplicationContext 로 생성한다.
//   이때, 매개변수를 위에서 구성한 문자열 배열의 변수명으로 주면 된다.
GenericXmlApplicationContext ctx 
= new GenericXmlApplicationContext(appCtxs);

 

이후, `getBean("bean의 id", 변경할 클래스.class)` 메소드를 통해

생성된 Bean 객체를 가져와서 로드하도록 한다.

 

또 다른 방법으로는, import 를 사용하는 것이다.

스프링 설정 파일에서 `applicationContext.xml` 파일을 3등분한 파일들 중

두 개를 import 하여

스프링 설정 파일 xml 하나만 로드하더라도, 3개의 xml 파일을 import 할 수 있도록 하는 것이다.

<!-- appCtxImport.xml -->

<import resource="classpath:appCtx2.xml">
<import resource="classpath:appCtx3.xml">

<!-- appCtx1.xml 의 경우에는, 이 파일에 적어 주었다. -->

 

// MainClass.java

// appCtxImport.xml에서 appCtx2.xml, appCtx3.xml을 모두 import 해 주었으므로
// appCtxImport.xml 파일 하나의 스프링 컨테이너(IoC)만 생성하면 된다!

GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:appCtxImport.xml");

 

 

 

8-2. 빈(Bean)의 범위

 

싱글톤(Singleton)

스프링 컨테이너에서 생성된 빈(Bean)객체의 경우 동일한 타입에 대해서는 기본적으로

한 개만 생성이 되며, `getBean()` 메소드로 호출될 때 동일한 객체가 반환 된다.

 

`applicationContext.xml` → Spring Container 생성 (A 객체) → 호출1 `getBean("A")`, 호출2 `getBean("A")`

 

미리 객체를 생성해 놓은 것을, 호출을 통해 참조만 하는 것이다.

동일한 객체를 여러 번 참조할 수가 있다. 이것을 싱글톤(Singleton) 이라고 한다.

객체를 생성하는 것과, 호출하는 것이 분리되어 있으므로

계속해서 `new bean()` 과 같이 객체를 생성해서 메모리에 올릴 필요가 없는 것이다.

 

 

프로토타입(Prototype)

싱글톤 범위와 반대의 개념도 있는데 이젠 프로토타입(Prototype) 범위라고 한다.

프로토타입의 경우 개발자는 별도로 설정을 해줘야 하는데, 스프링 설정 파일에서 빈(Bean)객체를

정의할 때 `scope` 속성을 명시해 주면 된다.

 

<bean id="dependencyBean" class="scope.ex.DependencyBean"
	scope="prototype">
	<constructor-arg ref="injectionBean" />
	<property name="injectionBean" ref="injectionBean" />
</bean>

 

싱글톤과 반대로, 호출 할 때마다 계속해서 다른 객체가 새로 생성이 되어서 반환되기를 원한다면

프로토타입을 사용하면 된다.

 

위와 같이, `scope="prototype"` 속성을 부여하게 되면

`MainClass.java`의 main() 메소드에서 `getBean()`을 통해 호출할 때마다

새롭게 Bean 객체가 생성이 된다.