1๏ธโฃ ์ ์ด์ ์ญ์
IoC, Inversion of Control
- ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ํด๋ผ์ด์ธํธ ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ํ์ํ ์๋ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ (new๋ก ์ง์ ์์ฑ), ์ฐ๊ฒฐํ๊ณ , ์คํํ๋ค.
- ๋ฐ๋ฉด์ AppConfig๊ฐ ๋ฑ์ฅํ ์ดํ์ ๊ตฌํ ๊ฐ์ฒด๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง ๋ด๋นํ๋ค. ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ AppConfig๊ฐ ๊ฐ์ ธ๊ฐ ๊ฒ์ด๋ค.
- ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ํ์ํ ์ธํฐํ์ด์ค๋ค์ ํธ์ถํ์ง๋ง ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๊ฐ ์คํ๋ ์ง๋ ๋ชจ๋ฅธ๋ค.
- ํ๋ก๊ทธ๋จ์ ๋ํ ์ ์ด ํ๋ฆ์ ๋ชจ๋ AppConfig๊ฐ ๊ฐ์ง๊ณ ์๊ฒ ๋๋ค.
- ์ด๋ ๋ฏ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด์ ์ญ์ ์ด๋ผ ํ๋ค.
This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) principle. IoC is also known as dependency injection (DI). It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method.
์ด ์ฑํฐ์์๋ ์คํ๋ง ํ๋ ์์ํฌ์ Inversion of Control(IoC) ์์น ๊ตฌํ์ ๋ํด ์ค๋ช ํฉ๋๋ค. IoC๋ ๊ฐ์ฒด๊ฐ ์์ ์ ์ข ์์ฑ(ํจ๊ป ์๋ํ๋ ๋ค๋ฅธ ๊ฐ์ฒด)์ ๋ค์์ ๋ฐฉ๋ฒ๋ค์ ํตํด์๋ง ์ ์ํ๋ ํ๋ก์ธ์ค์ ๋๋ค
โก๏ธ ์์ฑ์ ์ธ์, ํฉํ ๋ฆฌ ๋ฉ์๋์ ์ธ์, ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๋์, ๋๋ ํฉํ ๋ฆฌ ๋ฉ์๋์์ ๋ฆฌํด๋๊ณ ๋์ ์ค์ ๋ ํ๋กํผํฐ - Spring Framework์ Core ๋ฌธ์
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.
Spring์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ถ๋ฅผ ์ด๋ฃจ๊ณ Spring IoC ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด๋ค์ Bean ์ด๋ผ ๋ถ๋ฆ ๋๋ค. Bean์ Spring IoC ์ปจํ ์ด๋๊ฐ ์ธ์คํด์ค๋ก ๋ง๋ค๊ณ , ์กฐ๋ฆฝํ๊ณ , ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ ๋๋ค. ํํธ์ผ๋ก๋, Bean์ ๋น์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ ์๋ง์ ๊ฐ์ฒด๋ค ์ค ํ๋์ผ ๋ฟ์ด๊ธฐ๋ ํฉ๋๋ค. Bean๊ณผ Bean๋ค ์ฌ์ด์ ์ข ์์ฑ์ ์ปจํ ์ด๋๊ฐ ์ฌ์ฉํ๋ configuration metadata์์ ๋ฐ์๋ฉ๋๋ค.
2๏ธโฃ ํ๋ ์์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํ๋ ์์ํฌ๊ฐ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ์ดํ๊ณ , ๋์ ์คํํ๋ฉด ๊ทธ๊ฑด ํ๋ ์์ํฌ๋ค (JUnit)
- ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ์ ์ด์ ํ๋ฆ์ ๋ด๋นํ๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
The major difference between an object-oriented framework and a class library is that the framework calls the application code. Normally the application code calls the class library. This inversion of control is sometimes named the Hollywood principle, "Do not call us, we call You".
๊ฐ์ฒด์งํฅ ํ๋ ์์ํฌ์ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฐ ์ฐจ์ด์ ์ ํ๋ ์์ํฌ๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ ํธ์ถํ๋ค๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๊ฐ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ฌํ ์ ์ด์ ์ญ์ (inversion of control)์ ๋๋๋ก ํ๋ฆฌ์ฐ๋ ์์น์ด๋ผ๊ณ ๋ ํฉ๋๋ค. "์ฐ๋ฆฌ์๊ฒ ์ ํ(call)ํ์ง ๋ง์ธ์. ์ฐ๋ฆฌ๊ฐ ๋น์ ์ ๋ถ๋ฅผ(call) ๊ฒ์
๋๋ค" - Michael Mattson์ ๋
ผ๋ฌธ Conclusions (98์ชฝ)
3๏ธโฃ ์์กด๊ด๊ณ ์ฃผ์
DI, Dependency Injection
- ์์กด๊ด๊ณ๋ ์ ์ ์ธ ํด๋์ค ์์กด ๊ด๊ณ์, ์คํ ์์ ์ ๊ฒฐ์ ๋๋ ๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด ๊ด๊ณ๋ฅผ ๋ถ๋ฆฌํด์ ์๊ฐํด์ผ ํ๋ค.
- ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ ํด๋์ค๊ฐ ์ฌ์ฉํ๋ import ์ฝ๋๋ง ๋ณด๊ณ ๋ ํ๋จํ ์ ์๋ค. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์์๋ ๋ถ์ํ ์ ์๋ค. ํ์ง๋ง ์ด๋ฌํ ํด๋์ค ์์กด๊ด๊ณ๋ง์ผ๋ก๋ ์ค์ ๋ก ์ด๋ค ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค์ ์ฃผ์ ๋ ์ง ์ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ ๋๋ ๊ฒ์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ค.
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ๋ ๋์์ ํ์ ์ธ์คํด์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
ํ ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ ๊ฒ์ ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ IoC๋ผ๋ ์ฉ์ด์ธ๋ฐ, IoC๊ฐ ๋งค์ฐ ๋์จํ๊ฒ ์ ์๋ผ์ ํญ๋๊ฒ ์ฌ์ฉ๋๋ ์ฉ์ด๋ผ๋ ์ ์ด๋ค. ๋๋ฌธ์ ์คํ๋ง์ IoC ์ปจํ ์ด๋๋ผ๊ณ ๋ง ํด์๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ํน์ง์ ๋ช ํํ๊ฒ ์ค๋ช ํ์ง ๋ชปํ๋ค. ์คํ๋ง์ด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ฒ๋ผ ์๋ฒ์์ ๋์ํ๋ ์๋น์ค ์ปจํ ์ด๋๋ผ๋ ๋ป์ธ์ง, ์๋๋ฉด ๋จ์ํ IoC ๊ฐ๋ ์ด ์ ์ฉ๋ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ด์ฉํด ๋ง๋ค์ด์ง ํ๋ ์์ํฌ์ธ์ง, ์๋๋ฉด ๋ ๋ค๋ฅธ IoC ํน์ง์ ์ง๋ ๊ธฐ์ ์ด๋ผ๋ ๊ฒ์ธ์ง ํ์ ํ๊ธฐ ํ๋ค๋ค. ๊ทธ๋์ ์๋ก์ด ์ฉ์ด๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ์ฌ๋ฅ์ด ์๋ ๋ช๋ช ์ฌ๋์ ์ ์์ผ๋ก ์คํ๋ง์ด ์ ๊ณตํ๋ IoC ๋ฐฉ์์ ํต์ฌ์ ์ง์ด์ฃผ๋ ์์กด๊ด๊ณ ์ฃผ์ (Dependency Injection)์ด๋ผ๋, ์ข ๋ ์๋๊ฐ ๋ช ํํ ๋๋ฌ๋๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ค. ์คํ๋ง IoC ๊ธฐ๋ฅ์ ๋ํ์ ์ธ ๋์์๋ฆฌ๋ ์ฃผ๋ก ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ๋ฌผ๋ก ์คํ๋ง์ด ์ปจํ ์ด๋์ด๊ณ ํ๋ ์์ํฌ์ด๋ ๊ธฐ๋ณธ์ ์ธ ๋์์๋ฆฌ๊ฐ ๋ชจ๋ IoC ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์์ง๋ง, ์คํ๋ง์ด ์ฌํ ํ๋ ์์ํฌ์ ์ฐจ๋ณํ๋ผ์ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๋ ์๋ก์ด ์ฉ์ด๋ฅผ ์ฌ์ฉํ ๋ ๋ถ๋ช ํ๊ฒ ๋๋ฌ๋๋ค. ๊ทธ๋์ ์ด๊ธฐ์๋ ์ฃผ๋ก IoC ์ปจํ ์ด๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ์คํ๋ง์ด ์ง๊ธ์ ์์กด๊ด๊ณ ์ฃผ์ ์ปจํ ์ด๋ ๋๋ ๊ทธ ์๋ฌธ์ฝ์๋ฅผ ์จ์ DI ์ปจํ ์ด๋๋ผ๊ณ ๋ ๋ง์ด ๋ถ๋ฆฌ๊ณ ์๋ค
- ํ ๋น์ ์คํ๋ง 3.1 vol 1. 1.7.2์ฅ. 111์ชฝ.
4๏ธโฃ IoC / DI ์ปจํ ์ด๋
- AppConfig์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ IoC ์ปจํ ์ด๋ ํน์ DI ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค.
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ด์ ์ ๋ง์ถ์ด ์ต๊ทผ์๋ ์ฃผ๋ก DI ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค.
- ์ด์ ๋ธ๋ฌ, ์ค๋ธ์ ํธ ํฉํ ๋ฆฌ ๋ฑ์ผ๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
๊ฒฐ๋ก
- ์ ์ด์ ์ญ์
- ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ -> ํ๋ ์ ์ํฌ๋ ์ ์ด์ ์ญ์ ์ด ์ ์ฉ ๋ ๊ฒ.
- Spring์์๋ ๊ฐ์ฒด๊ฐ ์์ ์ ์ข ์์ฑ์ ์์ฑ์ ์ธ์, ํฉํ ๋ฆฌ ๋ฉ์๋์ ์ธ์, Setter method ๋ก๋ง ์ ์ํ๋ ํ๋ก์ธ์ค๋ผ๊ณ ์ ์.
- ์์กด๊ด๊ณ ์ฃผ์
- ์คํ ์์ ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ.
- Spring์ด ์ ๊ณตํ๋ IoC์ ๋ฐฉ์์ ํต์ฌ์ ์ง์ด์ฃผ๋, ์ข ๋ ๋ช ํํ ์๋๊ฐ ๋ด๊ธด ์ฉ์ด