Everything has an expiration date
[inflearn] 20240106 [스프링-프레임워크] - 8강 필기 본문
[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 객체가 생성이 된다.
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240106 [스프링-프레임워크] - 10강 필기 (0) | 2024.01.08 |
---|---|
[inflearn] 20240106 [스프링-프레임워크] - 9강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 6 ~ 7강 필기 (0) | 2024.01.07 |
[inflearn] 20240106 [스프링-프레임워크] - 5강 필기 (0) | 2024.01.07 |
[inflearn] 20240104 [스프링-프레임워크] - 1강 메모장 필기 (0) | 2024.01.04 |