DI ์ IoC ?
์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ค์ํ ๊ฐ๋ ์ค ํ๋์ด๋ฉฐ, 1. ์ฝ๋์ ์ ์ง๋ณด์์ฑ , 2. ํ ์คํธ ์ฉ์ด์ฑ , 3. ํ์ฅ์ฑ ์ ํฅ์์ํค๋๋ฐ ๋์์ด ๋๋ ์์น์ด๋ค.
IoC (Inversion of Control) ?
์ง์ญํ๋ฉด "์ ์ด์ ์ญ์ " ๊ณผ ๊ฐ๋ค.
- IoC๋ ์ํํธ์จ์ด ์ปดํฌ๋ํธ(ํด๋์ค, ๋ชจ๋)์ ์ ์ด๊ถ์ ํ๋ ์์ํฌ๋ ์ปจํ
์ด๋์ ๋๊ธฐ๋ ๊ฐ๋
์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ์ ์ด ํ๋ฆ์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ ์ปจํ ์ด๋๊ฐ ์ ์ดํ๋ฆ์ ์ ์ดํ๊ฒ ๋๋ค. - ์ด๋ฌํ ์ ์ด์ ์ญ์ ์ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ์ ์์กด์ฑ ํด๊ฒฐ์ ์๋ํํ๊ณ , ์ปดํฌ๋ํธ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ์ด ๋ ๋ชจ๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํ๋ค.
์ ๊ฐ๋ ๋ค์ ์๋ก ๋ค์๋ฉด ์๋์ ๊ฐ์ ์์๊ฐ ์๋ค.
IoC ์์
ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋๋ฅผ ์๊ฐํด๋ณด๋ฉด ๋๋ค.
controller / service ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋์์ ์ฐ๋ฆฌ๊ฐ ์ง์ ๊ตฌํํ๊ธฐ๋ ํ์ง๋ง,
ํด๋น ๊ฐ์ฒด๋ค์ด ์ด๋ ์์ ์ ํธ์ถ๋ ์ง๋ ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ์ฐ์ง ์๋๋ค.
๋จ์ง ํ๋ ์์ํฌ๊ฐ ์๊ตฌํ๋๋๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๋ฉด, ํ๋ ์์ํฌ๊ฐ ํด๋น ๊ฐ์ฒด๋ค์ ๊ฐ์ ธ๋ค๊ฐ ๊ฐ์ ์์ฑํ๊ณ , ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ์๋ฉธ์ํจ๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ํ๋ก๊ทธ๋จ์ ์ ์ด๊ถ์ด ์ญ์ ์ด ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐจ์ด์ ์ IoC๋ฅผ ํตํด์ ์ค๋ช ์ด ๊ฐ๋ฅํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ด ํ๋ฆ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด์ด์ฃผ์ง ์๋๋ค.
๊ทธ์ ๋จ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ ์์ ์ ์ฐ๋ฆฌ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฌ์ ์์ ๊ฐ์ ธ๋ค๊ฐ ์ธ ๋ฟ์ด๋ค.
๋ฐ๋ฉด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ๋, ์ดํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ์์ฑํ ๊ฐ์ฒด๋ค์ ํ๋ ์์ํฌ๊ฐ ํ์ํ ์์ ์ ๊ฐ์ ธ๋ค๊ฐ ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ์ ์ด๊ถ์ด ํ๋ ์์ํฌ๋ก ์ญ์ ๋๋ค.
IoC๋ฅผ ๋์ ํจ์ผ๋ก์จ ์ป์ด๋ผ ์ ์๋๊ฒ
- ํ๋ก๊ทธ๋จ์ ์งํ ํ๋ฆ๊ณผ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋ถ๋ฆฌ์ํฌ ์ ์๋ค.
- ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋ค.
- ๊ตฌํ์ฒด ์ฌ์ด์ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค.
- ๊ฐ์ฒด ๊ฐ ์์กด์ฑ์ด ๋ฎ์์ง๋ค.
DI (Dependency Injection) ?
์ง์ญํ๋ฉด "์์กด์ฑ ์ฃผ์ "
IoC๋ ํ๋ก๊ทธ๋จ์ ์ ์ด๊ถ์ ์ญ์ ์ํค๋ ๊ฐ๋ ์ด๊ณ , DI๋ ํด๋น ๊ฐ๋ ์ ์คํ์ํฌ ๋ ์ฌ์ฉํ๋ "๋์์ธ ํจํด"์ค ํ๋์ด๋ค.
๊ฐ์ฒด์ ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ์ํค๋ ๊ฒ์ ์๋ฏธํ๋ค.
IoC์ DI๋ ๋ค๋ฅธ๊ฐ๋ ์ด๋ค.
IoC์์ DI๊ฐ ํฌํจ๋ ์๋ ์์ผ๋ ์ ๋ ๋์ผ์ ํ๋ฉด ์๋๋ค.
DI๊ฐ ์์ด๋ IoC๋ฅผ ๋ง์กฑํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
์์กด์ฑ ?
public class A {
private B b = new B();
}
์์ ์ฝ๋์ด๋ค.
์ ์ฝ๋๋ A๊ฐ B์ ์์กดํ๊ณ ์๋ ์ฝ๋์ด๋ค.
์๋ฅผ ๋ค๋ฉด B๋ผ๋ ํด๋์ค์ final ํ๋๊ฐ ์ถ๊ฐ๊ฐ ๋๋ค๋ฉด new B() ๋ถ๋ถ์ ์ปดํ์ผ ์๋ฌ๊ฐ ์๊ธธ๊ฒ์ด๊ณ ์ด๋ B์ ๋ณํ์์๋ ๋ถ๊ตฌํ๊ณ A๊น์ง ์ํฅ์ ๋ฏธ์น๊ฒ ๋๋ค.
๋ฐ๋ผ์ B๊ฐ ๋ณํ๋ฉด A๋ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ "A๊ฐ B์ ์์กดํ๋ค" ๋ผ๊ณ ํ ์ ์๋ค.
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
์ด ์ฝ๋๋ ์ฌ์ ํ A๋ B์ ์์กด์ ํ๊ณ ์๊ณ , B๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ A๋ ์ํฅ์ ๋ฐ๊ฒ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฒ์๋ ์์กด๋์์ ์ง์ ์์ฑ(๊ฒฐ์ ) ํ๋ ๊ฒ์ด์๋๋ผ ์ธ๋ถ๋ก๋ถํฐ ์ฃผ์ ์ ๋ฐ๊ณ ์๋ค.
- ํด๋์ค ๋ชจ๋ธ์ด๋ ์ฝ๋์๋ ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ ๋๋ฌ๋์ง ์๋๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ธํฐํ์ด์ค๋ง ์์กดํ๊ณ ์์ด์ผ ํ๋ค. - ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ ์ปจํ ์ด๋๋ ํฉํ ๋ฆฌ ๊ฐ์ ์ 3์์ ์กด์ฌ๊ฐ ๊ฒฐ์ ํ๋ค.
- ์์กด๊ด๊ณ๋ ์ฌ์ฉํ ์ค๋ธ์ ํธ์ ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ์์ ์ ๊ณต(์ฃผ์ ) ํด์ค์ผ๋ก์จ ๋ง๋ค์ด์ง๋ค.
DI์ ๋ฐฉ๋ฒ 3๊ฐ์ง
1. ์์ฑ์ ์ฃผ์
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
2. ์ธํฐ ์ฃผ์
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
}
3. ์ธํฐํ์ด์ค ์ฃผ์
public interface BInjection {
void inject(B b);
}
public A implements BInjection {
private B b;
@Override
public void inject(B b) {
this.b = b;
}
}
DI์ ์ฅ์
- ์์กด์ฑ์ด ์ค์ด๋ค๊ฒ ๋๋ค. (๋ณ๊ฒฝ์ ์ทจ์ฝ์ ์ด ์ค์ด๋ ๋ค.)
- ๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋จ์ ํ ์คํธ๊ฐ ์ฌ์์ง๋ค.
- ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค.
- ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ค.
'CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CS] : ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ (0) | 2023.08.30 |
---|---|
[CS] : ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฐ์ด๋ ๋ฐ์ดํฐ ๋จ์ (0) | 2023.08.28 |
[CS] : TCP / UDP (0) | 2023.08.28 |
[CS] : ๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ (0) | 2023.08.24 |