김영한 님의 스프링 핵심 원리 - 기본편 강의를 보고 작성한 내용입니다.
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
회원을 가입하고 조회할 수 있다
회원은 일반과 VIP 두 가지 등급이 있다
회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다 (미확정)
➡️ 미확정 혹은 변경 가능성이 있는 요구사항은 인터페이스를 만들고 구현체를 언제든지 변경할 수 있도록 설계한다
< 회원 서비스 구현체 >
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);
}
}
memberRepository.save(member)
를 하면
private final MemberRepository memberRepository = new MemoryMemberRepository()
라고 코드를 작성했기 때문에
다형성에 의해 MemberRepository
의 save()를 오버라이딩한
MemoryMemberRepository
의 save()가 호출된다
MemoryMemberRepository
는 MemberRepository
의 구현체
➡️DIP 위반
회원은 상품을 주문할 수 있다
회원 등급에 따라 할인 정책을 적용할 수 있다
할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라 (나중에 변경될 수 있다)
할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다 (미확정)
➡️ 미확정 혹은 변경 가능성이 있는 요구사항은 인터페이스를 만들고 구현체를 언제든지 변경할 수 있도록 설계한다
주문 생성 : 클라이언트는 주문 서비스에 주문 생성을 요청한다
회원 조회 : 할인을 위해서는 회원 등급이 필요하기 때문에 주문 서비스는 회원 저장소에서 회원을 조회한다
할인 적용 : 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임한다
주문 결과 반환 : 주문 서비스는 할인 결과를 포함한 주문 결과를 반환한다 ( DB 저장은 생략, Order 클래스 )
DiscountPolicy
: 할인 대상에 따른 할인 가격 반환
< 주문 서비스 구현체 >
public class OrderServiceImpl implements OrderService{
// 회원 조회
private final MemberRepository memberRepository = new MemoryMemberRepository();
// 할인 정책 ( 고정 할인 정책 )
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
// 주문 결과 반환
@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);
}
}
private final DiscountPolicy discountPolicy = new FixDiscountPolicy()
: 할인 정책은 고정 할인 정책
public Order createOrder(Long memberId, String itemName, int itemPrice)
: 주문을 했을 때, 할인 금액을 추가하여 주문 결과를 반환, 반환형은 Order
int discountPrice = discountPolicy.discount(member, itemPrice)
: 할인 정책에 따라, 멤버 별로 할인 금액을 반환
File - Settings - Keymap
에서 단축키 확인 가능
Generate 띄우기 : Alt + Insert
세미콜론까지 자동 완성 : Crtl + Shift + Enter
반환형 자동 완성 : Ctrl + Alt + v
출력 시 변수 선택 가능하도록 : soutv
오류가 있는 곳으로 이동 : F2