설정을 변경한 후에는 꼭 새로고침을 눌러주어야 한다!
gradle로 실행하는 것보다 intellij로 실행하는 것이 더 빠르다!
인터페이스를 만들어 구현체에 따라 기능이 변경될 수 있도록 설계
가입과 조회가 가능 (
join(), findById()
일반과 VIP 등급이 존재
enum Grade
데이터 툴 미정 (자체 DB를 사용하거나, 외부 시스템 연동)
MemoryMemberRepository
public interface MemberService {
void join(Member member);
Member findMember(Long memberId);
}
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
다형성에 의해 인터페이스가 아닌 구현체에서 정의한 메서드가 실행된다.
public class MemberServiceTest {
MemberService memberService = new MemberServiceImpl();
@Test
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);
}
}
과연 OCP와 DIP가 잘 지켜진 test일까?
MemberService memberService = new MemberServiceImpl();
public class OrderServiceTest {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
@Test
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);
}
}
결과 : SUCCESSFUL
👀 ❓
역할과 구현을 나누어 객체지향적으로 잘 만든 코드이다.
과연 할인 정책과 repository를 변경했을 경우에도 문제가 없이 잘 실행이 될까???