스프링 핵심 원리 - 기본편 (2) 스프링 핵심 원리 이해1 - 예제 만들기

강아람·2022년 8월 20일
0
post-thumbnail

📖 프로젝트 설정

  1. https://start.spring.io/

  1. dependencies 설치 후, gradle 새로 고침

    설정을 변경한 후에는 꼭 새로고침을 눌러주어야 한다!

  1. setting > gradle

    gradle로 실행하는 것보다 intellij로 실행하는 것이 더 빠르다!




📖 비즈니스 요구사항과 설계

👩 회원

  • 가입과 조회가 가능
  • 일반과 VIP 등급이 존재
  • 데이터 툴 미정 (자체 DB를 사용하거나, 외부 시스템 연동)

💸 주문과 할인 정책

  • 회원 상품 주문 가능
  • 회원 등급에 따라 할인 정책 적용 가능
  • 모든 VIP는 1000원을 할인해주는 고정 금액 할인 적용 (변경 가능)
  • 할인 정책의 변경 가능성이 높음 (회사의 기본 할인 정책이 정해지지 않았고, 오픈 직전까지 고민 필요. 할인 미적용 가능성도 있음!)

인터페이스를 만들어 구현체에 따라 기능이 변경될 수 있도록 설계




📖 회원 도메인 설계

👀 회원 도메인 요구사항

  • 가입과 조회가 가능 (

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

다형성에 의해 인터페이스가 아닌 구현체에서 정의한 메서드가 실행된다.




📖 회원 도메인 실행과 테스트

💡 main() 메서드 생성 : psvm

💻 Test

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일까?

동시에 추상화와 구체화 모두에게 의존 ▶ DIP 위배

MemberService memberService = new MemberServiceImpl();



📖 주문과 할인 도메인 설계

👀 주문과 할인 정책

  • 회원 상품 주문 가능
  • 회원 등급에 따라 할인 정책 적용 가능
  • 모든 VIP는 1000원을 할인해주는 고정 금액 할인 적용 (변경 가능)
  • 할인 정책의 변경 가능성이 높음 (회사의 기본 할인 정책이 정해지지 않았고, 오픈 직전까지 고민 필요. 할인 미적용 가능성도 있음!)




📖 주문과 할인 도메인 실행과 테스트

Test code

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를 변경했을 경우에도 문제가 없이 잘 실행이 될까???

0개의 댓글