๐ 'Spring DI, IoC'์ ๋ํด์ ์์๋ณด์!
๐ Spring(์คํ๋ง)
Spring : ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์ปจํ
์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์๋ฐ์ ์คํ์์ค ์ ํ๋ฆฌ์ผ์ด์
ํ๋ ์์ํฌ ์ค ํ๋๋ก ํน์ ๊ธฐ์ ์ ์ข
์๋์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ปจํ
์ด๋๋ก ์๋ฐ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ์์กด์ฑ ์ฃผ์
๊ณผ ์ ์ด์ ์ญ์ ์ ํตํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ฒ ๋ฉ๋๋ค.

-
B ๊ฐ์ฒด๊ฐ A ๊ฐ์ฒด๋ฅผ new ์์ฑ์๋ฅผ ํตํด ์ง์ ์์ฑํฉ๋๋ค.
- B๋ A์ ์์กด(์ฌ์ฉ)ํฉ๋๋ค. (๊ฐํ๊ฒฐํฉ)
-
์ธ๋ถ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ setter(), ์์ฑ์๋ฅผ ํตํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
- ์ปจํ
์ด๋์์ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ ์ฃผ์
ํฉ๋๋ค. (์ฝํ ๊ฒฐํฉ)
๐ IoC(Invesion of Control, ์ ์ด์ ์ญ์ )
IoC : ์ ์ด๊ถ์ด ์ฌ์ฉ์์๊ฒ ์์ง ์๊ณ , ํ๋ ์์ํฌ์ ์์ด์ ํ์์ ๋ฐ๋ผ์ ์ฌ์ฉ์์ ์ฝ๋๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค.
- ์คํ๋ง์์๋ ์ธ์คํด์ค์ ์์ฑ๋ถํฐ ์๋ฉธ๊น์ง ๊ฐ๋ฐ์๊ฐ ์๋ ์ปจํ
์ด๋์์ ๋์ ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
- ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ํ๋ฆ์ด๋ ๊ฐ์ฒด ์์ฑ์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋์ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋ ํ๋ ์์ํฌ๊ฐ ์ฌ์ฉํ๋ ํ์ผ์ ์์ฑํ๋ฉด ์ด๋ฅผ ํ ๋๋ก ํ๋ ์์ํฌ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๊ณ ์ฝ๋๊ฐ ๋์ํ๋ ์์๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค.
๊ฐ์ฒด ์์ฑ -> ์์กด์ฑ ๊ฐ์ฒด ์์ฑ(ํด๋์ค ๋ด๋ถ์์ ์์ฑ) -> ์์กด์ฑ ๊ฐ์ฒด ๋ฉ์๋ ํธ์ถ ์์ผ๋ก ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ ์คํ๋ฉ๋๋ค.

๐ DI (Dependency Injection, ์์กด์ฑ ์ฃผ์
)
DI : ์คํ๋ง ์ปจํ
์ด๋์์ ๊ฐ์ฒด Bean์ ๋จผ์ ์์ฑํด๋๊ณ ์์ฑํ ๊ฐ์ฒด๋ฅผ ์ง์ ํ ๊ฐ์ฒด์ ์ฃผ์
ํ๋ ๋ฐฉ์์ ์์กด์ฑ ์ฃผ์
ํ๋ ๋ฐฉ์์
๋๋ค.
๊ฐ์ฒด๋ฅผ ์์กดํ๋ค? : ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ์์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฒด์ ์์กดํ๋ค๋ก ํํํฉ๋๋ค.
- ์ง์ ์์กดํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ฒ์ํด์ ๊ฐ์ ธ์ฌ ํ์ ์์ด์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ ์ฅ์ ์ด ์์ต๋๋ค.
Animal ํด๋์ค

- ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ต๋๋ค.
@Component ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ์คํ๋ง ์ปจํ
์ด๋์๊ฒ ํด๋น ํด๋์ค๊ฐ ๋น์ผ๋ก ์ฌ์ฉ๋ ๊ฒ์์ ์๋ ธ์ต๋๋ค.
-
์์ฑ์ ์ฃผ์
(Constructor Injection):
- ์์ฑ์ ์ฃผ์
์ ์์กดํ๋ ๊ฐ์ฒด๋ฅผ ํด๋์ค์ ์์ฑ์๋ฅผ ํตํด ์ฃผ์
ํ๋ ๋ฐฉ์์
๋๋ค.
- ์์ฑ์ ์ฃผ์
์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ 1ํ ํธ์ถ๋๋ ๊ฒ์ด ๋ณด์ฅ๋ฉ๋๋ค.
- ์ด ๋ฐฉ์์ ์์กด์ฑ์ด ํ์์ ์ผ ๋ ์ฌ์ฉ๋๋ฉฐ, ํ ๋ฒ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉด ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ณ์ฑ์ ์ ๊ณตํฉ๋๋ค.
- Spring์์๋
@Autowired ์ด๋
ธํ
์ด์
์ ์ด์ฉํ์ฌ ์์ฑ์ ์ฃผ์
์ ๊ตฌํํ ์ ์์ต๋๋ค. ํด๋์ค์ ์์ฑ์๊ฐ ํ๋์ผ ๊ฒฝ์ฐ, @Autowired์ ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
final ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํ๋๋ฅผ ์ด๊ธฐํํ์ง ์๊ณ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ final ํ๋์ ๋ํ ์ด๊ธฐํ๋ ์์ฑ์์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค.

Zoo ํด๋์ค๋ ์์ฑ์ ์ฃผ์
๋ฐฉ์์ ์ฌ์ฉํ์ฌ Animal ๊ฐ์ฒด๋ฅผ ์ฃผ์
๋ฐ์ต๋๋ค.
Zoo ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ Animal ๊ฐ์ฒด๊ฐ ํ์ํ๋ฉฐ, ์คํ๋ง ์ปจํ
์ด๋๋ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
Zoo zoo = new Zoo(animal);

- ๋งค๋ฒ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธฐ ๋๋ฌธ์ Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ์์ ์ด๋
ธํ
์ด์
์ ์๋ตํฉ๋๋ค.
@RequiredArgsConstructor ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด Animal ํ๋์ ๋ํ ์์ฑ์๊ฐ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
- ํ์์ ์ผ๋ก ์ฃผ์
ํด์ผ ํ๋ ์์กด์ฑ์ ๊ฐ์ง ํด๋์ค์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
-
Setter ์ฃผ์
(Setter Injection):
- Setter ์ฃผ์
์
setter ๋ฉ์๋๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ๋ ๋ฐฉ์์
๋๋ค.
- ์ด ๋ฐฉ์์ ์ ํ์ ์ธ ์์กด์ฑ์ ๊ฐ์ง ๋ ์ ์ฉํ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ์๋ง ์์กด์ฑ์ ์ฃผ์
ํ ์ ์์ต๋๋ค.
public์ผ๋ก ์ด์ด๋์ด ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. (๋๊ตฐ๊ฐ ์ค์๋ก ๋ณ๊ฒฝํ๋ฉด ์๋๊ธฐ ๋๋ฌธ์
๋๋ค.)
- Spring์์๋ ์ญ์
@Autowired ์ด๋
ธํ
์ด์
์ ์ด์ฉํ์ฌ setter ์ฃผ์
์ ๊ตฌํํ ์ ์์ต๋๋ค.

-
ํ๋ ์ฃผ์
(Field Injection):
- ํ๋ ์ฃผ์
์ ํ๋์ ์ง์ ์์กด์ฑ์ ์ฃผ์
ํ๋ ๋ฐฉ์์
๋๋ค.
- ์ธ๋ถ์์ ๋ณ๊ฒฝํ๊ธฐ ํ๋ค๊ณ ํ๋ ์์ํฌ์ ์์กด์ ์ด์ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค.
- Spring์์๋
@Autowired ์ด๋
ธํ
์ด์
์ ํ๋์ ์ง์ ์ฌ์ฉํ์ฌ ํ๋ ์ฃผ์
์ ๊ตฌํํ ์ ์์ต๋๋ค.

๐ฆ ์์ฑ์ ์ฃผ์
์ ๊ถ์ฅํฉ๋๋ค.
- final(๋ถ๋ณ์ฑ)
- ์ฒ์ ์คํ๋ ๋ ๋๋ถ๋ถ ์ ํด์ง๊ณ ์ข
๋ฃ ์ ๊น์ง ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ์์ฑ์ ์ฃผ์
์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฑ 1๋ฒ๋ง ํธ์ถ๋๋ฏ๋ก ์ดํ์ ํธ์ถ๋๋ ์ผ์ด ์์ด ๋ถ๋ณํ๊ฒ ์ค๊ณํ ์ ์์ต๋๋ค.
- ์ํ ์ฐธ์กฐ ๋ฐฉ์ง
- ์ํ ์ฐธ์กฐ๋ ๋ ๊ฐ ์ด์์ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ๊ด๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ฒด A๊ฐ ๊ฐ์ฒด B๋ฅผ ์ฐธ์กฐํ๊ณ , ๋์์ ๊ฐ์ฒด B๊ฐ ๊ฐ์ฒด A๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์ ๋งํฉ๋๋ค.
- ํ๋์ฃผ์
, ์์ ์์ฃผ์
์ ๋ฐํ์ ์์ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์์ธกํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์์ฑ์ ์ฃผ์
์ ์ปดํ์ผ ํ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ฝ๊ฒ ์ถ์ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋น์ค ์งํ์ ๋ฏธ๋ฆฌ ์๋ฐฉํ ์ ์์ต๋๋ค.