XML Configuration์ Java Configuration์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ
ํ๋ก๊ทธ๋จ์ ์์ ์ฌํญ์ด ์๊ฒผ์ ๋ ์์ค ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒ๋ณด๋ค ๊ฐ์ฒด๋ฅผ ์์ฑ-์ฃผ์ ํ๋ ์ค์ ๋ถ๋ถ์ ์์ค ์ฝ๋์ ์ธ๋ถ์ธ xml์ผ๋ก ๋นผ๋๋ ๊ฒ์ด ์ ์ง ๋ณด์์ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ด ๋๋ฆฌ ์ฐ์๋ค. ํ์ง๋ง ๊ฐ๋ฐ์๋ค์ ๊ทธ ๋ฐฉ๋ฒ๋ง์ ๋ xml์ ์์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค๋ ํ๋จ์ ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ ์์ฆ์๋ ์๋ฐ ์ฝ๋ ์์ฒด์ ์ด๋ ธํ ์ด์ ์ ๋ฌ์์ฃผ๋ ๋ฐฉ๋ฒ์ด ๋ ๋ง์ด ์ฐ์ด๊ณ ์๋ค. ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฅ๋จ์ ์ด ์์ผ๋ ํ์์ ๋ง๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ค๋ง ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฉ์์ ํต์ผํด์ฃผ๋ ํธ์ด ์ข๋ค.
์์ ์์ฑํ ํฌ์คํ ์์๋ ์คํ๋ง ์์ด DI, xml ์ค์ ํ์ผ ์ถ๊ฐ, xml์ ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ดํด๋ณด์๋ค. ์ด์ ๋ถํฐ๋ xml์ ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ ๋ง๋ฌด๋ฆฌ ์ง์ด๋ณด๋๋ก ํ๊ฒ ๋ค.
๊ฐ์ฒด์ ์์ฑ์ @Component ์ด๋ ธํ ์ด์ ์ด, ์ฃผ์ (์กฐ๋ฆฝ)์ @Autowired ์ด๋ ธํ ์ด์ ์ด ํจ์ผ๋ก์จ ํ์ฌ xml ํ์ผ์๋ <context:component-scan base-package="spring.di.ui"/> ํ๊ทธ๋ง ๋จ์์๋ ์ํ์ด๋ค. ์ด ํ๊ทธ๋ ์คํ๋ง์๊ฒ ํด๋น ํจํค์ง(base-package)์์ @Component ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์์ฑํ๋ผ๋ ๋ช ๋ น์ด๋ค. ์ด์ xml ๋ง์ ๋ ์๋ฐ ํ์ผ์ด ๋์ฒดํ ์ ์๊ฒ, ์ฆ ์๋ฐ ํ์ผ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋๋ก ํ๊ฒ ๋ค.
์ค์ ํ์ผ์ด ๋ ํด๋์ค๋ฅผ ์์ฑํ๋๋ฐ ์ผ๋ฐ์ ์ผ๋ก ํด๋์ค ์ด๋ฆ ๋์ Config๋ฅผ ๋ถ์ฌ ์ค์ ํ์ผ์ ๋์ ํจ์ ๋ช ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ค์ @Configuration ์ด๋ ธํ ์ด์ ์ ๋ถ์ธ๋ค. ์ด์ ์ด Config ํ์ผ์ด xml์ ๋์ ํด ์คํ๋ง์ ๊ฐ์ฒด ์์ฑ-์กฐ๋ฆฝ ์ง์์ ์ญํ ์ ํ ๊ฒ์ด๋ค. component-scan ํ๊ทธ๋ฅผ ๋์ ํด @ComponentScan ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๊ณ , ํจํค์ง๊ฐ ๋ ๊ฐ ์ด์์ด๋ผ๋ฉด ๋ฌธ์์ด ๋ฐฐ์ด ํํ๋ก ๋์ดํด ์ฃผ๋ฉด ๋๋ค.
(ex. @ComponentScan("spring.di.ui", "spring.di.entity")
๋น์ ์์ฑํ๋ <bean> ํ๊ทธ๋ @Bean ์ด๋ ธํ ์ด์ ์ผ๋ก ๋์ฒด๋๋ค. @Bean ์ด๋ ธํ ์ด์ ์ ์์ฑํ ๊ฐ์ฒด๋ฅผ IoC ์ปจํ ์ด๋์ ๋ด๋ ์ญํ ์ ํ๋ค. new ์์ฑ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฆฌํดํด ์ฃผ๋ ๋ฐฉ์์ฒ๋ผ ์จ์ฃผ๊ณ , ๋ฉ์๋์ ์ด๋ฆ์ธ exam์ ๋น์ ์ด๋ฆ์ฒ๋ผ ๋ช ์ฌํ์ด ๋ถ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋์ ์ด๋ฆ์ getExam()์ฒ๋ผ ๋์ฌํ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐํด exam()์ด๋ผ๋ ๋ช ์ฌํ ์ด๋ฆ์ด ๋ถ์ ๊ฒ์ด ์์ํ์ง๋ง bean id="exam"๊ณผ ๊ฐ์ ์๋ฏธ๋ก IoC ์ปจํ ์ด๋์ ์ด ์ด๋ฆ์ผ๋ก ๋ด๊ฒจ์ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ์๊ฐํ๋ฉด ๋๋ค.
setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
......>
<context:component-scan base-package="spring.di.ui"/>
<bean id="exam" class="spring.di.entity.NewlecExam"/>
</beans>
์์ xml ์ค์ ํ์ผ์ด
NewlecDIConfig.java
@ComponentScan("spring.di.ui")
@Configuration
public class NewlecDIConfig {
@Bean
public Exam exam() {
return new NewlecExam();
}
}
๋ค์๊ณผ ๊ฐ์ ์๋ฐ ํ์ผ๋ก ์์ ํ ๋์ฒด๋์๋ค.
ApplicationContext ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, XmlWebApplicationContext์ ๋ชจ๋ xml ์ค์ ํ์ผ๊ณผ ๊ด๋ จ์ด ์๋ค. ์ด์ xml ํ์ผ์ด ์๋ ์๋ฐ์ Config ํ์ผ์ ์ฌ์ฉํ ๊ฒ์ด๋ฏ๋ก AnnotationConfigApplicaionContext๋ก ์์ ํ๋๋ก ํ๋ค.
Program.java
public class Program {
public static void main(String[] args) {
ApplicationContext context =
//new ClassPathXmlApplicationContext("spring/di/setting.xml");
new AnnotationConfigApplicationContext(NewlecDIConfig.class);
}
}
์ฌ๊ธฐ๊น์ง Spring DI ๋!
๋ด๋ ์ฒ ์คํ๋ง ํ๋ ์์ํฌ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ฒ์๊ธ์ ๋๋ค.