์์์ DI์์ Assembler๋ฅผ ํตํด ํน์ ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํด์คฌ๋ค.
์คํ๋ง์ ์์์ ์ค๋ช
ํ๋ Assembler์ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์์ ๊ตฌํํ Assembler ๋์ ์คํ๋ง์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ณด์
@Configuration // ์คํ๋ง ์ค์ ํด๋์ค๋ฅผ ์๋ฏธํ๋ค. ์ด ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ผ ์คํ๋ง ์ค์ ํด๋์ค๋ก ์ฌ์ฉํ ์ ์๋ค.
public class AppCtx{
@Bean // ๋น๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
public SomeDao someDao() {
return new SomeDao();
}
@Bean
public SomeService someService() {
return new SomeService(someDao());
}
@Bean
public SomePasswordService somePasswordService() {
SomePasswordService somePasswordService = new SomePasswordService();
somePasswordService.setMemberDao(someDao());
return somePasswordService;
}
}
์์ฝ๋์์ ๋ฉ์๋ ์์ @Bean์ ๋ถ์ด๋ฉด ๋ฉ์๋ ๋ฅผ ๋น ๊ฐ์ฒด๋ก ์์ฑํ๋ค.
someDao() ๋ฉ์๋์ ๊ฒฝ์ฐ someDao๋ผ๋ ์ด๋ฆ์ผ๋ก ์คํ๋ง์ ๋ฑ๋ก๋๋ค.
someService() ๋ฉ์๋๋ฅผ ๋ณด๋ฉด SomeService ์์ฑ์๋ฅผ ํธ์ถํ ๋ someDao()๋ฉ์๋๋ฅผ ์ฃผ์
ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
somePasswordService()์ ๊ฒฝ์ฐ setter๋ฉ์๋๋ฅผ ํตํด ์ฃผ์
ํ๊ณ ์๋ค.
์คํ๋ง์์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ค์ ํด๋์ค๋ฅผ ํตํด ์ปจํ ์ด๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
ApplcationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class);
}
๊ทธ๋ฆฌ๊ณ getBean()๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ๊ตฌํ ์ ์๋ค.
public static void processCommand() {
SomeService someSer = ctx.getBean("someService",SomeService.class );
someSer.doMethod();
}
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ctx๋ก ๋ถํฐ "someService"์ธ ๋น๊ฐ์ฒด๋ฅผ ๊ตฌํ๋๋ฐ ๋งจ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด @Bean์ ํตํด ๋ฑ๋กํ ๋ฉ์๋์ค someService๋ฉ์๋๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ฉ์๋๋ someDao()๋ฅผ ์ฃผ์
๋ฐ๋๋ค.
๋ฐ๋ผ์ ๋ฐ๋ก์ ์ฝ๋์์ ์์ฑ๋ someSer์ ๊ฐ์ฒด ๋ด๋ถ์์ someDao ๋น๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋์ ๋น ๊ฐ์ฒด๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์์ฒ๋ผ getBean์ ํตํด ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค
์์กด์ฑ ์ฃผ์ ๋ฐฉ์์ 2๊ฐ์ง๊ฐ ์๋๋ฐ
- ์์ฑ์ ๋ฐฉ์
- setter ๋ฐฉ์์ด ์๋ค.
๋งจ์ ์ฝ๋์์ someService() ๋ฉ์๋ ๋ฐฉ์์ด ์์ฑ์๋ฐฉ์์ด๊ณ , somePasswordService() ๋ฉ์๋ ๋ฐฉ์์ด setter๋ฐฉ์์ด๋ค.
์ด ๋๋ฐฉ์์ ๊ฐ์ ์ฅ์ ์ด ์๋๋ฐ
- ์์ฑ์ ๋ฐฉ์ : ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ๋ชจ๋ ์์กด ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋๋ค.
- setter ๋ฐฉ์ : setter ๋ฉ์๋ ์ด๋ฆ์ ํตํด ์ด๋ค ์์กด ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋๋์ง ์ ์ ์๋ค.
์ฌ๋ด์ด์ง๋ง ์ง๊ธ๊น์ง Spring์ ํ๋ฉด์ ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ์์ ์์ฑ์ ๋ฐฉ์์ด์ง๋ง ๊ทธ๋ ๋ค๊ณ ๋จ์ ์ด ์๋๊ฒ์ ์๋๋ค.
์ฑ
์์
๋ง์ฝ ์์ฑ์ ํ๋ผ๋ฏธํฐ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์์ ํ ์ํ๋ก ์ฌ์ฉํ ์ ์์ง๋ง ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ๊ฐ์ธ์๊ฐ ์ด๋ค ์์กด ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋์ง ์์๋ด๋ ค๋ฉด ์์ฑ์์ ์ฝ๋๋ฅผ ํ์ธํด์ผ ํ๋ค.
๋ฐ๋๋ก setter ๋ฐฉ์์ ๊ฒฝ์ฐ ์ด๋ค ์์กด ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋์ง ์์ ์์ง๋ง ํ์ํ ์์กด ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ง ์์๋ ๋น ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ NPE๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ ๊ฒ ์ค๋ช
ํ๋ค ๊ทธ๋ฌ๋ ์ ์ด์ ์์ฑ์์ ํ๋ผ๋ฏธํฐ ๋ง๋ค๋ ๊ฒ ์์ฒด๊ฐ ๊ฐ๋
์ฑ์๋ ์ฝ๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ํฉ์ด ๋์ฌ๊น ์ถ๋ค.
์ด๋ถ๋ถ์ ํ์
๊ฐ๋ฐ์๋ถ๋ค์ด ์๊ฒฌ์ ๋ฃ๊ณ ์ถ๋ค.
์ด์จ๋ ์ง๊ธ์ ์ง์์ผ๋ก๋ ์์ฑ์ ๋ฐฉ์์ด ๊ฐ์ฅ ๋ง๋ค๊ณ ์๊ฐํ๋ค.
๋งจ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ถ๊ธ์ฆ์ด ์๊ธธ์๋์๋ค (์์๊ฒจ๋ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฅ ๊ธ์ ์ด์ด๊ฐ๋ ค๋ ๋ฌธ์ฅ์ผ ๋ฟ์ด์์, ์ฌ์ค์ ๋ ์์๊ฒผ์ด์)
someDao()๊ฐ ์๋ก์ด someDao ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์์กด๊ฐ์ฒด๋ก ๋ฐ๋ ๊ฐ์ฒด๋ค์ ์๋ก์ด someDao ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค???
๊ทธ๋ฌ๋ ์คํ๋ง ์ปจํ
์ด๋๊ฐ ์์ฑํ ๋น์ ์ฑ๊ธํค ๊ฐ์ฒด ์ด๊ธฐ ๋๋ฌธ์ someDao()๋ฅผ ๋ช๋ฒ์ด๋ ํธ์ถ ํ๋๋ผ๋ ํญ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ ์คํ๋ง์ ์ค์ ํด๋์ค๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ , ์ค์ ํด๋์ค๋ฅผ ์์ํ ์๋ก์ด ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
์คํ๋ง์ด ๋ฐํ์์ ์์ฑํ ์ค์ ํด๋์ค์ someDao()๋ฉ์๋๋ ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ํ๋ฒ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๋ค๊ฐ ๋ฆฌํดํ๋ค.
์คํ๋ง์ ์ฌ์ฉํ๋ฉด์ ์ฃผ์
ํ ๊ฐ์ฒด๊ฐ ๊ผญ ์คํ๋ง ๋น์ด์ด์ผ ํ ํ์๋์๋ค.
๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ์๋์ ๋ฑ๋กํ์ง ์์์๋์ ์ฐจ์ด๋ ์คํ๋ง์ปจํ
์ด๋๊ฐ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌ ํ๋๋์ ์ฐจ์ด์ด๋ค.
์คํ๋ง ์ปจํ
์ด๋๋ ์๋ ์ฃผ์
, ์๋ช
์ฃผ๊ธฐ ๋ฑ ๋จ์๊ฐ์ฒด ์์ฑ ์ด์ธ์ ๊ฐ์ฒด ๊ด๋ฆฌ๋ฅผ ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ ๋น์ผ๋ก ๋ฑ๋กํ ๊ฐ์ฒด์๋ง ๊ฐ๋ฅํ๋ค.
๋ง์ฝ ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ซ๋ค๋ฉด ๋น ๊ฐ์ฒด๋ก ๋ง๋ค์ง ์๊ณ ๊ฐ๋ฐ์๊ฐ ์์์ ๊ด๋ฆฌ ํด์ฃผ๋ฉด๋๋ค
###๋ค์ ์๊ฐ
Spring DI์ ๋ช๊ฐ์ง ์ถ๊ฐ๋ก ์ ๋ด์ฉ์ ๋ํด ์์๋ดค๋ค.
๋ค์์ฃผ์๋ ์๋ ์์กด ์ฃผ์
์ ๋ํด์ ์์๋ณด์
๋