Skip to content

Latest commit

ย 

History

History
91 lines (76 loc) ยท 5.36 KB

2020-02-18-SpringDI.md

File metadata and controls

91 lines (76 loc) ยท 5.36 KB

Spring DI

์•ž์—์„œ 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์„ ํ†ตํ•ด ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค

DI ๋ฐฉ์‹

์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ

  1. ์ƒ์„ฑ์ž ๋ฐฉ์‹
  2. setter ๋ฐฉ์‹์ด ์žˆ๋‹ค.
    ๋งจ์œ„ ์ฝ”๋“œ์—์„œ someService() ๋ฉ”์„œ๋“œ ๋ฐฉ์‹์ด ์ƒ์„ฑ์ž๋ฐฉ์‹์ด๊ณ , somePasswordService() ๋ฉ”์„œ๋“œ ๋ฐฉ์‹์ด setter๋ฐฉ์‹์ด๋‹ค.
    ์ด ๋‘๋ฐฉ์‹์€ ๊ฐ์ž ์žฅ์ ์ด ์žˆ๋Š”๋ฐ
  • ์ƒ์„ฑ์ž ๋ฐฉ์‹ : ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์— ๋ชจ๋“  ์˜์กด ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋œ๋‹ค.
  • setter ๋ฐฉ์‹ : setter ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ํ†ตํ•ด ์–ด๋–ค ์˜์กด ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๋‹ด์ด์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€ Spring์„ ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ์‹์€ ์ƒ์„ฑ์ž ๋ฐฉ์‹์ด์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ๋‹จ์ ์ด ์—†๋Š”๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
์ฑ…์—์„ 

๋งŒ์•ฝ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์™„์ „ํ•œ ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ๊ฐ์ธ์ž๊ฐ€ ์–ด๋–ค ์˜์กด ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค๋ฉด ์ƒ์„ฑ์ž์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.  
๋ฐ˜๋Œ€๋กœ setter ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ์–ด๋–ค ์˜์กด ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๋Š”์ง€ ์•Œ์ˆ˜ ์žˆ์ง€๋งŒ ํ•„์š”ํ•œ ์˜์กด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— NPE๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.  

์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค ๊ทธ๋Ÿฌ๋‚˜ ์• ์ดˆ์— ์ƒ์„ฑ์ž์— ํŒŒ๋ผ๋ฏธํ„ฐ ๋งŽ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๊ฐ€๋…์„ฑ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋‚˜์˜ฌ๊นŒ ์‹ถ๋‹ค.
์ด๋ถ€๋ถ„์€ ํ˜„์—…๊ฐœ๋ฐœ์ž๋ถ„๋“ค์ด ์˜๊ฒฌ์„ ๋“ฃ๊ณ ์‹ถ๋‹ค.
์–ด์จ‹๋“  ์ง€๊ธˆ์˜ ์ง€์‹์œผ๋กœ๋Š” ์ƒ์„ฑ์ž ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์‹ฑ๊ธ€ํ†ค

๋งจ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ธธ์ˆ˜๋„์žˆ๋‹ค (์•ˆ์ƒ๊ฒจ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๊ธ€์„ ์ด์–ด๊ฐ€๋ ค๋Š” ๋ฌธ์žฅ์ผ ๋ฟ์ด์—์š”, ์‚ฌ์‹ค์ €๋„ ์•ˆ์ƒ๊ฒผ์–ด์š”)
someDao()๊ฐ€ ์ƒˆ๋กœ์šด someDao ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์˜์กด๊ฐ์ฒด๋กœ ๋ฐ›๋Š” ๊ฐ์ฒด๋“ค์€ ์ƒˆ๋กœ์šด someDao ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋„ค??? ๊ทธ๋Ÿฌ๋‚˜ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•œ ๋นˆ์€ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด ์ด๊ธฐ ๋•Œ๋ฌธ์— someDao()๋ฅผ ๋ช‡๋ฒˆ์ด๋‚˜ ํ˜ธ์ถœ ํ•˜๋”๋ผ๋„ ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์Šคํ”„๋ง์€ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์„ค์ •ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ์ƒˆ๋กœ์šด ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.
์Šคํ”„๋ง์ด ๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑํ•œ ์„ค์ • ํด๋ž˜์Šค์˜ someDao()๋ฉ”์„œ๋“œ๋Š” ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•œ๋ฒˆ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€ํ–ˆ๋‹ค๊ฐ€ ๋ฆฌํ„ดํ•œ๋‹ค.

์ฃผ์ž… ๋Œ€์ƒ

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

###๋‹ค์Œ ์‹œ๊ฐ„

Spring DI์™€ ๋ช‡๊ฐ€์ง€ ์ถ”๊ฐ€๋กœ ์•Œ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋‹ค.
๋‹ค์Œ์ฃผ์—๋Š” ์ž๋™ ์˜์กด ์ฃผ์ž…์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž
๋