[스프링 핵심 원리 - 기본편] 2. 스프링 핵심 원리 이해1 - 예제 만들기

HJ·2022년 7월 29일
0

김영한 님의 스프링 핵심 원리 - 기본편 강의를 보고 작성한 내용입니다.
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


1. 회원 도메인 설계

1-1. 요구사항

  • 회원을 가입하고 조회할 수 있다

  • 회원은 일반과 VIP 두 가지 등급이 있다

  • 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다 (미확정)

    ➡️ 미확정 혹은 변경 가능성이 있는 요구사항은 인터페이스를 만들고 구현체를 언제든지 변경할 수 있도록 설계한다


1-2. 요구사항 표현

  • 회원 도메인 협력 관계


  • 회원 클래스 다이어그램


  • 회원 객체 다이어그램


1-3. 주요 코드 설명


< 회원 서비스 구현체 >

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()가 호출된다

  • MemoryMemberRepositoryMemberRepository의 구현체


  • 인터페이스(추상화)에 의존하지만, 구현 클래스(구체화)도 동시에 의존한다

  ➡️DIP 위반




2. 주문과 할인 도메인 설계

2-1. 요구사항

  • 회원은 상품을 주문할 수 있다

  • 회원 등급에 따라 할인 정책을 적용할 수 있다

  • 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라 (나중에 변경될 수 있다)

  • 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다 (미확정)

    ➡️ 미확정 혹은 변경 가능성이 있는 요구사항은 인터페이스를 만들고 구현체를 언제든지 변경할 수 있도록 설계한다


2-2. 요구사항 표현

  • 주문 도메인, 협력, 역할, 책임

  1. 주문 생성 : 클라이언트는 주문 서비스에 주문 생성을 요청한다

  2. 회원 조회 : 할인을 위해서는 회원 등급이 필요하기 때문에 주문 서비스는 회원 저장소에서 회원을 조회한다

  3. 할인 적용 : 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임한다

  4. 주문 결과 반환 : 주문 서비스는 할인 결과를 포함한 주문 결과를 반환한다 ( DB 저장은 생략, Order 클래스 )


  • 주문 도메인 클래스 다이어그램

DiscountPolicy : 할인 대상에 따른 할인 가격 반환


  • 주문 도메인 객체 다이어그램


2-3. 주요 코드 설명


< 주문 서비스 구현체 >

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

0개의 댓글