์ด์ ํฌ์คํ
์์ ๋น์ ์์ฑ๊ณผ ์ฃผ์
์ ๊ด๋ จํ ๋ถ๋ถ์ ์์ค ์ฝ๋ ์ธ๋ถ์ธ 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) ์ต์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ๋น์ด ์๋ ์ํ์ฌ๋ ํ๋ก๊ทธ๋จ์ด ์งํ๋๊ฒ ํ ์ ์๋ค.
๋ด๋ ์ฒ ์คํ๋ง ํ๋ ์์ํฌ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ฒ์๊ธ์ ๋๋ค.
'๐ปStudy > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
XML Configuration์ Java Configuration์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ (0) | 2021.02.13 |
---|---|
์ด๋ ธํ ์ด์ ์ ์ด์ฉํ ๊ฐ์ฒด ์์ฑ(@Component) (0) | 2021.02.12 |
xml์ ์ด์ฉํ ์คํ๋ง DI ์ง์์ ์์ฑ(Spring Bean Configuration), IoC ์ปจํ ์ด๋ ์ฌ์ฉํ๊ธฐ (0) | 2021.02.12 |
์คํ๋ง ์์ด DI ํด๋ณด๊ธฐ (0) | 2021.02.11 |
DI์ IoC ์ปจํ ์ด๋ (0) | 2021.02.11 |