๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ)

by YeonBu 2023. 10. 20.
728x90

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

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

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

www.inflearn.com

 

 

 

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

 

โ—พ  ๊ณต์—ฐ(=์• ํ”Œ๋ฆฌ์ผ€์ด์…˜), ๋กœ๋ฏธ์˜ค(=์ธํ„ฐํŽ˜์ด์Šค), ๋ ˆ์˜ค๋‚˜๋ฅด๋„ ๋””์นดํ”„๋ฆฌ์˜ค(=๊ตฌํ˜„์ฒด) ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์ด์ „์— ์ง  ์ฝ”๋“œ๋Š” ๋””์นดํ”„๋ฆฌ์˜ค๊ฐ€ ์—ฌ์ž๋ฐฐ์šฐ๋ฅผ ์ง์ ‘ ์„ญ์™ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์ด๋‹ค.

๋””์นดํ”„๋ฆฌ์˜ค๋Š” ๊ณต์—ฐ + ์„ญ์™ธ์˜ ๋‹ค์–‘ํ•œ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ.

 

โ—พ  ๋ฐฐ์šฐ๋Š” ๋ณธ์ธ์˜ ์—ญํ• ์ธ ๋ฐฐ์—ญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์—๋งŒ ์ง‘์ค‘ํ•ด์•ผ ํ•˜๋ฉฐ, ์—ฌ์ž ๋ฐฐ์šฐ์— ์ƒ๊ด€์—†์ด ๋˜‘๊ฐ™์€ ๊ณต์—ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.

 

โ—พ  ๊ณต์—ฐ์„ ๊ตฌ์„ฑํ•˜๊ณ , ์„ญ์™ธํ•˜๋Š”๊ฑด `๊ณต์—ฐ ๊ธฐํš์ž`๊ฐ€ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž„.

 

โž” ๊ฒฐ๋ก  : `๊ณต์—ฐ ๊ธฐํš์ž`๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐฐ์šฐ์™€ ๊ธฐํš์ž์˜ ์ฑ…์ž„์„ ํ™•์‹คํžˆ ๋ถ„๋ฆฌํ•˜์ž!

 

 

 

 

 

AppConfig ๋“ฑ์žฅ

 

 

1. ์ฝ”๋“œ ์ž‘์„ฑ

 

 

AppConfig

 

public class AppConfig {

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

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

 

โ—พ  AppConfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…(์—ฐ๊ฒฐ)ํ•ด์ค€๋‹ค.

 

 

 

MemberServiceImpl

 

public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {

        return memberRepository.findById(memberId);

    }
}

 

 

 

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;
    }

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {

        Member member = memberRepository.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);

    }

}

 

โ—พ  MemberServiceImpl, OrderServiceImpl์— ์ƒ์„ฑ์ž๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค.

โ—พ  ์„ค๊ณ„ ๋ณ€๊ฒฝ์œผ๋กœ ์ด์ œ ๊ตฌํ˜„์ฒด๋ฅผ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•œ๋‹ค.

โ—พ  ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ• ์ง€๋Š” ์˜ค์ง ์™ธ๋ถ€(AppConfig)์—์„œ ๊ฒฐ์ •๋œ๋‹ค.

 

 

 

2. ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

 

 

โ—พ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ๊ณผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.

 

 

 

 

3. ํšŒ์› ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

 

 

โ—พ  appConfig ๊ฐ์ฒด๋Š” memoryMemberRepository ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์ฐธ์กฐ๊ฐ’์„ memberServiceImpl์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.

โ—พ  ํด๋ผ์ด์–ธํŠธ์ธ memberServiceImpl ์ž…์žฅ์—์„œ ๋ณด๋ฉด ๋งˆ์น˜ ์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ DI(Dependency Injection) ์šฐ๋ฆฌ๋ง๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋˜๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

 

 

4. appConfig ์‹คํ–‰

 

 

MemberApp

 

public class MemberApp {

    public static void main(String[] args) {

        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        Member memberA = new Member(1L, "memberA", Grade.VIP);
        memberService.join(memberA);

        Member findMember = memberService.findMember(1L);

        System.out.println("new Member = " + memberA.getName());
        System.out.println("find Member = " + findMember.getName());

    }

}

 

 

 

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.toString());
        System.out.println("order = " + order.calculatePrice());

    }

}

 

โ—พ  ๋‘˜๋‹ค ๊ตฌ์ฒดํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•ด์„œ ์ž˜ ์‹คํ–‰ ๋œ๋‹ค!

 

 

 

 

5. Test ์ฝ”๋“œ ์ž‘์„ฑ

 

 

MemberServiceTest

 

public class MemberServiceTest {

    MemberService memberService;

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

    @Test
    @DisplayName("ํšŒ์›๊ฐ€์ž… ํ…Œ์ŠคํŠธ")
    void join() {

        // given
        Member member = new Member(1L, "memberA", Grade.VIP);

        // when
        memberService.join(member);
        Member findMember = memberService.findMember(1L);

        // then
        Assertions.assertThat(member).isEqualTo(findMember);

    }

}

 

 

OrderServiceTest

 

public class OrderServiceTest {

    MemberService memberService;
    OrderService orderService;

    @BeforeEach
    public void beforeEach(){

        AppConfig appConfig = new AppConfig();
        memberService = appConfig.memberService();
        orderService = appConfig.orderService();
    }

    @Test
    @DisplayName("์ฃผ๋ฌธ ํ…Œ์ŠคํŠธ")
    void createOrder(){

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

        Order order = orderService.createOrder(memberId, "itemA", 10000);
        Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);

    }

}

 

๐Ÿ’ก ๊ถ๊ธˆ์ฆ 1

: @BeforeEach๊ฐ™์€ ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ์–ด๋…ธํ…Œ์ด์…˜ ์ข…๋ฅ˜

 

 โ—พ  @BeforeEach(JUnit5) / @Before(JUnit4) : ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ๋งค๋ฒˆ ์‹คํ–‰

 โ—พ  @BeforeAll(JUnit5) / @BeforeClass(JUnit4) : ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ ์‹คํ–‰

 โ—พ  @AfterEach(JUnit5) / @After(JUnit4) : ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„ ๋งค๋ฒˆ ์‹คํ–‰

 โ—พ  @AfterAll(JUnit5) / @AfterClass(JUnit4) : ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๋‚ด ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋œ ํ›„ ๋”ฑ ํ•œ ๋ฒˆ ์‹คํ–‰

 โ—พ  @Disabled(JUnit5) / @Ignore(JUnit4) : ํ•ด๋‹น ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ๋น„ํ™œ์„ฑํ™”

 

 

 

 

 

๋ฐ˜์‘ํ˜•

'IT > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์™€ ํ• ์ธ ์ •์ฑ… ์ ์šฉ, ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ ์ ์šฉ)  (0) 2023.10.21
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - AppConfig ๋ฆฌํŒฉํ„ฐ๋ง)  (0) 2023.10.21
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ, ์ ์šฉ, ๋ฌธ์ œ์ )  (2) 2023.10.20
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ์‹คํ–‰, ํ…Œ์ŠคํŠธ)  (0) 2023.10.20
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ์‹คํ–‰, ํ…Œ์ŠคํŠธ)  (1) 2023.10.18