[Spring] Spring Framework + IoC์ DI
๐ข ์คํ๋ง? ์งง๊ฒ ํ ๋ง๋!
Spring Framework๋ฅผ ์งง๊ฒ ํ ๋ง๋๋ก ์ ์ํ๋ฉด ์๋์ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
์๋ฐ ์ํฐํ๋ผ์ด์ฆ ๊ฐ๋ฐ์ ํธํ๊ฒ ํด์ฃผ๋ ์คํ์์ค ๊ฒฝ๋๊ธ ์ ํ๋ฆฌ์ผ์ด์
Spring์ ๋ค์ํ ๋ชจ๋(beans, JDBC ๋ฑ)๊ณผ ํ๋ก์ ํธ(Boot, Security ๋ฑ)๋ฅผ ์ง์ํจ์ ํตํด์ ๊ฐ๋ฐ์๊ฐ ์ข ๋ ๋น์ง๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋๋ก ํด์ฃผ๋ ํ๋ ์์ํฌ๋ค. ์ฆ, ๊ฐ๋ฐ์๋ก ํ์ฌ๊ธ ๋น๊ธฐ๋ฅ์ ์๊ตฌ์ฌํญ๋ค์ ๊ฐ๋ฐํ ๋, ํ์ํ ์ธํ๋ผ๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ ํ๋ฉด์ ์ผ๋ก ๋ณด์ด๋ ์ผ๋ถ๋ง์ ํํํ ๋ด์ฉ์ด๊ณ , ๊น๊ฒ ๋ค์ด๊ฐ๋ฉด ๋ ๋ง์ ํธ์๋ฅผ ์ ๊ณตํ๋ค.
๐Spring์ ํต์ฌ!
Spring์ ํต์ฌ ๊ฐ๋ ์ DI, AOP, PSA, POJO ์ด 4๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์ค๋์ ์ด ์ค DI์ ๋ํด์ ์งค๋งํ๊ฒ ์ค๋ช ํ๋ ค๊ณ ํ๋ค. ๋ํ, DIํ๋ฉด ๋น ์ง ์ ์๋ ๊ฐ๋ ์ด IoC(์ ์ด์ ์ญ์ )์ธ๋ฐ ํด๋น ๊ฐ๋ ๋ ํจ๊ป ๋ค๋ฃจ๊ณ ๋์ด๊ฐ๋ ค๊ณ ํ๋ค.
๐คIoC (Inversion of Control) - ์ ์ด์ ์ญ์ ์ด ๋ญ์ผ???
์ ์ด์ ์ญ์ ์ ์ผ๋จ ํ๊ธํ์ด ๊ทธ๋๋ก ์ด๋ ํ ์ ์ด(ํต์ ๊ถ)๊ฐ ์ญ์ ๋์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ ์์ ์ธ ํ๋ฆ์ ๋ค์ง์ด๋์ ๊ฒ์ด๋ผ ํ ์ ์๋ค. ์ฐ๋ฆฌ๋ ๋ฐฑ์ค ๊ฐ์ ํํ์ด์ง์์ ์๊ณ ๋ฆฌ์ฆ์ ์ง๊ฑฐ๋ ์ด๋ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ง์ ๊ตฌํํด๋ณผ ๋๋ฅผ ๋จผ์ ์๊ฐํด๋ณผ ๊ฒ์ด๋ค.
๋จผ์ , ํ์ํ ๊ฐ์ฒด๋ค์ ์์ฑํด์ค ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๊ฐ์ฒด๋ณ๋ก ๊ด๊ณ ์ค์ ์ด ํ์ํ ๊ฐ์ฒด๋ผ๋ฆฌ ํจ๊ป ๋ฌถ์ด์ค ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ค๊ณํ ์์ค์ฝ๋๋ฅผ Java Application์ ํตํด์ ์คํ์ํค๊ณ ์ ํ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ์ ์์ ์ธ ํ๋ฆ์ด๋ค. ์ฆ, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๋ฑ ์ฝ๋์ ์ ์ด๊ถ์ ๊ฐ๋ฐ์๊ฐ ๊ฐ๊ณ Application์ ์ด๋ฅผ ์คํ์ํฌ ๋ฟ์ด๋ค.
์, ๊ทธ๋ผ ์ด์ ๋ฐ๋๋ก ์๊ฐํด๋ณด๋ ค๊ณ ํ๋ค. ์ ์ด์ '์ญ์ '์ด๋๊น ๋ง์ด๋ค. Application์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๊ณ๋ฅผ ์ค์ ํด์ฃผ๊ณ ๊ฐ๋ฐ์๋ ์์ฑ๋ ๊ฐ์ฒด์ ์ค์ ๋ ๊ฐ์ฒด ๊ด๊ณ ๋ฑ์ ํตํด์ ๋น์ง๋์ค ๋ก์ง์ ์ค๊ณํ๋ฉด ๋๋ค. ์ฆ, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๋ฑ ์ฝ๋์ ์ ์ด๊ถ์ Application์ด ๊ฐ๊ณ ๊ฐ๋ฐ์๋ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์ค๊ณํ๊ณ ์คํ์ํฌ ๋ฟ์ด๋ค.
์ด๊ฒ IoC ๊ฐ๋
์ ๋์ด๋ค. ๋ฌผ๋ก ๋ ์์ธํ ํ๊ณ ๋ค๋ฉด ๋๋ ์๊ฒ ์ง๋ง.. ๋ด๊ฐ ์ดํดํ ๋ฐ๋ ์ฌ๊ธฐ๊น์ง๋ค. ๊ทธ๋ ๋ค๋ฉด Spring์์๋ ๋๊ฐ Application์ฒ๋ผ ๋ค ๋ง๋ค์ด์ฃผ๊ณ ๋ค ๊ด๊ณ ๋งบ์ด์ฃผ๊ณ ํ๋ ๊ฑธ๊น? ๋ฐ๋ก Bean Factory์ Application Context๋ผ๋ ์น๊ตฌ์ด๋ค. ๊ฐ๋จํ๊ฒ ๋ณด๋ฉด ๋์ ๊ฐ์ ์ญํ ์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. Bean Factory๋ฅผ ์์๋ฐ์์ ๊ตฌํ๋ ์ธํฐํ์ด์ค๊ฐ Application Context๋ผ๋ ์ธํฐํ์ด์ค์ด๋๊น. ์ฐจ์ด์ ์ด ์กด์ฌํ๊ธด ํ์ง๋ง IoC์ ํต์ฌ์ธ ๊ฐ์ฒด ์์ฑ๊ณผ ๊ด๊ณ ๋งคํ ๋ฑ์ Bean Factory์์๋ถํฐ ์ ์๋์ด ์๊ณ , ํด๋น ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ค.
(Application Context๋ Bean Factory์ ๋นํด ํ๋ ์ญํ ์ด ์ข ๋ ๋ง์ ๋ฟ์ด๋ค. ์๋ฅผ ๋ค๋ฉด, ํตํฉ ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ ๋ฑ์ ์ญํ ์ ์ถ๊ฐ์ ์ผ๋ก ์ํํ๋ค.)
์ฌ๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก ํํ๋ค ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐจ์ด์ ์ ๊ถ๊ธํดํ๋ค. ์ด ์ญ์ ๊ฐ๋จํ ๋งํ๋ฉด IoC์ ํน์ง์ ๊ฐ๊ณ ์๋ค๋ฉด ํ๋ ์์ํฌ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ด์ ๊ด๋ จํด์ ๋ ์์ธํ ๋ด์ฉ์ ์ถํ ์ ๋ฆฌํ๋๋ก ํ๊ฒ ๋ค.
๐โ๏ธ์ ๊ธฐ.. ๊ทธ๋ผ DI๋ ๋ญ๊ฐ์?
์, ๊ทธ๋ผ ์ด์ DI๋ฅผ ์ดํด๋ณด์. Spring์ ๋ํด์ ๋งํ๋ฉด ํญ์ ๋ฐ๋ผ์ค๋ ๊ฐ๋ ์ด DI.. ์ฆ, ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ค. ์ผ๋จ, DI๋ ์์ ๋งํ IoC ๊ฐ๋ ์ Spring ๋ด์์ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํํ ๊ฐ๋ ์ ์๋ฏธํ๋ค. ๊ทธ๋ ๋ค๋ฉด DI๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๊ฐ๋ ์ผ๊น?
DI๋ ์ค๋ธ์ ํธ ๋ ํผ๋ฐ์ค๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ์ ๊ณต๋ฐ๊ณ ์ด๋ฅผ ํตํด ๋ค์ด๋๋ฏนํ ์์กด๊ด๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ์ข ๋ ์ฝ๊ฒ ํ์ด์ฐ๋ฉด, ์ 3์ ์กด์ฌ๋ฅผ ํตํด์ ๋ฐํ์ ์ด์ , ์ฆ, ์ค๊ณ ์์ ์๋ ์์ง ๋ชปํ๋ ๋ ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ๋งบ๋๋ก ๋์์ฃผ๋ ๊ฒ์ด๋ค.
DI๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด์ ์ด 3๊ฐ์ง์ ์กฐ๊ฑด์ด ์๋ค.
- ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๊ฐ ๋๋ฌ๋์ง ์์์ผ ํ๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ณ ์์ด์ผ ํ๋ค.
- ๋ฐํ์ ์์ ์ ์์กด๊ด๊ณ๋ ์ปจํ ์ด๋๋ ํฉํ ๋ฆฌ ๊ฐ์ ์ 3์ ์กด์ฌ๊ฐ ๊ฒฐ์ ํ๋ค.
- ์์กด๊ด๊ณ๋ ์ฌ์ฉํ ๊ฐ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ์ธ๋ถ์์ ์ ๊ณตํด์ค์ผ๋ก์จ ๋ง๋ค์ด์ง๋ค.
์์ 3๊ฐ์ง๊ฐ ๋ชจ๋ ์ง์ผ์ ธ์ผ DI๋ผ๊ณ ๋งํ ์ ์๊ฒ ๋ค. ํ์ง๋ง.. ์ด๋ ๊ฒ ์ค๋ช ํ๋ฉด ๋๋ฌด ์ด๋ ต๋ค. Spring์ ๋ฐฐ์ฐ๋ ์ด๋ฐ์๋ ์ ๋ง x 10 ๊ฐ๋จํ๊ฒ ์๋์ ๊ฐ์ด ์๊ณ ์์ผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
----------------DI๋ฅผ ์ฒ์ ์ ํ ์ฌ๋ ๊ธฐ์ค ์ค๋ช ์ ์ฌ๊ธฐ๋ถํฐ ์ฝ์ด์ฃผ์ธ์!-----------------
A๋ผ๋ ๊ฐ์ฒด๊ฐ B๋ผ๋ ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ํ์๋ก ํ๋๋ฐ, A์ ์ง์ ์ ์ผ๋ก B๋ฅผ ์์ฑํ๋ฉด ์ ๋๋ค๊ณ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด A์ B์ ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ๋๊ฒจ์ผ ํ๋ ๊ฑธ๊น? ๋ฐ๋ก, ํ๋ผ๋ฏธํฐ๋ค. A๋ฅผ ์์ฑํ ๋, ํน์ A ๊ฐ์ฒด ๋ด์์ ๋์ํ๋ ํน์ ๋ฉ์๋๊ฐ B๋ฅผ ํ์๋ก ํ ๋, ํ๋ผ๋ฏธํฐ์ B ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
class A {
public A(B b) {
System.out.println(b.getName());
}
}
class B {
private name = "example";
public String getName() {
return this.name;
}
}
์ ๋ง ๊ฐ๋จํ๊ฒ ๊ตฌํํ๋ฉด ์์ ๊ฐ์ ๋๋์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ๋จ, ์ ์ฝ๋๋ ์ฌ์ค DI ๋ณด๊ธฐ๋ ์ด๋ ต๋ค. B ๊ฐ์ฒด๊ฐ ์ง์ ์ ์ผ๋ก ํ๋ผ๋ฏธํฐ์ ์ฐ์๊ธฐ ๋๋ฌธ์! ๊ทธ๋์ ํ์ํ ๊ฒ์ด Interface๋ค.
class A {
public A(C b) {
System.out.println(b.getName());
}
}
class B implements C {
private name = "example";
public String getName() {
return this.name;
}
}
interface C {
}
์์ ๊ฐ์ด A ๊ฐ์ฒด๋ฅผ ๊ตฌํํ ๋, C๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋๋ฐ, B๋ C๋ฅผ ์์ํ๋ ๊ตฌํ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ์ ๋ค์ด๊ฐ ์ ์๋ค. ๊ทธ๋ผ A๋ B๋ผ๋ ๊ฐ์ฒด์ ๋ํด์ ์ ํ ์์ง ๋ชปํ์ง๋ง B์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์์ฌ ์ ์๊ฒ ๋๋ค.
์ด๊ฒ ๋ฐ๋ก DI์ ๊ฐ์ฅ ๊ธฐ์ด๊ฐ ๋๋ ๋ด์ฉ์ด๋ค.
์ค๋์ ์ฌ๊ธฐ๊น์ง ๊ธฐ๋กํ๊ฒ ๋ค. (๋ ์ ์ผ๋ฉด ๋ด ์ง์์ด ํ๋ก ๋ ๊ฒ ๊ฐ์์๋ผ๊ณ ํ ๋ป ใ
ใ
)
๋ง์ ๋ถ๋ค์ด IoC๋ DI์ ๋ํด์ ์ข ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค. ๋ฌผ๋ก ๋๋ ๋ ์์ธํ ์๊ธฐ ์ํด ๊ณต๋ถ๊ฐ ํ์ํ๋ค..
ํน์ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์๊ณ ๊ณ์๋ ๋ถ์ ๋๊ธ์ ๋ฌ์์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๐