<์ค๋์ ๋ณต์ต>
- spring
๐ง ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ
AppConfig ๋ฆฌํฉํฐ๋ง
- ๋ฌธ์ ์ ๊ณผ ๋ ๋์ ๋ฐฉํฅ์ผ๋ก์ ๋ฆฌํํฐ๋ง
- ํ์ฌ๊น์ง AppConfig ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ค๋ณต์ด ์๊ณ , ์ญํ ์ ๋ฐ๋ฅธ ๊ตฌํ์ด ์ ์๋ณด์

๋ฆฌํฉํ ๋ง
- ๊ตฌ์ฒด ํด๋์ค๋ฅผ ๋๋ฅด๋ฉด x โก๏ธ '์ธํฐํ์ด์ค'๋ฅผ ์ ํ!
- AppConfig ๋ฆฌํฉํ ๋ง
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
private MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(), discountPolicy());
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
- MemberService ์ญํ , MemberRepository์ญํ , OrderService์ญํ ์ด ๋ค๋ค์ด๋๋ค
- DiscountPolicy์ญํ ์ถ๊ฐ!
- ์ฅ์ : ๊ฐ ์ญํ ์ ์ ์ ์์(๋ฉ์๋๋ช ์ ๋ด๋), ๋ณ๊ฒฝ์ ์ฉ์ด
- new MemoryMemberRepository() → ์ด ๋ถ๋ถ์ ์ค๋ณต์ด ์ ๊ฑฐ๋จ
- MemoryMemberRepository → ๋ค๋ฅธ ๊ตฌํ์ฒด๋ก ๋ณ๊ฒฝํ ๋ ํ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ๋ฉด ๋จ
- AppConfig๋ฅผ ๋ณด๋ฉด ์ญํ ๊ณผ ๊ตฌํ ํด๋์ค๊ฐ ํ๋์ ๋ค์ด์ฎ, ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฒด ๊ตฌ์ฑ์ด ์ด๋ป๊ฒ ๋์ด์๋์ง๋ ๋น ๋ฅด๊ฒ ํ์ ๊ฐ๋ฅ
์๋ก์ด ๊ตฌ์กฐ์ ํ ์ธ ์ ์ฑ ์ ์ฉ
- ์ฒ์์ผ๋ก ๋์๊ฐ ์ ์ก ํ ์ธ ์ ์ฑ ์ ์ ๋ฅ (%) ํ ์ธ ์ ์ฑ ์ผ๋ก ๋ณ๊ฒฝํด๋ณด๊ธฐ
- FixDiscountPolicy โก๏ธ RateDiscountPolicy
- AppConfig๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค : ์ดํ๋ฆฌ์ผ์ด์ ์ด ํฌ๊ฒ ์ฌ์ฉ ์์ญ๊ณผ, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑ(Configuration)ํ๋ ์์ญ์ผ๋ก ๋ถ๋ฆฌ๋์์

์ฌ์ฉ, ๊ตฌ์ฑ์ ๋ถ๋ฆฌ
- ํ ์ธ ์ ์ฑ ์ ์์ ํ๋ฉด AppConfig๋ถ๋ถ๋ง ๊ณ ์น๋ฉด ๋๋ค
- FixDiscountPolicy → RateDiscountPolicy๋ก ๋ณ๊ฒฝํด๋ ๊ตฌ์ฑ ์์ญ๋ง ์ํฅ์ ๋ฐ๊ณ , ์ฌ์ฉ ์์ญ์ ์ ํ ์ํฅ์ ๋ฐ์ง ์์
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
- RateDiscountPolicy(); ๋ง ์์ !

์์ ์ฝ๋ ํ ์คํธ
- ์ฑ๊ณตํ๋ ๊ฒ์ ํ์ธ

OrderApp
- OrderApp์ main() ํ ์คํธ ์ ๊ฐ์ด ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์
โ๏ธ ์ด์ ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝํด๋, ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์ญํ ์ ๋ด๋นํ๋ AppConfig๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค, ํด๋ผ์ด์ธํธ ์ฝ๋์ธ OrderServiceImpl๋ฅผ ํฌํจํด์ ์ฌ์ฉ์์ญ์ ์ด๋ค ์ฝ๋๋ ๋ณ๊ฒฝํ ํ์๊ฐ ์์
โ๏ธ ๊ตฌ์ฑ ์์ญ์ ๋น์ฐํ ๋ณ๊ฒฝ๋จ - ๊ตฌ์ฑ ์ญํ ์ ๋ด๋นํ๋ AppConfig๋ฅผ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ๊ณต์ฐ์ ๊ธฐํ์๋ก ์๊ฐํ๋ฉด๋๋ค, ๊ณต์ฐ ๊ธฐํ์๋ ๊ณต์ฐ ์ฐธ์ฌ์์ธ ๊ตฌํ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์์์ผ ํจ
โ๏ธ DIP, OCP ๋ชจ๋ ์ง์ผ์ก์
๐ ์ ์ฒด ํ๋ฆ ์ ๋ฆฌ
๐น์๋ก์ด ํ ์ธ ์ ์ฑ ๊ฐ๋ฐ
- ๋คํ์ฑ ๋๋ถ์ ์๋ก์ด ์ ๋ฅ ํ ์ธ ์ ์ฑ ์ฝ๋๋ฅผ ์ถ๊ฐ๋ก ๊ฐ๋ฐํ๋ ๊ฒ ์์ฒด๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์๋ค
๐น์๋ก์ด ํ ์ธ ์ ์ฑ ์ ์ฉ๊ณผ ๋ฌธ์ ์ ?
- ์๋ก ๊ฐ๋ฐํ ์ ๋ฅ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ๋ ค๊ณ ํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋์ธ ์ฃผ๋ฌธ ์๋น์ค ๊ตฌํ์ฒด๋ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํจ
- ์ฃผ๋ฌธ ์๋น์ค ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ธ DisCountPolicy๋ฟ๋ง ์๋๋ผ, ๊ตฌ์ฒด ํด๋์ค์ธ FixDisCountPolicy๋ ํจ๊ป ์์กด → DIP ์๋ฐ
โก๏ธ ์ฃผ๋ฌธ ์๋น์ค ํด๋ผ์ด์ธํธ๊ฐ ๋๋ฌด ๋ง์ ์ผ์ ํ๊ณ ์์์
๐น๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
- ๊ธฐ์กด์๋ → ํด๋ผ์ด์ธํธ๊ฐ ์์กดํ๋ ์๋ฒ ๊ตฌํ์ฒด๋ฅผ ์ง์ ์์ฑ, ์คํํจ
- ๊ธฐํ์ : AppConfig ๋ฑ์ฅ
- AppConfig ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑ(config)ํ๊ธฐ ์ํด, ๊ตฌํ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์ฑ ์
- ์ด์ ๋ถํฐ ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ์์ ์ ์ญํ ์ ์คํํ๋ ๊ฒ๋ง ์ง์ค, ๊ถํ์ด ์ค์ด๋ฌ(์ฑ ์์ด ๋ช ํํด์ง)
๐นAppConfig ๋ฆฌํฉํฐ๋ง
- ๊ตฌ์ฑ ์ ๋ณด์์ ์ญํ ๊ณผ ๊ตฌํ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ
- ์ญํ ์ด ์ ๋๋ฌ๋จ
- ์ค๋ณต ์ ๊ฑฐ
๐น์๋ก์ด ๊ตฌ์กฐ์ ํ ์ธ ์ ์ฑ ์ ์ฉ
- ์ ์ก ํ ์ธ ์ ์ฑ → ์ ๋ฅ (%)ํ ์ธ ์ ์ฑ ์ผ๋ก ๋ณ๊ฒฌ
- AppConfig์ ๋ฑ์ฅ์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ด ํฌ๊ฒ ์ฌ์ฉ ์์ญ๊ณผ, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑ(Configuration)ํ๋ ์์ญ์ผ๋ก ๋ถ๋ฆฌ
- ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝํด๋ → AppConfig๊ฐ ์๋ ๊ตฌ์ฑ์์ญ๋ง ๋ณด๋ฉด๋๋ค, ์ฌ์ฉ ์์ญ์ ๋ณ๊ฒฝํ ํ์ x, ๋ฌผ๋ก ํด๋ผ์ด์ธํธ ์ฝ๋์ธ ์ฃผ๋ฌธ ์๋น์ค ์ฝ๋๋ ๋ณ๊ฒฝํ์ง ์์
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น ์ ์ฉ
โก๏ธ ์์ ์์ SRP, DIP, OCP ์ ์ฉ
- SRP ๋จ์ผ ์ฑ ์ ์์น (ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง)
- ํด๋ผ์ด์ธํธ ๊ฐ์ฒด(ex. OrderService ๋ฑ)๋ ์ง์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑ, ์ฐ๊ฒฐ, ์คํํ๋ ๋ค์ํ ์ฑ ์์ ๊ฐ์ง๊ณ ์์
- SRP ๋จ์ผ ์ฑ ์ ์์น์ ๋ฐ๋ฅด๋ฉด์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํจ
- ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์ฑ ์์ AppConfig๊ฐ ๋ด๋น
- ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ์คํํ๋ ์ฑ ์๋ง ๋ด
- DIP ์์กด๊ด๊ณ ์ญ์ ์์น(์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กด X - ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋)
- ์๋ก์ด ํ ์ธ ์ ์ฑ ์ ๊ฐ๋ฐ, ์ ์ฉํ๋ ค๊ณ ํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ → ๊ธฐ์กด ํด๋ผ์ด์ธํธ ์ฝ๋(OrderServiceImpl)๋ DIP๋ฅผ ์งํค๋ฉฐ DiscountPolicy ์ถ์ํ ์ธํฐํ์ด์ค์ ์์กดํ๋ ๊ฒ ๊ฐ์์ง๋ง FixDiscountPolicy ๊ตฌ์ฒดํ ๊ตฌํ ํด๋์ค์๋ ํจ๊ป ์์กดํจ
- ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ DiscountPolicy ์ถ์ํ ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝ → ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์ธํฐํ์ด์ค๋ง์ผ๋ก๋ ์๋ฌด๊ฒ๋ ์คํํ ์ ์์
- AppConfig๊ฐ FixDiscountPolicy ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ํด๋ผ์ด์ธํธ ์ฝ๋ ๋์ ์์ฑํด์ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ → DIP ์์น์ ์ค์, ๋ฌธ์ ํด๊ฒฐ
- OCP (์ํํธ์จ์ด ์์๋ ํ์ฅ์ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์ ๋ซํ ์์ด์ผ ํจ)
- ๋คํ์ฑ ์ฌ์ฉ, ํด๋ผ์ด์ธํธ๊ฐ DIP๋ฅผ ์งํด
- ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ ์์ญ๊ณผ ๊ตฌ์ฑ ์์ญ์ผ๋ก ๋๋
- AppConfig๊ฐ ์์กด๊ด๊ณ๋ฅผ FixDiscountPolicy โก๏ธ RateDiscountPolicy ๋ก ๋ณ๊ฒฝ, ํด๋ผ์ด์ธํธ ์ฝ๋์ ์ฃผ์ ํ๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ฝ๋๋ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค
- ์ํํธ์จ์ด ์์๋ฅผ ์๋กญ๊ฒ ํ์ฅํด๋ ์ฌ์ฉ ์์ญ์ ๋ณ๊ฒฝ์ ๋ซํ ์๋ค! → ๋ณ๊ฒฝ์ด ๋ซํ์๋ค : ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค
IoC, DI, ์ปจํ ์ด๋
- ์ ์ด์ ์ญ์ IoC(Inversion of Control)
- ๊ธฐ์กด ํ๋ก๊ทธ๋จ → ํด๋ผ์ด์ธํธ ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ํ์ํ ์๋ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑ, ์ฐ๊ฒฐ, ์คํํจ
- ๊ตฌํ๊ฐ์ฒด๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ค์ค๋ก ์กฐ์ข - ๊ฐ๋ฐ์ ์ ์ฅ์์๋ ์์ฐ์ค๋ฌ์ด ํ๋ฆ
๐นAppConfig์ ๋ฑ์ฅ
- ๊ตฌํ ๊ฐ์ฒด๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง ๋ด๋น → ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ AppConfig๊ฐ ๊ฐ์ ธ๊ฐ
(OrderServiceImpl์ ํ์ํ ์ธํฐํ์ด์ค๋ค์ ํธ์ถํ์ง๋ง ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ค์ด ์คํ๋ ์ง ๋ชจ๋ฆ - ํ๋ก๊ทธ๋จ์ ๋ํ ์ ์ด ํ๋ฆ์ ๋ํ ๊ถํ : AppConfig๊ฐ ๊ฐ์ง๊ณ ์์)
- OrderServiceImpl ๋ AppConfig๊ฐ ์์ฑ
- AppConfig๋ OrderServiceImpl ์ด ์๋ OrderService ์ธํฐํ์ด์ค์ ๋ค๋ฅธ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์คํํ ์ ๋ ์์โก๏ธ ์ด๋ฐ ์ฌ์ค์ OrderServiceImpl ๋ ๋ชจ๋ฆ, ๋ณธ์ธ ๋ก์ง๋ง ์ํ
- ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ด ํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด์ ์ญ์ (IoC)์ด๋ผ๊ณ ํจ
๋ด๊ฐ ์ ์ดํ๊ณ ํธ์ถํ๋๊ฒ ์๋๋ผ ํ๋ ์์ํฌ๊ฐ ๋์ ํธ์ถํ๋ ๊ฒ
์ ์ด๊ถ์ด ๋ค๋ฐ๋๋ค → ์ ์ด์ ์ญ์
AppConfig๊ฐ Impl(๊ตฌํ์ฒด)๋ฅผ ์ธ ๊ฒ์ด๋ผ๊ณ ๊ฒฐ์ ํ๋ค
๐นํ๋ ์์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ์ด, ๋์ ์คํ → ํ๋ ์์ํฌ ok(JUnit) โก๏ธ ํ๋ ์์ํฌ
๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ์ ์ด์ ํ๋ฆ์ ๋ด๋น โก๏ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์์กด๊ด๊ณ ์ฃผ์ (Dependency Injection)
- OrderServiceImpl ์ DiscountPolicy ์ธํฐํ์ด์ค์ ์์กด → ์ค์ ์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ฌ์ฉ๋ ์ง ๋ชจ๋ฆ
- ์์กด๊ด๊ณ : ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ / ์คํ ์์ ์ ๊ฒฐ์ ๋๋ ๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค)์์กด ๊ด๊ณ ๋์ ๋ถ๋ฆฌํด์ ์๊ฐ
- ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ : ํด๋์ค๊ฐ ์ฌ์ฉํ๋ import ์ฝ๋๋ง ๋ณด๊ณ ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ํ๋จํ ์ ์์, ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์์๋ ๋ถ์ํ ์ ์์ → ํด๋์ค ์ฝ๋๋ง ์ด์ด์ ์ฌ์ฉํ ์ ์๋
- OrderServiceImpl์ MemberRepository, DiscountPolicy์ ์์กดํ๋ค๋ ๊ฒ์ ์ ์ ์์
โก๏ธ ์ด๋ฌํ ์์กด๊ด๊ณ๋ง์ผ๋ก๋ ์ค์ ์ด๋ค ๊ฐ์ฒด๊ฐ OrderServiceImpl ์ ์ฃผ์ ๋ ์ง ์ ์ ์์

ํด๋์ค ๋ค์ด์ด๊ทธ๋จ

์์กด ๊ด๊ณ ๋ค์ด์ด๊ทธ๋จ

show Dependencies

์์กด๊ด๊ณ
- ์์กด๊ด๊ณ๋ฅผ ํ์ธํ ์ ์๋ค
๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด ๊ด๊ณ
- ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ค์ ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋ ์์กด ๊ด๊ณ
- ์์กด๊ด๊ณ ์ฃผ์ (DI) : ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์์ (๋ฐํ์)์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฑฐ ์ฐ๊ฒฐ ๋๋ ๊ฒ
- ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ทธ ์ฐธ์กฐ๊ฐ์ ์ ๋ฌํด์ ์ฐ๊ฒฐ๋จ
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉ → ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ๋ ๋์์ ํ์ ์ธ์คํด์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์์/ ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ (์ดํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ x), ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์
๐ IoC ์ปจํ ์ด๋, DI ์ปจํ ์ด๋
- (AppConfig์ฒ๋ผ) ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ ๊ฒ : IoC ์ปจํ ์ด๋ or DI ์ปจํ ์ด๋
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ด์ ์ ๋ง์ถ์ด ์ต๊ทผ์๋ DI ์ปจํ ์ด๋๋ผ ํจ/ or ์ด์ ๋ธ๋ฌ, ์ค๋ธ์ ํธ ํฉํ ๋ฆฌ ๋ฑ์ผ๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํจ
์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ
- ์ง๊ธ๊น์ง ์์ํ ์๋ฐ ์ฝ๋๋ง์ผ๋ก DI๋ฅผ ์ ์ฉํ๋๋ฐ ์ด์ ๋ถํฐ๋ ์คํ๋ง์ ์ฌ์ฉ!
- AppConfig ์คํ๋ง ๊ธฐ๋ฐ์ผ๋ก ์์
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
- @Configuration ์ด๋ ธํ ์ด์ ์ถ๊ฐ - ์ค์ ์ ๋ณด, ๊ตฌ์ฑ์ ๋ณด๋ฅผ ๋ด๋นํ๋ ๊ฒ
- ํญ์ ๋ณธ์ธ์ด ์ฐ๋ import๊ฐ ์ ํํ ๊ฒ์ธ์ง ํ์ธํด์ผ๋๋ค
- ๋ชจ๋ ๋ฉ์๋๋ค์ด ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก์ด ๋๋ค
- MemberApp์ ์คํ๋ง ์ปจํ ์ด๋ ์ ์ฉ
public class MemberApp {
public static void main(String[] args) {
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new Member = " + member.getName());
System.out.println("find Member = " + findMember.getName());
}
}
- spring์ ๋ชจ๋ ๊ฒ ApplicationContext๋ก ์์ํ๋ค
- ApplicationContext : ์คํ๋ง์ปจํ ์ด๋ - ๋ชจ๋ (๊ฐ์ฒด - @Bean )๊ฑธ ๊ด๋ฆฌํด์ค๋ค
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- ์ด๋ ธํ ์ด์ ์ ๊ธฐ๋ฐ์ผ๋ก Config๋ฅผ ํ๊ณ ์์
- ํ๋ผ๋ฏธํฐ๋ก AppConfig๋ฅผ ๋ฃ๋๋ค โก๏ธ AppConfig์ ์๋ ํ๊ฒฝ์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์คํ๋ง์ด @Bean์ ์ํด ์๋ ๋ฉ์๋๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํด ๊ด๋ฆฌํด ์ค๋ค
applicationContext.getBean("memberService", MemberService.class);
- ("name", type)
- AppConfig์์ ๋ฌด์์ ๊บผ๋ด ์ฌ์ฉํ ๊ฒ์ธ์ง
- ๋๋ฒ์งธ๋ ํ์ !
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ๋ฑ๋ก๋์ด ์์

main() ์คํ
- ์์ 5๊ฐ๋ ์คํ๋ง ๋ด๋ถ์ ์ผ๋ก ๋ฑ๋ก
- ๋ฐ์ 5๊ฐ๋ โก๏ธ @Bean์ผ๋ก ๋ฑ๋กํด ๋จ๋ ๊ฒ๋ค์ด ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋จ
- name = key, value = return ๊ฐ
- ex. memberService = key / new MemberServiceImpl() - ๊ฐ์ฒด ์ธ์คํด = value
- OrderApp์ ์คํ๋ง ์ปจํ ์ด๋ ์ ์ฉ
public class OrderApp {
public static void main(String[] args) {
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(
memberId, "itemA", 20000);
System.out.println("order = " + order);
// System.out.println("order.calculatePrice = " + order.calculatePrice());
}
}
- MemberApp์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค

- ์ ๋์๊ฐ๋ ๊ฑธ ํ์ธํ ์ ์๋ค
- ์คํ๋ง ์ปจํ ์ด๋?
- ApplicationContext = ์คํ๋ง ์ปจํ ์ด๋
- ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ AppConfig๋ฅผ ์ฌ์ฉํด ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑ, DIํ์ผ๋ → ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด์ ์ฌ์ฉ
- @Configuration ์ด ๋ถ์ AppConfig ๋ฅผ ์ค์ (๊ตฌ์ฑ) ์ ๋ณด๋ก ์ฌ์ฉ
โก๏ธ @Bean์ด๋ผ ์ ์ธ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํธ์ถํด์ ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก → ์ด๋ ๊ฒ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๊ฐ์ฒด = ์คํ๋ง ๋น
- @Bean ์ด ๋ถ์ ๋ฉ์๋์ ๋ช ์ ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ(memberService , orderService)
- ์ด์ ์๋ ๊ฐ๋ฐ์๊ฐ ํ์ํ ๊ฐ์ฒด๋ฅผ AppConfig๋ฅผ ์ฌ์ฉํด ์ง์ ์กฐํ → ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด์ ํ์ํ ์คํ๋ง ๋น(๊ฐ์ฒด)๋ฅผ ์ฐพ์์ผ ๋จ
- ์คํ๋ง ๋น โก๏ธ applicationContext.getBean() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ฐพ์ ์ ์์
- ์ง์ ์๋ฐ์ฝ๋๋ก ๋ชจ๋ ๊ฒ์ ํ์ โก๏ธ ์คํ๋ง ์ปจํ ์ด๋์ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ๋ฑ๋ก → ์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ! (@Autowired๋ ๊ฐ์)
→ ์ฝ๋๊ฐ ๋ ๋ณต์กํด์ง ๊ฒ ๊ฐ์๋ฐ, ๋๋ฐ์ฒด ์ด๋ค ์ฅ์ ์ด ์๋๊ฑธ๊น?
<์ถ์ฒ - ์ธํ๋ฐ(์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ) , ๊น์ํ >
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ
www.inflearn.com
- (์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ) ๊ฐ์๋ฅผ ๋ฃ๊ณ ํ์ต์ ์ํด ์์ฑํ์ต๋๋ค.