반응형

Eclipse(STS)로 세팅 하는 방법

 

1. 사전 준비

- JAVA11 설치 (https://www.oracle.com/kr/java/technologies/javase/jdk11-archive-downloads.html)

- STS설치 (https://spring.io/tools)

자바 11 설치

 

STS 설치

 

2. 스프링 부트 스타터 사이트에서 스프링 프로젝트 생성 (https://start.spring.io)

 

3. STS 설정

- 2.에서 GENERATE한 스프링 프로젝트 원하는 경로에 core.zip 압축 해제

- STS 다운로드 후 압축 해제 → contents.zip 압축 해제 → sts-4.17.2.RELEASE 폴더의 SpringToolSuite4.exe 실행 → 위의 core.zip 압축해제 한 곳으로 Workspace 지정

 

 

4. 순수 자바로 가상의 요구사항 개발

 

4-1) 회원 도메인 설계

회원 저장소에 대한 요구 사항이 명확하지 않아 인터페이스와 구현체를 분리

회원 서비스에 대한 역할도 인터페이스와 구현체를 분리

클라이언트에서 MemberServiceImpl로 실행 로직 구현

 

※ 생각해보기

회원 서비스 구현체

package hello.core.member;

public class MemberServiceImpl implements MemberService {
	// 생각해볼 포인트
	private final MemberRepository memberRepository = new MemoryMemberRepository();
	
	public void join(Member member) {
		memberRepository.save(member);
	}
	public Member findMember(Long memberId) {
		return memberRepository.findById(memberId);
	}
}

 

클라이언트

package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
public class MemberApp {
	public static void main(String[] args) {
		// 생각해볼 포인트
		MemberService memberService = new MemberServiceImpl();
		Member member = new Member(1L, "memberA", Grade.VIP);
		memberService.join(member);
		Member findMember = memberService.findMember(1L);
		System.out.println("new member = " + member.getName());
		System.out.println("find Member = " + findMember.getName());
	}
}

문제점
다른 저장소로 변경할 때 OCP 원칙을 잘 준수하지 못했음.
DIP를 잘 지키고 있지 못함.
의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음

 

 

4-2) 주문 도메인 설계

회원 저장소에 대한 요구 사항이 명확하지 않아 인터페이스와 구현체를 분리

할인 정책에 대한 요구 사항이 명확하지 않아 인터페이스와 구현체를 분리

회원 서비스에 대한 역할도 인터페이스와 구현체를 분리

클라이언트에서 MemberServiceImpl 와 OrderServiceImpl로 실행 로직 구현

 

※ 생각해보기

주문 서비스 구현체

package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;

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

 

클라이언트

package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.order.Order;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;

public class OrderApp {
	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);
	}
}

회원 도메인에서와 마찬가지로 같은 문제점 발생

반응형

+ Recent posts