๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปStudy/Spring

์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ DI (@Autowired, @Qualifier)

์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ์ฃผ์ž…์— ๊ด€๋ จํ•œ ๋ถ€๋ถ„์„ ์†Œ์Šค ์ฝ”๋“œ ์™ธ๋ถ€์ธ xml์œผ๋กœ ๋นผ๋†“์€ ๊ณผ์ •์„ ์‚ดํŽด๋ณด์•˜๋‹ค. ์†Œ์Šค์— ์ˆ˜์ •์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ์†Œ์Šค ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ  xml์˜ ์„ค์ • ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ด์ ์ด ์žˆ์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, B2๋ผ๋Š” ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ B3์œผ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ๋œ๋‹ค๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด ๋ณด์ž.

<bean id="b" class="data.B2"/>

xml์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋นˆ ์ƒ์„ฑ ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ์„ ๋•Œ, B2๋ฅผ B3๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

(์ˆ˜์ • ํ›„) <bean id="b" class="data.B3"/>

ํ•˜์ง€๋งŒ ์ด ๊ณผ์ • ์—ญ์‹œ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ๊ณ , ์ฝ”๋“œ์— ์•„์˜ˆ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์„ค์ • ํŒŒ์ผ์„ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†์ด, @Componect๊ฐ€ ๋ถ™์€ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. => ์–ด๋…ธํ…Œ์ด์…˜

=> ์„ค์ • ํŒŒ์ผ์„ ๋ฐ–์œผ๋กœ ๋นผ๋†“๋Š” xml ๋ฐฉ์‹์—์„œ, ์„ค์ •์„ ์•„์˜ˆ ์ฝ”๋“œ์— ์‹ฌ์–ด๋†“๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ Œ๋“œ๊ฐ€ ๋ณ€ํ™”ํ•˜์˜€๋‹ค.

 

xml์„ ํ†ตํ•œ DI ์˜ˆ์ œ๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ DI๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ๋‹ค. xml ์„ค์ • ๋ถ€๋ถ„์„ ์ค„์ด๊ณ  ์ž๋ฐ” ์ฝ”๋“œ ์ž์ฒด์— ์„ค์ •์„ ๋ฐ•์•„๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, xml๊ณผ ์ž๋ฐ” ์ฝ”๋“œ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

setting.xml

<!--namespace์—์„œ context ์ฒดํฌ -->
<context:annotation-config/>

<bean id="console" class="spring.di.ui.GridExamConsole">
	<!-- <property name="exam" ref="exam"></property> -->
</bean>

 

์„ธํ„ฐ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€ํ’ˆ์„ ์กฐ๋ฆฝํ•˜๋Š” propery ํƒœ๊ทธ๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌ ํ•˜์˜€๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฏ€๋กœ ์ด๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋„ ํฌ์ธํ„ฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. xml์„ ํ†ตํ•œ ์„ธํ„ฐ ํ•จ์ˆ˜๋ฅผ ์—†์•ค ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์„ธํŒ…๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋น„์–ด์žˆ๋Š” ๊ป๋ฐ๊ธฐ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑ๋œ๋‹ค. ๊ฐ’์„ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ์„ธํ„ฐ ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์“ฐ์ธ ๋ถ€๋ถ„์— ์ง์ ‘ ์„ค์ •์„ ํ•ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

๋˜ํ•œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ฒƒ์€ <context:annotation-config/>๋ผ๋Š” ํƒœ๊ทธ์ด๋‹ค. ์ด๋Š” ์Šคํ”„๋ง์—๊ฒŒ xml์„ ํ†ตํ•ด ๋นˆ์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ์„ค์ • ํŒŒ์ผ์—์„œ ๋น ์ง„ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด @Autowired๋ฅผ ์ฝ์–ด์„œ ์„ธํŒ…ํ•˜๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์ด ํƒœ๊ทธ๊ฐ€ ์—†์œผ๋ฉด @Autowired๊ฐ€ ์ œ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

 

์ฆ‰, context ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด Autowired๋กœ ์„ธํŒ…ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋‹ˆ ํ™•์ธํ•ด๋ณด๋ผ๋Š” ์ง€์‹œ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

(์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์†์„ ๋“ค์—ฌ๋ณด์•„๋ผ, ๋ผ๋Š” ์ง€์‹œ)

 

 

GridExamConsole.java

@Autowired
@Override
public void setExam(Exam exam) {
	this.exam = exam;
}

 

setExam์ด๋ผ๋Š” ์„ธํ„ฐ ํ•จ์ˆ˜์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํ”„๋ง์ด xml์„ ํ†ตํ•ด console์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋นˆ์„ ์ƒ์„ฑํ•˜๋ฉด์„œ @Autowired๊ฐ€ ๋ถ™์€ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด๊ณ , ์žˆ์œผ๋ฉด ๊ทธ์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ์„ธํŒ…์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์„ธํŒ…ํ•œ ํ›„ ์‹คํ–‰์„ ํ•˜๋ฉด ๊ธฐ์กด์— xml์—์„œ property๋ฅผ ํ†ตํ•ด ์„ธํ„ฐ ์ฃผ์ž…์„ ํ•œ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ  ์ฃผ์ž…๋œ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด @Autowired๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ธฐ์ค€์ด ๋ฌด์—‡์ผ๊นŒ? Exam์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฐพ๋Š” ๊ฒƒ์ผ๊นŒ, ์•„๋‹ˆ๋ฉด exam์ด๋ผ๋Š” ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์ฐพ๋Š” ๊ฒƒ์ผ๊นŒ? 

 

์Šคํ”„๋ง์€ ์šฐ์„  ์ž๋ฃŒํ˜•์„ ๊ธฐ์ค€์œผ๋กœ @Autowired๋ฅผ ์ฐพ์•„๋ณด๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ Exam์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฐพ๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค. ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์กฐ๊ธˆ ๋” ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

 

Program.java

ExamConsole console = (ExamConsole) context.getBean("console");

 

ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ExamConsole.class ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์ง€ ์•Š๊ณ  ์ƒ์„ฑํ•œ ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ ๊บผ๋‚ธ๋‹ค.

 

setting.xml

<context:annotation-config/>
	<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />

 

๋นˆ์˜ ์ด๋ฆ„์„ exam์ด ์•„๋‹Œ exam1์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋ฌธ์ œ ์—†์ด ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, ์Šคํ”„๋ง์€ ๋นˆ์˜ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ์ž๋ฃŒํ˜•์ธ ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ @Autowired๋ฅผ ์ฐพ์•„์„œ ๊ฐ’์„ ์„ธํŒ…ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‹ฌ์ง€์–ด ์ด๋ฆ„์ด ์—†์–ด๋„(id="exam1" ๋ถ€๋ถ„์„ ์‚ญ์ œํ•ด๋„) ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ด๋ฆ„๊ณผ๋Š” ๊ด€๋ จ์—†์ด ๊ฐ์ฒด ํƒ€์ž…์„ ํ†ตํ•ด ์„ธํŒ…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

 

setting.xml

<context:annotation-config/>
	<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />
	<bean class="spring.di.entity.NewlecExam" p:kor="2" p:eng="2" />

 

์ด ๊ฒฝ์šฐ ์Šคํ”„๋ง์ด ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ฐพ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธํŒ…ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ ํ›„ ์‹คํ–‰์„ ํ•ด๋ณธ๋‹ค.

 

setting.xml

<context:annotation-config/>
	<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />
	<bean class="spring.di.entity.NewlecExam" p:kor="2" p:eng="2" />

 

์—๋Ÿฌ์—†์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ด๋ฆ„์„ exam์œผ๋กœ ์ง€์ •ํ•œ ๋นˆ๋Œ€๋กœ kor="1", eng="1" ๊ฐ’์„ ์„ธํŒ…ํ•˜๊ฒŒ ๋œ๋‹ค.

 

=> ์Šคํ”„๋ง์€ ์šฐ์„  ์ž๋ฃŒํ˜• ํƒ€์ž…(๊ฐ์ฒด ํƒ€์ž…)์œผ๋กœ @Autowired๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋‘ ๊ฐœ ์ด์ƒ ์ƒ์„ฑํ–ˆ์„ ๋•Œ๋Š” ์ง€์ •ํ•œ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ @Autowired๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ธํŒ…ํ•œ๋‹ค.

 

<context:annotation-config/>
	<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />
	<bean class="spring.di.entity.NewlecExam" p:kor="2" p:eng="2" />

 

๋งŒ์•ฝ ์ด์ฒ˜๋Ÿผ bean id="exam"์ด ์•„๋‹ˆ๋ผ bean id="exam1"์ด์—ˆ๋‹ค๋ฉด ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ๋‘ ๊ฐœ์˜ ๋นˆ์˜ ์ด๋ฆ„์ด ๊ฐ๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์ธ exam๊ณผ๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ง€์ •๋œ ๊ฒฝ์šฐ์ด๋‹ค.

 

<context:annotation-config/>
	<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1" />
	<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="2" p:eng="2" />

 

์ด ๊ฒฝ์šฐ ๋ฌผ๋ก  ๋ฐ”์ธ๋”ฉ์ด ์•ˆ ๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฒƒ์ด๊ณ , ์ด๋Ÿด ๊ฒฝ์šฐ์— ์ •์ƒ์ ์œผ๋กœ ๋นˆ์„ ์ฐพ์•„ ์„ธํŒ…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ @Qualifier์ด๋‹ค. @Qualifier๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ๋นˆ์˜ ์ด๋ฆ„์„ ์ฐพ์•„ ๊ทธ๊ฒƒ์— ๋งž๊ฒŒ @Autowired๋ฅผ ์ฐพ๊ณ , ์„ธํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

GridExamConsole.java

@Autowired
@Qualifier("exam1")
@Override
public void setExam(Exam exam) {
	this.exam = exam;
}

 

 

*@Autowired์˜ ์œ„์น˜

 

์ง€๊ธˆ๊นŒ์ง€๋Š” ์„ธํ„ฐ ํ•จ์ˆ˜์— @Autowired๋ฅผ ๋ถ™์—ฌ ๊ฐ์ฒด์— ๊ฐ’์„ ์„ธํŒ…ํ•ด ์ฃผ์—ˆ๋‹ค. ์ด์™ธ์—๋„ @Autowired๋Š” ํ•„๋“œ์— ๋ถ™์„ ์ˆ˜๋„, ์ƒ์„ฑ์ž์— ๋ถ™์„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

GridExamConsole.java

public class GridExamConsole implements ExamConsole {

	//1. @Autowired
	//@Qualifier("exam1")
	private Exam exam;
	
	public GridExamConsole() {
	}
	
	//2. @Autowired
	public GridExamConsole(@Qualifier("exam1") Exam exam) {
		this.exam = exam;
	}

	//3. @Autowired
	//@Qualifier("exam1")
	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

 

1. ํ•„๋“œ์— ๋ถ™์€ ๊ฒฝ์šฐ

๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์„ธํŒ…ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์—†๊ณ  ์˜ค๋ฒ„๋กœ๋“œ ๋œ ์ƒ์„ฑ์ž๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž, ์˜ค๋ฒ„๋กœ๋“œ ๋œ ์ƒ์„ฑ์ž ๋ชจ๋‘ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋นˆ ์ƒ์„ฑ์‹œ ์ž๋™์œผ๋กœ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2. ์˜ค๋ฒ„๋กœ๋“œ ๋œ ์ƒ์„ฑ์ž์— ๋ถ™์€ ๊ฒฝ์šฐ

์ƒ์„ฑ์ž์— @Qualifier๋ฅผ ๋ถ™์ด๋ฉด ๊ธฐ์ค€์ด ๋ชจํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋นจ๊ฐ„์ค„์ด ๋œฌ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ง์ ‘ @Qualifier๋ฅผ ๋ถ™์—ฌ์•ผ ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์— ๊ฐ์ž ๋ถ™์ด๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

(public GridExamConsole(@Qualifier("exam1") Exam exam1, @Qualifier("exam2") Exam exam2))

 

3. ์„ธํ„ฐ ํ•จ์ˆ˜์— ๋ถ™์€ ๊ฒฝ์šฐ

๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์ƒ์„ฑํ•œ ํ›„, ์„ธํ„ฐ ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ์„ธํŒ…ํ•œ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํ•„๋“œ์— @Autowired๋ฅผ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

* required ์˜ต์…˜

 

GridExamConsole.java

public class GridExamConsole implements ExamConsole {

	@Autowired
	@Qualifier("exam1")
	private Exam exam;
	
	public GridExamConsole() {
	}
	
	public GridExamConsole(Exam exam) {
		this.exam = exam;
	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

 

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ธ ํ•„๋“œ์— @Autowired๋ฅผ ๋ถ™์ด๋Š” ์ƒํ™ฉ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค. @Qualifier๋ฅผ ๋ถ™์—ฌ exam1์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑ๋œ ๋นˆ์„ ์ฐพ์•„ ์„ธํŒ…ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ setting.xml์— exam1์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋นˆ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ์ด ๊ฒฝ์šฐ ์‹คํ–‰ํ•˜๋Š” ์ฆ‰์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. exam1์ด๋ผ๋Š” ๋นˆ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„์„œ ์—†๋Š” ์ƒํƒœ์—์„œ, @Autowired ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์„ธํŒ…ํ•˜๋ผ๊ณ  ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์—†๋Š” ๊ฒƒ์„ ์ฐพ์œผ๋ผ๊ณ  ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋– ํ•œ ์ด์œ ๋กœ๋“ , ๋นˆ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•„๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ฐ€๋ น, exam์ด null์ด๋ผ๋ฉด "null์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ์ƒํ•ด๋ณด์ž. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ required ์˜ต์…˜์ด๋‹ค.

 

์œ„ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•œ๋‹ค.

 

GridExamConsole.java

public class GridExamConsole implements ExamConsole {

	@Autowired(required = false)
	@Qualifier("exam1")
	private Exam exam;
	
	public GridExamConsole() {
	}
	
	public GridExamConsole(Exam exam) {
		this.exam = exam;
	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

 

@Autowired(required = false) ์˜ต์…˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋นˆ์ด ์—†๋Š” ์ƒํƒœ์—ฌ๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์ง„ํ–‰๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 


๋‰ด๋ ‰์ฒ˜ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๊ฒŒ์‹œ๊ธ€์ž…๋‹ˆ๋‹ค.

www.youtube.com/user/newlec1