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

23.02.28

sj5262 2023. 3. 5. 03:30

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

 

- spring

 

๐ŸŸง ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ


๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ

 

- ์‹ค์ œ ์‹คํ–‰๋˜๋Š” ๊ฐ์ฒด๋“ค์€ ๋ณธ์ธ์˜ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ด์ค˜์•ผ ํ•จ

- ์–ด๋–ค ๊ตฌํ˜„์ฒด๋“ค์ด ์ธํ„ฐํŽ˜์ด์Šค์— ํ• ๋‹น ๋ ์ง€๋Š” '๋ณ„๋„์˜ ์„ค์ • ํด๋ž˜์Šค'๋ฅผ ๋งŒ๋“ค์–ด์•ผ ๋จ!

- ๋ณธ์ธ์—๊ฒŒ ํ• ๋‹น๋œ ์ฑ…์ž„์„ ํ™•์‹คํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ๋œ๋‹ค 

 

AppConfig

 

- ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๋™์ž‘ ๋ฐฉ์‹์„ ๊ตฌ์„ฑ(config = ์„ค)ํ•˜๊ธฐ ์œ„ํ•ด, ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง€๋Š” ๋ณ„๋„์˜ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ

- ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๋Œ€ํ•œ ์šด์˜์„ ์ฑ…์ž„์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค

- ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ตฌ์„ฑํ•œ๋‹ค

โžก๏ธ ํ˜„์žฌ๊นŒ์ง€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ ๊ตฌํ˜„์ฒด๊ฐ€ ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ

 

- AppConfig

public class AppConfig {

    public MemberService memberService() {
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService() {
        return new OrderServiceImpl(
                new MemoryMemberRepository(),
                new FixDiscountPolicy());
    }
}
  • ์ƒ์„ฑ์ž๋ฅผ ์ฃผ์ž…(์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๊ฐ€(new ์ธ์Šคํ„ด์Šค) ์ƒ์„ฑ๋œ๊ฒŒ ๋“ค์–ด ๊ฐ„๋‹ค) 
  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ MemberRepository์— ์–ด๋–ค ๊ตฌํ˜„์ฒด๊ฐ€ ๋“ค์–ด๊ฐˆ์ง€๋ฅผ ์„ ํƒ
  • final → ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋“  ์ƒ์„ฑ์ž๋ฅผ ํ• ๋‹นํ•˜๋“  ๋‘˜ ์ค‘์— ํ•œ๊ฐ€์ง€๋กœ!
  • ์ƒ์„ฑํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…(์—ฐ๊ฒฐ)ํ•ด ์ค€๋‹ค
    • MemberServiceImpl → MemoryMemberREpository
    • OrderService → MemoryMemberRepository, FixDiscountPolicy 
  • return new MemberServiceImpl(new MemoryMemberRepository()); โžก๏ธ MemberServiceImpl์€ MemoryMemberRepository๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค (๋ผ๋Š” ๋œป) 

- MemberServiceImpl ์ˆ˜์ •

public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) { // ์ƒ์„ฑ์ž ์ƒ์„ฑ
        this.memberRepository = memberRepository;
    }
  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ memberRepository์— ๊ตฌํ˜„์ฒด๊ฐ€ ๋ญ๊ฐ€ ๋“ค์–ด๊ฐˆ์ง€ ์„ ํƒ  
  • AppConfig๋ฅผ ํ†ตํ•ด์„œ memberService๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉ 
  • MemberServiceImpl์— MemberRepository์— ๋Œ€ํ•œ ์ฝ”๋“œ x โžก๏ธ MemberRepository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์žˆ๋‹ค(์ถ”์ƒํ™”์—๋งŒ ์˜์กดํ•œ๋‹ค)
  • MemberServiceImpl → ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์€ ์ „ํ˜€ ๋ชจ๋ฆ„! (์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ฌ์ง€?)
  • ์„ค๊ณ„ ๋ณ€๊ฒฝ์œผ๋กœ MemberServiceImpl์€ MemoryMemberRepository๋ฅผ ์˜์กดํ•˜์ง€ ์•Š์Œ! → MemberRepository ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•จ
  • MemberServiceImpl์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ• ์ง€๋Š” โžก๏ธ ์˜ค์ง ์™ธ๋ถ€(AppConfig)์—์„œ ๊ฒฐ์ •๋จ 
  • MemberServiceImpl์€ ์˜์กด๊ด€๊ณ„์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์€ ์™ธ๋ถ€์— ๋งก๊ธฐ๊ณ  ์‹คํ–‰์—๋งŒ ์ง‘์ค‘!

- OrderServiceImpl ์ˆ˜์ •

public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(
            MemberRepository memberRepository,
            DiscountPolicy discountPolicy) { // ์ƒ์„ฑ์ž ์ƒ์„ฑ
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
  • ์‚ฌ์šฉํ•˜๋Š” ํ•„๋“œ๊ฐ€ 2๊ฐœ - MemberRepository, discountPolicy
  • final - ๊ธฐ๋ณธ์œผ๋กœ ํ• ๋‹น์„ ํ•˜๋“ , ์ƒ์„ฑ์ž๋กœ ํ• ๋‹น์„ ํ•˜๋“  → ๋‘ ๊ฐ€์ง€์ค‘์—์„œ ์„ ํƒ
  • this๋ฅผ ํ†ตํ•ด ๊ฐ’์ด ๋„˜์–ด๊ฐ€๋ฉด์„œ ํ• ๋‹น๋œ๋‹ค
  • discountPolicy์—์„œ fix๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ rate๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅธ๋‹ค → OrderServiceImpl (createOrder()๋กœ์ง€๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋จ) 
  • ์„ค๊ณ„ ๋ณ€๊ฒฝ์œผ๋กœ OrderServiceImpl์€ FixDiscountPolicy๋ฅผ ์˜์กด x โžก๏ธ DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•จ
  • OrderServiceImpl → ์–ด๋–ค ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฆ„
  • OrderServiceImpl ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ• ์ง€๋Š”? โžก๏ธ AppConfig์—์„œ ๊ฒฐ์ •
  • OrderServiceImpl  : ์‹คํ–‰์—๋งŒ ์ง‘์ค‘! 
  • OrderServiceImpl๋Š” : MemoryMemberRepository , FixDiscountPolicy๊ฐ์ฒด์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ์ฃผ์ž…๋จ 

โžก๏ธ DIP๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์Œ - ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•จ, ๊ตฌ์ฒด์ ์ธ ์ƒ์„ฑ์ž๋ฅผ ์ฃผ์ž…์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค

 

  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์—ฐ๊ฒฐ โžก๏ธ AppConfig๊ฐ€ ๋‹ด๋‹น
  • DIP ์™„์„ฑ : MemberServiceImpl์€ MemberRepository์ธ '์ถ”์ƒ'์—๋งŒ ์˜์กดํ•˜๋ฉด ๋จ, ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค
  • ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ : ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ๊ณผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋จ
  • appConfig ๊ฐ์ฒด๋Š” memoryMemberRepository๋ฅผ ์ƒ์„ฑ  →๊ทธ ์ฐธ์กฐ๊ฐ’์„ memberServiceImpl์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌ
  • ํด๋ผ์ด์–ธํŠธ์ธ memberServiceImpl์ž…์žฅ์—์„œ ๋ณด๋ฉด ์˜์กด๊ด€๊ณ„๋ฅผ ๋งˆ์น˜ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ DI - ์šฐ๋ฆฌ๋ง๋กœ '์˜์กด๊ด€๊ณ„ ์ฃผ์ž… or ์˜์กด์„ฑ ์ฃผ์ž…' ์ด๋ผ๊ณ  ํ•œ๋‹ค
    • ์˜์กด์€ ๊ด€๊ณ„๊ฐ€ ์ค‘์š”ํ•จ!

์ธํ…”๋ฆฌ์ œ์ด ๊ธฐ๋Šฅ

  • ํ‘œ์‹œํ•œ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป!

- MemberApp (ํ…Œ์ŠคํŠธ)

public class MemberApp {

    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        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());
    }
}
  • AppConfig๋ฅผ ๋งŒ๋“ค์–ด์•ผ ๋œ๋‹ค
  • appconfig.memberService()๊ฐ€ ํ•„์š”ํ•˜๋‹ค(์ธํ„ฐํŽ˜์ด์Šค ํ˜ธ์ถœ) โžก๏ธ memberServiceImpl์ด ๋“ค์–ด๊ฐ
  • ๊ธฐ์กด์—๋Š” → MemberServiceImpl์„ ์ง์ ‘ ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์—์„œ ์ƒ์„ฑ → memoryMemberRepository๋ฅผ ์ƒ์„ฑ 
  • ์œ„ ์ฝ”๋“œ์—์„œ๋Š” appConfig์—์„œ ๋ชจ๋“  ๊ฒฐ์ •์„ ํ•œ๋‹ค

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

  • ํ…Œ์ŠคํŠธ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

- OrderApp ํ…Œ์ŠคํŠธ ์‹คํ–‰

public class OrderApp {

    public static void main(String[] args) {

        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService = appConfig.orderService();

        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(
                memberId, "itemA", 10000);

        System.out.println("order = " + order);
    }
}
  • ๋”์ด์ƒ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กดํ•  ํ•„์š” x
  • ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด 

OrderApp ํ…Œ์ŠคํŠธ ์‹คํ–‰

  • ์‹คํ–‰์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ 

- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •!

public class MemberServiceTest {

    MemberService memberService;

    @BeforeEach
    public void beforeEach() { // ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋Œ๋ฆด๊บผ์•ผ
        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
    }

 

public class OrderServiceTest {

    MemberService memberService;
    OrderService orderService;

    @BeforeEach
    public void beforeEach() {
        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
        orderService = appConfig.orderService();
    }

๋ชจ๋“  ํ…Œ์ŠคํŠธ

  • ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

 

 

 

 

 

 

 


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

- 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.03.02  (2) 2023.03.05
23.02.27  (0) 2023.03.05
23.02.24  (0) 2023.02.28
23.02.23  (0) 2023.02.27