Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Tags
more
Archives
Today
Total
관리 메뉴

방카@Dev

[Spring]Ch4.IoC(Inversion of Control) 컨테이너_올인원 스프링 프레임워크 본문

BackEnd/Spring

[Spring]Ch4.IoC(Inversion of Control) 컨테이너_올인원 스프링 프레임워크

방카킴 2024. 6. 6. 19:43
 

올인원 스프링 프레임워크

올인원 스프링 프레임워크 작품소개: 기초부터 실무까지 한 권에 담은 올인원 스프링 프레임워크!웹 서비스의 핵심인 스프링 프레임워크의 전체적인 구조와 핵심 이론을 다양한 예제 프로젝트

ridibooks.com

 

- IoC 컨테이너 (DI 컨테이너라고도 부름) 설정은 applicationContext.xml

- IoC 컨테이너의 역할은 서비스 객체를 생성하고 필요한 DAO 객체를 생성해서 서비스에 주입

 

 

1. Bean의 생성과 초기화 

- <bean>은 빈을 가리키는 레퍼런스 변수 이름인 id와 클래스 이름인 클래스 두가지 속성을 가지고 있음. 

<bean id="initSampleData" class="패키지를 포함한 클래스 이름"/>

 

1) <property>를 이용한 필드 초기화

- <property>의 name 속성에는 필드 이름을 명시함 

<bean id="initSampleData" class="com.kbfg.digi.InitSampleData">
	<property name = "sNums"> //필드 이름
    	<array>
        	<value>hbs001</value>
            <value>hbs001</value>
            <value>hbs001</value>
            <value>hbs001</value>
            <value>hbs001</value>
        </array>
   </property>
</bean>

- <bean>은 빈 생성을 위해서 InitSampleData의 생성자를 이용하고, <property>는 sNums를 초기화하기 위해서 sNums의 setter 메서드를 이용함 

- 상단의 문법을 이용하기 위해서는 initSampleData 클래스에 기본 생성자가 존재하면서 sNums의 setter가 있어야 함

 

2) <constructor-arg>를 이용한 필드 초기화

<bean id="studentRegisterService" class="com.kbfg.digi.StudentRegisterService">
	<constructor-arg ref="studentDao"/>  //생성자 매개변수
</bean>

- 매개변수를 받는 생성자가 있는 클래스의 경우 빈을 생성 시에 객체를 주입받아야 하는데, <constructor-arg> 태그를 이용함

- ref에 bean id값을 입력

 

3) Main method에서 호출

String configLocation = "classpath:applicationCTX.xml";

AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation); //객체 생성
		
StudentInfo studentInfo = ctx.getBean("IoC컨테이너에 입력한 id이름",클래스 이름.class);

 

4) <c>, <p> 태그 이용하는 경우

- 네임스페이스에서 c 또는 p 체크

<bean id="family" class="com.kbfg.digi.Family" c:papaName="홍아빠" c:mamiName="홍엄마" p:sisterName="홍누나">
	<property name="brotherName" value="홍오빠"/>
</bean>

//c: constructor-arg  p: property

 

2. 스프링 설정 파일 분리

1) IoC 컨테이너에서 조합하기

- applicationContext.xml을 여러 개로 분리(appCtx1.xml, appCtx2.xml, appCtx3.xml)

- 파일을 분리해도 모든 빈인 동일한 스프링 컨테이너에 의해서 관리됨

String[] appCtxs = {"classpath:appCtx1.xml","classpath:appCtx2.xml","classpath:appCtx3.xml"};
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(appCtxs);

 

2) <import> 태그 이용하기

//appCtx1.xml 내부 
<import resource="classpath:appCtx2.xml"/>

 

3. 스프링 빈 범위(스코프)

- IoC 컨테이너에서 생성된 빈을 getBean()으로 호출하면 항상 동일한 객체가 반환됨

- 이는 스프링이 기본적으로 객체 범위를 싱글톤으로 관리하기 때문

- 싱글톤은 객체를 호출할때마다 새로 생성하지 않고 기존의 객체를 재활용함

<bean id="student" class="kr.soft.study.Student" scope="prototype">

 

Scope 범위 설명
singleton 해당 bean에 대해 하나의 객체로만 존재(default)
prototype 해당 bean에 대해 다수의 객체 존재
request 해당 bean에 대해 하나의 http request의 라이프 사이클에서 단 하나의 객체로 존재
session 해당 bean에 대해 하나의 http session의 라이프 사이클에서 단 하나의 객체로 존재
global session 해당 bean에 대해 하나의 global http session의 라이프 사이클에서 단 하나의 객체로만 존재