[스프링 핵심원리 - 기본편] 섹션 2

‎SE-OL·2022년 5월 17일
0

프로젝트 생성

세팅

Project: Gradle Project
Spring Boot: 2.3.x
Language: Java
Packaging: Jar
Java: 11
Dependencies : X

plugins {
 id 'org.springframework.boot' version '2.3.3.RELEASE'
 id 'io.spring.dependency-management' version '1.0.9.RELEASE'
 id 'java'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
 mavenCentral()
}
dependencies {
 implementation 'org.springframework.boot:spring-boot-starter'
 testImplementation('org.springframework.boot:spring-boot-starter-test') {
 exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
 }
}
test {
 useJUnitPlatform()
}

build.gradle 수정 -> 기본 메인 클래스에서 main() 실행하면서 동작 확인 가능

비즈니스 요구사항과 설계

회원 도메인

요구사항

-회원가입 및 조회
-회원 등급 (일반과 VIP)
-회원 각자 DB구축 및 연동

설계

Client -> Service -> Repository //객체 다이어그램
Repository <= 메모리 회원 Repo + DB 회원 Repo + 외부 시스템 연동 회원 Repo

개발

설계 시 필요했던 것들을 찬찬히 생각해보자 ... 일단 member package를 만들어서 깔끔하게 정리하면 보기 좋다 !..
회원 등급을 enum으로 제작해서 vip, 일반으로 나눈다 ... -> 멤버 가입도 해야겠네?? 그럼 class를 생성해서 가입 시 필요한 함수들도 작성해봐야겠군 .. -> 이제 레포를 사용하기 위해 인터페이스 구성을 하자 ! -> 인터페이스를 implements한 저장소를 실제로 구현하는 코드 필요하겠군 .. -> 이제 멤버의 상세정보는 구현했으니 그와 관련된 서비스를 구현해보자고 ....-> 인터페이스 생성 -> 구현 ..
=> 이제 ... 실행 ... 할 수 있는 조건이 갖춰짐 ^^
//코드 파일은 너무 많아서 생략하겠서용

실행 및 테스트

위의 로직으로 실행하기 전에 미리 테스트해보는 것이 좋지만 강의를 따르겠습니당.
패키지를 나가서 App을 돌리는 main()파일을 만듭니다.

public static void main(String[] args) {
        MemberService memberService = new MemberServiceImpl();
        Member member = new Member(1L, "memberA", Grade.VIP);//ctrl+alt+V해서 객체 생성
        memberService.join(member);//멤버생성
        Member findMember = memberService.findMember(1L);//가입확인
        System.out.println("new member = " + member.getName());
        System.out.println("find Member = " + findMember.getName());
    }


일단 확인은 된다.
테스트 실행을 위해 test>java>hello.core>member 패키지 생성 후

package hello.core.member;


import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

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


깨긋해용 조아용~
하지만 의존관계와 앞서 설명한 객체지향에 대한 문제점이 존재함.
할당하는 부분이 구현체를 의존하면서(추상화 구체화 모두 의존) -> 딱봐도 안좋음 ㅡㅡ -> DIP위반

주문과 할인 도메인

요구사항

  • 회원의 상품 주문
  • 등급에 따른 할인 정책
  • VIP의 고정 금액 할인
  • 할인 정책의 변동성

설계

일단 로직을 그림으로 확인해보는게 이해하는데 쉬움!
1. 주문 생성: 클라이언트는 주문 서비스에 주문 생성을 요청한다.
2. 회원 조회: 할인을 위해서는 회원 등급이 필요하다. 그래서 주문 서비스는 회원 저장소에서 회원을
조회한다.
3. 할인 적용: 주문 서비스는 회원 등급에 따른 할인 여부를 할인 정책에 위임한다.
4. 주문 결과 반환: 주문 서비스는 할인 결과를 포함한 주문 결과를 반환한다.

//강의노트에서 쌔비쥐

각자 주문 서비스 구현체에서 -> DB 회원 저장소 + 정률 할인 정책 or 메모리 회원 저장소 + 정액 할인 정책 둘로 나눠줘야함.=> 협력관계 재사용 가능한 로직
벌써 대박적으로 복잡함 ! !

개발

할인 정책 dicount package 생성
주문 관리 Order package 생성
//많은 부분이 위와 동일해서 생략

실행 및 테스트

public static void main(String[] args) {
        MemberService memberService = new MemberServiceImpl();
        OrderService orderService = new OrderServiceImpl();
        long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);
        Order order = orderService.createOrder(memberId, "itemA", 10000);
        System.out.println("order = " + order);
    }


테스트 또한 성공!!
//로직에 대한 이해 좀 더 필요함 ..

0개의 댓글