๊ฐœ๋ฐœ ์ผ์ง€/TIL

23.03.02

sj5262 2023. 3. 5. 03:33

<์˜ค๋Š˜์˜ ๋ณต์Šต>

 

- 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๋„ ๊ฐ™์Œ) 

→ ์ฝ”๋“œ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง„ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋„๋ฐ์ฒด ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋Š”๊ฑธ๊นŒ? 

 

 

 

 

 

 


<์ถœ์ฒ˜ - ์ธํ”„๋Ÿฐ(์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ) , ๊น€์˜ํ•œ >

- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ

www.inflearn.com

 

- (์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ) ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ํ•™์Šต์„ ์œ„ํ•ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

'๊ฐœ๋ฐœ ์ผ์ง€ > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

23.03.03  (1) 2023.03.05
23.02.28  (0) 2023.03.05
23.02.27  (0) 2023.03.05
23.02.24  (0) 2023.02.28
23.02.23  (0) 2023.02.27