-
스프링 핵심 원리 - 기본편 (2) 스프링 핵심 원리 이해1 - 예제 만들기Back-End/Spring 2022. 8. 21. 23:31
📖 프로젝트 설정
- dependencies 설치 후, gradle 새로 고침설정을 변경한 후에는 꼭 새로고침을 눌러주어야 한다!
- setting > gradlegradle로 실행하는 것보다 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를 변경했을 경우에도 문제가 없이 잘 실행이 될까???'Back-End > Spring' 카테고리의 다른 글
스프링 핵심 원리 - 기본편 (3) 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) 2022.08.21 스프링 핵심 원리 - 기본편 (1) 객체 지향 설계 스프링 (0) 2022.08.21 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (7) AOP (0) 2022.08.21 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (6) 스프링 DB 접근 기술 (0) 2022.08.21 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (5) 회원 관리 예제 - 웹 MVC 개발 (0) 2022.08.14