Light Red Pointer [Spring] 03.DI์™€ IoC ๊ฐœ๋… ๋ฐ ์ด์ •๋ฆฌ
 

[Spring] 03.DI์™€ IoC ๊ฐœ๋… ๋ฐ ์ด์ •๋ฆฌ


 

 

 

 

์„œ๋ก 

Spring์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ 'DI'์™€ 'IoC', spring์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•œ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ดค์„ ์šฉ์–ด์ธ๋ฐ ๊ทธ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์˜ค๋Š˜์€ spring์˜ ํ•ต์‹ฌ ์šฉ์–ด์ธ 'DI'์™€ 'IoC'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž!

 

DI, IoC ๊ฐœ๋…

- DI(Dependency Injection)์ด๋ž€ '์˜์กด์„ฑ ์ฃผ์ž…'์„ ๋งํ•œ๋‹ค.

- ์˜์กด์„ฑ ์ฃผ์ž…์€ ๊ณง ๊ฐ์ฒด๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ IOC์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์ฃผ์ž…์‹œ์ผœ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

- ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ์—ญ์ „์‹œ์ผœ ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ํ•˜์—ฌ ๊ฐ€๋…์„ฑ ๋ฐ ์ฝ”๋“œ ์ค‘๋ณต, ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

- ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” 3๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค. (๊ฐ ๋ฐฉ์‹์˜ ์˜ˆ์ œ์ฝ”๋“œ๋Š” ์ดํ•˜์—์„œ  ์„ค๋ช…)

(์ฝ”๋“œ๋จผ์ € ๋ณด๊ณ ์‹ถ์œผ๋ฉด ์Šคํฌ๋กค ๋‚ด๋ ค์„œ ํ™•์ธ)

ใ€€1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)

ใ€€2. ์ˆ˜์ •์ž ์ฃผ์ž…(Setter Injection)

ใ€€3. ํ•„๋“œ ์ฃผ์ž…(Field Injection)

- 3๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘ ์Šคํ”„๋ง์—์„œ ๊ถŒ์žฅํ•˜๊ณ , ๋งŽ์ด ์“ฐ๋Š” ๋ฐฉ์‹์€ '์ƒ์„ฑ์ž ์ฃผ์ž…' ๋ฐฉ์‹์ด๋‹ค.

 

- IoC(Inversion of Control)์€ '์ œ์–ด์˜ ์—ญ์ „'์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

- ์ œ์–ด์˜ ์—ญ์ „์ด๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ๋ฉ”์„œ๋“œ๋‚˜ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๊ทธ ์ž‘์—…์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ spring์—๊ฒŒ ์ œ์–ดํ•  ๊ถŒํ•œ์„ ๋„˜๊ธฐ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

- IoC ๋ผ๋Š” ๊ฐœ๋…์ด ์ƒ๊ฒจ๋‚˜๊ธฐ ์ด์ „์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ์–ดํ–ˆ์ง€๋งŒ, ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ๋ฆ„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜์—ฌ ๋ณด๋‹ค ํŽธํ•œ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

 

Bean๊ณผ IoC ์ปจํ…Œ์ด๋„ˆ

- IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ 'Bean(๋นˆ)'์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, spring์€ ์ด๋Ÿฌํ•œ Bean(๊ฐ์ฒด)๋“ค์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  Bean์œผ๋กœ ๋“ฑ๋ก๋„ ํ•ด์ฃผ๊ณ  ๋งŒ๋“ค์–ด์ง„ Bean๋“ค์„ ์ด๊ด„์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์ฆ‰ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ spring์ด ์•Œ์•„์„œ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

- ์˜์กด์„ฑ ์ฃผ์ž…์€ ๋ฐ˜๋“œ์‹œ Bean์œผ๋กœ ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋“ค ๋ผ๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

- ์ฆ‰, IoC ์ปจํ…Œ์ด๋„ˆ๋Š” Bean์œผ๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ๊ฐ์ฒด์—๊ฒŒ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

1. ๋“ฑ๋กํ•˜๋ ค๋Š” ๊ฐ์ฒด๋ฅผ XML ํŒŒ์ผ์— ์„ค์ •

xml ์„ค์ •ํŒŒ์ผ์— ๋‘ ํด๋ž˜์Šค๋ฅผ ๊ฐ๊ฐ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , testService์˜ ํŠน์„ฑ์œผ๋กœ testRepository๋ฅผ ๋“ฑ๋กํ•ด ์ฐธ์กฐํ•˜๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id="testService"
          class="me.wordbe.springgoahead.testService">
        <property name="testRepository" ref="testRepository" />
    </bean>
 
    <bean id="testRepository"
          class="me.wordbe.springgoahead.testRepository" />
 
</beans>

 

2. Component Scan

Spring์ด Bean์„ ์•Œ์•„์„œ ์ฐพ๊ณ  ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก Component๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์„ค์ •ํ•ด์ค€๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
 
    <context:component-scan base-package="me.wordbe.springgoahead" />
 
 
</beans>

 

3. ํด๋ž˜์Šค ์„ ์–ธ๋ถ€ ์œ„์— ์–ด๋…ธํ…Œ์ด์…˜ ์„ค์ •

1~2๋ฒˆ์˜ ๊ณผ์ •์„ ํ•˜๊ณ , ํด๋ž˜์Šค ์„ ์–ธ๋ถ€ ์œ„์— "Component" ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ์ปดํฌ๋„ŒํŠธ  ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•ด์ค€ ๊ฐ์ฒด๋ฅผ Bean์— ์ •์ƒ์ ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. 

@Component 
public class TestService{

}

ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” "@Controller", "@Service", "@Repository"๋Š” ๋ชจ๋‘ "@Component"๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์–ด๋А๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.(but ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ์™€ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ตฌ์ฒด์ ์ธ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค)

 

IoC ์ปจํ…Œ์ด๋„ˆ์— Bean์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์„ค๋ช…ํ•œ ๋ฐฉ์‹ ์™ธ์—๋„ 'Java Config'๋ฅผ ์ด์šฉํ•œ ๋“ฑ๋ก๋ฐฉ๋ฒ• ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

DI, ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•

-  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. 

  • ์ƒ์„ฑ์ž ์ฃผ์ž…
  • setter ์ฃผ์ž…
  • ํ•„๋“œ ์ฃผ์ž…

(Spring ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” '์ƒ์„ฑ์ž ์ฃผ์ž…' ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•œ๋‹ค.)

- ์ƒ์„ฑ์ž ์ฃผ์ž…๋ฐฉ์‹์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์ง€๋งŒ ์˜์กด ๊ด€๊ณ„๊ฐ€ ์„ ํƒ์ ์ด๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” setter ์ฃผ์ž… ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

- ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ ์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.

- ๋ถˆํŽธ๊ณผ ํ•„์ˆ˜ ์˜์กด ๊ด€๊ณ„์— ์‚ฌ์šฉํ•œ๋‹ค.

- ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด '@Autowired'๋ฅผ ์ƒ๋žตํ•ด๋„ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋œ๋‹ค.

- NullPointerException์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Service
public class TestService {
    private final SampleTest sample;

    @Autowired
    public TestService(SampleTest sample) {
        this.sample = sample;
    }
}

 

- setter ํ•„๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

- ์„ ํƒ๊ณผ ๋ณ€๊ฒฝ  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜์กด ๊ด€๊ณ„์— ์‚ฌ์šฉํ•œ๋‹ค.

- '@Autowired'๋ฅผ ์จ์ฃผ์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

@Service
public class TestService {
    private final SampleTest sample;
    
    @Autowired
    public void setSampleTest(SampleTest sample) {
        this.sample = sample;
    }
}

 

- ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

- ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

- DI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค.

- ์ž‘๋™๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ๊ฒฐ๊ตญ setter๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

@Service
public class TestService {
    @Autowired
    private final SampleTest sample;
    
    @Autowired
    private final TestRepository testRepository;
}

- ํ•„๋“œ ์ฃผ์ž…์„ ํ•˜๊ฒŒ ๋˜๋ฉด 'DI ์ปจํ…Œ์ด๋„ˆ' ์•ˆ์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ˆœ์ˆ˜ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์ •๋ฆฌ

  IoC(Inversion of Control) DI(Dependency Injection)
์˜๋ฏธ ์ œ์–ด์˜ ์—ญ์ „ ์˜์กด์„ฑ ์ฃผ์ž…
๊ฐœ๋… ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ œ์–ด์˜ ํ๋ฆ„์ด ์—ญ์ „ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด์ƒ์„ฑX, IoC์ปจํ…Œ์ด๋„ˆ์—์„œ ์ƒ์„ฑ ํ›„ ์ฃผ์ž…
์—ญํ•  ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์™ธ๋ถ€์— ์œ„์ž„ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…
๋ชฉ์   ์œ ์—ฐ์„ฑ, ํ™•์žฅ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์˜ ํ™•๋ณด ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ ํ™•๋ณด
์žฅ์  ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๊ด€๋ฆฌ๋ฅผ ์™ธ๋ถ€์— ์œ„์ž„ํ•จ์œผ๋กœ์จ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ์ œ๊ณต ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ด

 


 

Reference

https://velog.io/@think2wice/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

[Spring] ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์— ๋Œ€ํ•˜์—ฌ

Spring์˜ ์ค‘์š”ํ•œ ์›๋ฆฌ ์˜์กด์„ฑ ์ฃผ์ž…(DI)์ด ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

velog.io

https://ittrue.tistory.com/227

 

[Spring] ์Šคํ”„๋ง ์˜์กด์„ฑ ์ฃผ์ž…(DI : Dependency Injection) 4๊ฐ€์ง€ ๋ฐฉ๋ฒ• (์˜์กด ๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…)

์˜์กด์„ฑ ์ฃผ์ž…(DI : Dependency Injection) ๋ฐฉ๋ฒ• ์˜์กด์„ฑ ์ฃผ์ž…์—๋Š” 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž… ์ˆ˜์ •์ž ์ฃผ์ž… (setter ์ฃผ์ž…) ํ•„๋“œ ์ฃผ์ž… ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž… ์Šคํ”„๋ง ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•˜

ittrue.tistory.com

https://m42-orion.tistory.com/98

 

[Spring] ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ - ApplicationContext, IoC, DI

์ด ๊ธ€์€ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ๋“ค์„ ๊ธฐ๋กํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋‚˜ ๊ณ ์ณ์•ผ ํ•  ์‚ฌํ•ญ๋“ค์ด ์žˆ๋‹ค๋ฉด ์ง€์  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! 1. IoC๋ž€? 2. DI๋ž€? 3. ApplicationContext : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ž€? 4. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

m42-orion.tistory.com

https://lucas-owner.tistory.com/39

 

[Spring] Spring-Container, IoC, DI, Singleton ๊ฐœ๋… ์ •๋ฆฌ

๋ชฉ์ฐจ IoC ๋ž€? Spring Container (์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ) DI(Dependency Injection) ๋ž€? Singleton ํŒจํ„ด์ด๋ž€? IoC ๋ž€? IoC ๋ž€ Inversion Of Control์˜ ์•ฝ์ž์ด๋ฉฐ, ์ œ์–ด์˜ ์—ญ์ „ ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฃผ์ฒด๊ฐ€ ๋ฐ”๋€Œ

lucas-owner.tistory.com