/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
โพ ๊ณต์ฐ(=์ ํ๋ฆฌ์ผ์ด์ ), ๋ก๋ฏธ์ค(=์ธํฐํ์ด์ค), ๋ ์ค๋๋ฅด๋ ๋์นดํ๋ฆฌ์ค(=๊ตฌํ์ฒด) ๋ผ๊ณ ์๊ฐํ์ ๋ ์ด์ ์ ์ง ์ฝ๋๋ ๋์นดํ๋ฆฌ์ค๊ฐ ์ฌ์๋ฐฐ์ฐ๋ฅผ ์ง์ ์ญ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ๋ ์ด๋ค.
๋์นดํ๋ฆฌ์ค๋ ๊ณต์ฐ + ์ญ์ธ์ ๋ค์ํ ์ฑ ์์ ๊ฐ์ง๊ณ ์์๋ ๊ฒ.
โพ ๋ฐฐ์ฐ๋ ๋ณธ์ธ์ ์ญํ ์ธ ๋ฐฐ์ญ์ ์ํํ๋ ๊ฒ์๋ง ์ง์คํด์ผ ํ๋ฉฐ, ์ฌ์ ๋ฐฐ์ฐ์ ์๊ด์์ด ๋๊ฐ์ ๊ณต์ฐ์ ํ ์ ์์ด์ผ ํจ.
โพ ๊ณต์ฐ์ ๊ตฌ์ฑํ๊ณ , ์ญ์ธํ๋๊ฑด `๊ณต์ฐ ๊ธฐํ์`๊ฐ ํด์ผ ํ๋ ๊ฒ์.
โ ๊ฒฐ๋ก : `๊ณต์ฐ ๊ธฐํ์`๋ฅผ ๋ง๋ค๊ณ ๋ฐฐ์ฐ์ ๊ธฐํ์์ ์ฑ ์์ ํ์คํ ๋ถ๋ฆฌํ์!
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) : ํด๋น ํ ์คํธ ๋ฉ์๋ ๋นํ์ฑํ