Spring์ ๋ํด ์ฒ์ ๊ณต๋ถํ๋ ์ฌ๋์ด ์ ๋ฆฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค. ์ค๊ฐ๋ ๋ฑ ์๋ชป๋ ๋ถ๋ถ์ด ์์ ๊ฒฝ์ฐ ๋๊ธ๋ก ๊ฐ๊ฐ์์ด ์ง์ ํด์ฃผ์ธ์! ํ์ธํ๋ ๋๋ก ์ ํํ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐํด ๋น ๋ฅด๊ฒ ์์ ํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฐ์
์ด๋ฒ Spring Boot ์คํฐ๋๋ ๋ฐฐ๋ฌ์ ๋ฏผ์กฑ์ ๊น์ํ๋๊ป์ ์ธํ๋ฐ์ ์ฌ๋ ค์ฃผ์๋ ์๋ฐ ์คํ๋ง ์์ ์ ๋ณต ์๋ฆฌ์ฆ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์งํํ๋ค. ๊ทธ ์๋ฆฌ์ฆ์ ๊ฐ์ฅ ์ฒซ ๊ฐ์์ธ ์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์ ์ ๋๋ด๊ณ , ๋ค์ ๊ฐ์์ธ ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ IoC, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ์จ๋ณด๋๋ก ํ๊ฒ ๋ค.
๋ฌธ์ ์ธ์
์ ํฌ์คํธ์์ ๋คํ์ฑ๋ง์ผ๋ก๋ SOLID๋ฅผ ์งํฌ ์ ์๋ค๋ ์ฌ์ค์ ํ์ธํ๋ค. ํนํ, ๊ทธ ์ค์์ OCP์ DIP๋ฅผ ์งํฌ ์ ์์์ ์ ์ ์์๋ค. ๋ค์ ํ๋ฒ ๋ ๊ฐ๋จํ ์์ ๋ฅผ ๊ฐ์ ธ์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
public class DriverA implements Driver {
private Car driverACar = new Sonata();
}
์ด์ ์ ์ญํ ์ ๊ตฌํํ๋ DriverA
ํด๋์ค์์, ์๋์ฐจ ์ญํ ์ ๊ตฌํํ๋ Sonata
๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ํ์ฌ OCP์ DIP๋ฅผ ์๋ฐํ๋ ๊ฐ์ฅ ํฐ ์ํ์ DriverA
๋ด๋ถ์์ Sonata
๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ ์์์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํด์ผ๋ง SOLID๋ฅผ ๋ง์กฑ ํ ์ ์์ ๊ฒ์ด๋ค.
ํด๊ฒฐ
์ผ๋จ DIP๋ถํฐ ์ง์ผ๋ณด์
DIP ์๋ฐ์ ๋จผ์ ํด๊ฒฐํด๋ณด์. DIP๋ฅผ ๋ง์กฑํ๋ ค๋ฉด ์ผ๋จ ๊ตฌ์ฒด์ ๊ตฌํ์ด ์๋๋ผ ์ถ์์๋ง ์์กดํ๋๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค. ์ฆ, ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๋ ๊ฒ์ด ์๋๋ผ ์ธํฐํ์ด์ค์๋ง ์์กดํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋ ๊ฒ์ด๋ค.
public class DriverA implements Driver {
private Car driverACar;
}
์ด๋ผ? ํ์ง๋ง ์ด ์ฝ๋๋ ๋น์ฐํ ์คํํ ์ ์๋ค. ๊ตฌํ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์น ์ด์ ํ๋ ์์ธ๋ก DriverA
ํผ์์ ์ค์ฟผํธ๋ฅผ ํ๊ณ ์๋ ๊ฒ๊ณผ ๊ฐ๋ฌ๊น. ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น?
ํ โฆ ๋๊ตฐ๊ฐ ์ด DriverA
์๊ฒ Sonata
๋ฅผ ๊ฐ๋ค์ฃผ๋ฉด ์ด๋จ๊น?
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
์ดํ๋ฆฌ์ผ์ด์ ์ ํด๋ฆฌ ํฌํฐ ์ํ๋ผ๊ณ ์๊ฐํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ๋ฐฐ์ญ(ํด๋ฆฌ, ๋ก , ํค๋ฅด๋ฏธ์จ๋ ๋ฑ)์ ๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ผ๊ณ ์๊ฐํ์. ๊ทธ๋ผ ์ด ํด๋ฆฌ๋ผ๋ ๋ฐฐ์ญ์ ๋ค๋์ ๋๋ํด๋ฆฌํ์๊ฒ, ๋ก ์ ๋ฃจํผํธ ๊ทธ๋ฆฐํธ์๊ฒ, ํค๋ฅด๋ฏธ์จ๋๋ ์ ๋ง ์์จ์๊ฒ ๋ฐฐ์ ํ๋ ์ฌ๋์ ๋๊ตฌ์ผ๊น? ๋ฌผ๋ก , ์ ๋ง ๋ง์ ๋ถ๋ค์ด ๊ณ ์ฌ์ ํ์๊ฒ ์ง๋ง ๊ทธ ๋ถ๋ค์ ํตํ์ด์ ๊ธฐํ์ ์ ๋๋ก ์ ๋ฆฌํ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ์ด๋ฌํ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋ฐฐ์ ํด์ฃผ๋ ๊ธฐํ์๋ฅผ ๋ง๋ค์ด์ ๊ตฌ์ฒด ํด๋์ค์ ๋ฐฐ์ ์์ ๊ด์ฌ์ฌ๋ฅผ ํ์คํ ๋ถ๋ฆฌํ๋ฉด ์ด๋จ๊น?
์๋ฅผ ๋ค์ด, ์์ ์๋์ฐจ ํด๋์ค๋ฅผ ๊ธฐํ ํน์ ๊ตฌ์ฑํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด DriveConfig
๋ผ๋ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
public class DriveConfig {
public DriverA driverA() {
return new DriverA(new Sonata());
}
}
๊ทธ๋ฆฌ๊ณ , DriverA
๋ ์ด๋ค ์๋์ฐจ๋ ๋ฐ์ ์ ์๊ฒ ์์ฑ์๋ฅผ ์กฐ๊ธ ๋ฐ๊ฟ์ฃผ์.
public class DriverA implements Driver {
public DriverA(Car car) {
this.car = car;
}
private Car car;
}
์, ์ด๋ค๊ฐ? DriverA
๋ ์๋ฒฝํ Car
๋ผ๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ณ ์๊ณ , ์ด๋ค ์ฐจ(Sonata
, TeslaModel3
๋ฑ)๊ฐ ๋ค์ด์ฌ์ง ์ ์ ์๋ค. ๋ฐ๋ผ์ DriverA
๋ ์์กด ๊ด๊ณ์ ๋ํ ๊ณ ๋ฏผ์ DriveConfig
๋ผ๋ ๊ตฌ์ฑ ํด๋์ค์ ๋งก๊ธฐ๊ณ , ์์ ์ ๊ตฌํ๊ณผ ์คํ์๋ง ์ง์คํ ์ ์๋ค. ์ฌ์ง์ด, ์ธํฐํ์ด์ค๊ฐ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ Car
๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ ํด๋์ค๋ผ๋ฉด ๋ฌด์์ด๋ ์ง DriverA
๊ฐ ์ฌ์ฉํ ์ ์๋ค.
DIP๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ , ๋์์ OCP๋ ํด๊ฒฐ๋์๋ค. ์ด์ ์๋ก์ด ์๋์ฐจ G90
์ ๊ฐ๋ฐํ๋๋ผ๋, DriverA
์ ์ฝ๋๋ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ฌผ๋ก , ๊ตฌ์ฑ์ ํ๋ DriveConfig
๋ ๋ณ๊ฒฝ์ด ๋๊ฒ ์ง๋ง, ์ค์ ๋ก ์๋์ฐจ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ ์์ญ์ธ DriverA
์ ์ฝ๋๋ ์ ํ ๋ณํ์ง ์๋๋ค.
์ด๋ก์จ, ๋คํ์ฑ์ ํตํด SOLID๋ฅผ ๋ฌ์ฑํ๋ค.
์๋ DI ๋งํ๋ค๋ฉฐ
๋๋ฌด ์์ฐ์ค๋ฌ์์ ๋์น๋ฅผ ์ฑ์ง ๋ชปํ์ ๋ถ๋ค๋, ์๋๋ฉด ์ ์ง์์ ๋์น๋ฅผ ์ฑ์ ๋ถ๋ค๋ ์์ ๊ฒ์ด๋ค. ์, ์์ ์ฝ๋๋ฅผ ๋ค์ ๋ณด์.
public class DriverA implements Driver {
public DriverA(Car car) {
this.car = car;
}
private Car car;
}
public class DriveConfig {
public DriverA driverA() {
return new DriverA(new Sonata());
}
}
์ง๊ธ DriveConfig
์์ DriverA
์๊ฒ Sonata
๋ฅผ ์์ฑํด์ ๋ฃ์ด์ฃผ๊ณ , ๋ค๋ฅธ ๋ง๋ก ์ฃผ์
ํ๊ณ ์๋ค.
์, ๋ค์, DriverA
๊ฐ ์์กดํ๋ Car
์ ๊ตฌํ์ฒด์ธ Sonata
๋ฅผ ์ฃผ์
ํ๊ณ ์๋ค. ์ด๋ ๊ฒ, ํ์ํ ์์กด ๊ด๊ณ์ ์๋ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ฃผ์
ํด์ค๋ค๊ณ ํด์ ์ด๋ฅผ ์์กด ๊ด๊ณ ์ฃผ์
, ์์กด์ฑ ์ฃผ์
, ๊ทธ๋ฆฌ๊ณ ์์ด๋ก๋ Dependency Injection ๋ค์ ์ค์ฌ์ DI๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์ฒญ ์ด๋ ค์ด ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํด์ ๊ฒ์ ์๋ฉ ๋จน์์๋๋ฐ, ์๊ฐ๋ณด๋ค ์ดํดํ ๋ง ํ๊ณ , ๊ทธ ๋๊ธฐ๋ ํฌ๊ฒ ์ดํด๊ฐ ๋์๋ค.
IoC, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋
์ ์ด์ ์ญ์
Java๋ C ์ธ์ด๋ก ํ๋ก๊ทธ๋๋ฐ์ด๋ ์ฝ๋ฉ์ ์ฒ์ ๋ฐฐ์ฐ๋ฉด, ๋๊ฐ main ํจ์๋ผ๋ ๊ฒ์ ํตํด์ ํ๋ก๊ทธ๋จ์ ์คํํจ์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ๋ ํ๊ณ , ์ฌ์ฉํ๊ธฐ๋ ํ๋ฉฐ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ์ ํตํด์ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ์ฐ๋ฆฌ, ์ฆ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ดํ๋ค.
๋น์ฐํ ๊ฒ์ด๋ค. ํ๋ก๊ทธ๋จ์ ๋ด๊ฐ ์ง ๋๋ก ์์ง์ด๋๊น.
ํ์ง๋ง, ์์ DriveConfig
๋ฑ์ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ๋ณด๋ฉด ์ด์ ๊ตฌํ ๊ฐ์ฒด์ธ DriverA
์ Sonata
๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง ๋ด๋นํ ๋ฟ, ์ค์ ๋ก ์ฃผ๋์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ๊ฐ์ง์ง ์๋๋ค๋ ์ฌ์ค์ ์ ์ ์๋ค. ๋ง์น, DriverA
๋ Car
๋ผ๋ ์ธํฐํ์ด์ค๋ ์๊ณ ์์ง๋ง, ๋๋์ฒด ์ด๋ค ์๋์ฐจ๊ฐ ์คํ๋ ์ง๋ ๋ชจ๋ฅด๋ ๊ฒ์ฒ๋ผ ๋ง์ด๋ค.
ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ๋ํ ๊ถํ์ ๋ชจ๋ DriveConfig
๊ฐ ๊ฐ์ง๊ณ ์๋ค. ์ฌ์ง์ด, DriverA
์ ์ธ์คํด์ค ๋ํ DriveConfig
๊ฐ ์์ฑํ๋ค. ๋ํ ์ด ์์ฑ ์์ Sonata
๊ฐ ๋์ด์ค๋์ง, TeslaModel3
๊ฐ ๋์ด์ค๋์ง ์ด DriverA
๋ ์ ํ ์ธ์งํ์ง ๋ชปํ๋ค. ๊ทธ์ , ์ด์ ์ ํ (์์ ์ ๋ก์ง์ ์ํํ ) ๋ฟ์ด๋ค.
์ด๋ ๊ฒ, ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ๊ตฌํ ๊ฐ์ฒด์์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ **์ ์ด์ ์ญ์ (Inversion Of Control, IoC)**์ด๋ผ ํ๋ค.
์ปจํ ์ด๋
์ด๋ฐ DriveConfig
์ฒ๋ผ, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ, ๋๋ ์ด ๊ธฐ์ ์ IoC ์ปจํ
์ด๋ ๋๋ DI ์ปจํ
์ด๋๋ผ ํ๋ค. ์ต๊ทผ์๋ ์์กด ๊ด๊ณ ์ฃผ์
์ ํฌ์ปค์ค๊ฐ ๋ง์ถ์ด์ ธ ์์ด์ ์ฃผ๋ก DI ์ปจํ
์ด๋๋ผ๋ ๋ช
์นญ์ผ๋ก ๋ ์์ฃผ ๋ถ๋ฅด๊ณค ํ๋ค.
๋ ๋ค๋ฅธ ๋ช
์นญ์ผ๋ก๋, ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ๋ค๊ณ ํด์ ์ด์
๋ธ๋ฌ, ํน์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ์ค๋ธ์ ํธ ํฉํ ๋ฆฌ ๋ฑ์ผ๋ก ๋ถ๋ฅด๊ธฐ๋ ํ๋ค. Spring ์์๋ BeanFactory
, ApplicationContext
๊ฐ ์ด ์ญํ ์ ๋ด๋นํ๊ณ ์๋ค.
๋ค์์
์ด ๋ด์ฉ์ ๊ฐ์์์ ๋ฐฐ์ฐ๋ฉด์, ์ ๋ง ๊ฐ์ด์ด ๋๊ทผ๊ฑฐ๋ฆฌ๋(?) ๊ฒฝํ์ ํ๋ค. ์ด๋ ๊ฒ ์คํ ๋ฆฌํ ๋ง ํํํ๊ฒ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์๋ณธ ๊ฒฝํ์ด ์์ด์ ๋ ๊ทธ๋ฌ๋ ๊ฒ ๊ฐ๋ค.
๋ค์ ํฌ์คํธ์์๋ Spring ์ปจํ ์ด๋์ Spring ๋น์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ๋ค.
๋.