Skip to content

Latest commit

ย 

History

History
107 lines (85 loc) ยท 4.25 KB

File metadata and controls

107 lines (85 loc) ยท 4.25 KB
public class AppConfig { // ์ƒˆ๋กœ์šด ์—ญํ• . ์—ฌ๊ธฐ์„œ ์ƒ์„ฑํ•œ ๊ตฌํ˜„์ฒด๋Š” ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.

    public MemberService memberService() {
        return new MemberServiceImpl(new MemoryMemberRepository()); // MemoryMemberRepository๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ(๊ตฌ์ฒด์ ์ธ ๊ณณ์€ ์—ฌ๊ธฐ์„œ ์ง€์ •ํ•œ๋‹ค.)
    }

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }

}
  • AppConfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    • MemberServiceImpl
      • MemoryMemberRepository
    • OrderServiceImpl
      • MemoryMemberRepository
      • FixDiscountPolicy

AppConfig๋Š” ์ƒ์„ฑํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ(๋ ˆํผ๋Ÿฐ์Šค)๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…(์—ฐ๊ฒฐ)ํ•ด์ค€๋‹ค. MemberServiceImpl MemoryMemberRepository

  • OrderServiceImpl
    • MemoryMemberRepository
    • FixDiscountPolicy

์ด์ œ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DIP๋ฅผ ๋งŒ์กฑํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ ์ชฝ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ OCP๋„ ๋งŒ์กฑํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ.

private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

public OrderServiceImpl(final MemberRepository memberRepository, final DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}

์ด์ œ DIP๊ฐ€ ์™„์„ฑ๋จ! ใ…Žใ…Žใ…Ž

class MemberServiceTest {
    private MemberService memberService ;

    @BeforeEach
    void setUp() {
        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
    }

    @Test
    void join() {
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);
        Member findMember = memberService.findMember(1L);
        assertEquals(findMember, member);
    }
}
  • AppConfig๋กœ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌํ–ˆ์Œ
  • AppConfig๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์—ฐ๊ฒฐ์€ AppConfig ๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.
  • DIP ์™„์„ฑ: MemberServiceImpl ์€ MemberRepository ์ธ ์ถ”์ƒ์—๋งŒ ์˜์กดํ•˜๋ฉด ๋œ๋‹ค. ์ด์ œ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.
  • ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ: ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ๊ณผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.

AppConfig ๋ฆฌํŒฉํ† ๋ง

  • ์ง€๊ธˆ ์—ญํ• ์ด ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๊ณ  ์žˆ์Œ
  • ์—ญํ• ์„ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ
public class AppConfig { // ์ƒˆ๋กœ์šด ์—ญํ• . ์—ฌ๊ธฐ์„œ ์ƒ์„ฑํ•œ ๊ตฌํ˜„์ฒด๋Š” ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.

    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository()); // MemoryMemberRepository๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ(๊ตฌ์ฒด์ ์ธ ๊ณณ์€ ์—ฌ๊ธฐ์„œ ์ง€์ •ํ•œ๋‹ค.)
    }

    private MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }

}
  • ๋ฉ”์„œ๋“œ ๋ช…์œผ๋กœ ์—ญํ• ์ด ๋“œ๋Ÿฌ๋‚จ
  • ๋‚˜์ค‘์— MemoryMemberRepository -> JdbcMemberRepository ์ด๋ ‡๊ฒŒ ๋ฐ”๋€๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์œ„์˜ ๊ตฌํ˜„์ฒด์ชฝ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋จ
  • ์œ ์ง€ ๋ณด์ˆ˜์—๋„ ๋„์›€์ด ๋œ๋‹ค.
  • ์—ญํ• ๊ณผ ๊ตฌํ˜„์ด ํ•œ ๋ˆˆ์— ๋ณด์ธ๋‹ค.
  • new MemoryMemberRepository() ์ด ๋ถ€๋ถ„์ด ์ค‘๋ณต ์ œ๊ฑฐ๋˜์—ˆ๋‹ค.
  • ์ด์ œ MemoryMemberRepository ๋ฅผ ๋‹ค ๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.
  • AppConfig ๋ฅผ ๋ณด๋ฉด ์—ญํ• ๊ณผ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ๊ตฌ์„ฑ์ด ์–ด๋–ป๊ฒŒ ๋˜์–ด์žˆ๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์„ฑ์˜์—ญ๊ณผ ์‚ฌ์šฉ์˜์—ญ์ด ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ. ์ด๊ฒŒ ์ง„์งœ ํฐ ์žฅ์ ์ž„ ๊ตฌ์„ฑ ์˜์—ญ์€ ๋‹น์—ฐํžˆ ๋ณ€๊ฒฝ๋œ๋‹ค! ๊ณต์—ฐ ๊ธฐํš์ž๋Š” ๊ณต์—ฐ ์ฐธ์—ฌ์ž์ธ ๊ตฌํ˜„ ๊ฐ์ฒด๋“ค์„ ๋ชจ๋‘ ์•Œ์•„์•ผํ•˜๋Š” ๊ฒƒ์€ ํŒฉํŠธ์ด๋‹ˆ! ๋Œ€์‹  ์‚ฌ์šฉ ์˜์—ญ์— ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์ „ํ˜€ ์† ๋Œˆ ํ•„์š”๊ฐ€ ์—†๋‹ค!!!

  • ๋•๋ถ„์— DIP / OCP๋ฅผ ๋ชจ๋‘ ์ง€ํ‚ค๊ฒŒ ๋˜์—ˆ๋‹ค.
  • AppConfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ๋™์ž‘ ๋ฐฉ์‹์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง!(๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ)
  • ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ์—ญํ• ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋งŒ ์ง‘์ค‘, ์ฑ…์ž„์ด ๋ช…ํ™•ํ•ด์ง