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위반
일단 로직을 그림으로 확인해보는게 이해하는데 쉬움!
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);
}
테스트 또한 성공!!
//로직에 대한 이해 좀 더 필요함 ..