[Spring Boot][2] 2-1. 스프링 핵심 원리 이해 - 예제 만들기

sorzzzzy·2021년 8월 20일
0

Spring Boot - RoadMap 1

목록 보기
3/46
post-thumbnail

🏷 프로젝트 생성

지금까지 우리가 배운대로, 역할구현을 나누어서(인터페이스와 구현 객체를 나누어서), 개발을 해볼 건데, (스프링의 도움 없이)순수한 JAVA로만 개발해보겠다 😉

📌 사전 준비물

  • Java 11 설치
  • IDE: IntelliJ 또는 Eclipse 설치

이전에 개발환경 설정, 프로젝트 생성하는 포스팅을 올린 적이 있기 때문에, 최소한만 작성하고 넘어가겠다 😉

✔️ 개발환경 설정, 프로젝트 생성하기

앗❗️ 나는 전에 자바 ver8을 설치했어서 ver11으로 다시 바꿔주었다 !

✔️ 스프링 부트 스타터 사이트에서 프로젝트 생성
프로젝트 선택
-> Project: Gradle Project
-> Spring Boot: 2.5.3
-> Language: Java
-> Packaging: Jar
-> Java: 11
Project Metadata
-> groupId: hello
-> artifactId: core
-> Dependencies: 선택하지 않는다(스프링 코어 쪽 라이브러리만 가지고 간단히 구성해줌)


⬆️ preference -> 검색창에(gradle)입력 -> 빌드 관련 부분 위와 같이 수정
-> Gradle을 통해 실행시키면 조금 느리기 때문에 IntelliJ 로 바꿔줌!

프로젝트 환경 설정 끄읏 👏🏻



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

회원, 주문, 할인정책 총 3가지의 요구사항이 있다!

✔️ 회원

  • 회원을 가입하고 조회할 수 있다.
  • 회원은 일반과 VIP 두 가지 등급이 있다.
  • 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수도 있다(이 기능을 외주를 주거나 회사 외부에서 만들어놓은 시스템을 가져다 사용할 수도 있다). (미확정)

✔️ 주문 & 할인 정책

  • 회원은 상품을 주문할 수 있다.
  • 회원 등급에 따라 할인 정책을 적용할 수 있다.
  • 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있음)
    회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다.
    최악의 경우 할인을 적용하지 않을 수도 있다. (미확정)

요구사항을 보면 회원 데이터, 할인 정책 같은 부분은 지금 결정하기 어려운 부분이다 😂
그렇다고 이런 정책이 결정될 때 까지 개발을 무기한 기다릴 수도 없다!
우리는 앞에서 배운 객체 지향 설계 방법을 사용하면 된다 우하하하 😆
인터페이스를 만들고 구현체를 언제든지 갈아 끼울 수 있도록 설계하면 된다!

📌 참고 : 프로젝트 환경설정을 편리하게 하려고 스프링 부트를 사용한 것! 지금은 스프링 없는 순수한 자바로만 개발을 진행할 것이고, 스프링 관련 내용은 나중에 등장한다 😉



🏷 회원 도메인 설계

✔️ 회원 도메인 요구사항

  • 회원을 가입하고 조회할 수 있다.
  • 회원은 일반과 VIP 두 가지 등급이 있다.
  • 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)

✔️ 회원 도메인 협력 관계

  • 클라이언트가 회원 서비스를 호출한다.
  • 회원 서비스는 2가지 기능을 제공한다(가입,조회).
  • 회원 저장소의 역할을 3가지로 나눈다(메모리 회원 저장소/DB 회원 저장소/외부 시스템 연동 회원 저장소).
    구현체를 이 셋 중 하나로 선택하면 됨

✔️ 회원 클래스 다이어그램

  • 실제 구현 레벨로 내려온 것
  • MemberService 라는 역할을 인터페이스로 만들고, 그것에 대한 구현체로 MemberServiceImpl를 만듦
  • MemberRepository 회원 저장소의 역할을 인터페이스로 만들고, 그것에 대한 구현클래스로 MemoryMemberRepository, DbMemberRepository를 만듦

✔️ 회원 객체 다이어그램

  • 객체 간 메모리 참조가 어떻게 되는 지 그린 것
  • 클라이언트는 회원 서비스(Impl)를 바라보고, 회원 서비스(Impl)는 메모리 회원 저장소를 바라봄


🏷 회원 도메인 개발

✔️ hello.core/member/Grade 생성 (클래스 생성 시 Enum 으로 생성)

package hello.core.member;

public enum Grade {
    BASIC,
    VIP
}

✔️ hello.core/member/Member.java 클래스 생성

package hello.core.member;

public class Member {
    private Long id;
    private String name;
    private Grade grade;

    // 생성자 만들기
    // 단축키 Command+N
    public Member(Long id, String name, Grade grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}

📌 단축키 확인 : preference->Keymap

✔️ hello.core/member/MemberRepository.java ❗️인터페이스❗️ 생성

package hello.core.member;

public interface MemberRepository {
    
    void save(Member member);

    Member findById(Long memberId);
}

💡 원래는 인터페이스와 구현체를 다른 패키지에 두는 것이 좋은 방법이지만, 우리는 배우는 단계이므로 일단 같은 패키지에 두겠음!

✔️ hello.core/member/MemoryMemberRepository.java 클래스 생성

package hello.core.member;

import java.util.HashMap;
import java.util.Map;

public class MemoryMemberRepository implements MemberRepository{
    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}

✔️ hello.core/member/MemberService.java ❗️인터페이스❗️ 생성

package hello.core.member;

public interface MemberService {
    void join(Member member);

    Member findMember(Long memberId);
}

✔️ hello.core/member/MemberServiceImpl.java 클래스 생성

package hello.core.member;

public class MemberServiceImpl implements  MemberService{
    // 가입을 하고 회원을 찾으려면 앞서 만든 MemberRepository 인터페이스가 필요함
    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);
    }
}

다음 시간에 이어서 계속.....🤚🏻

profile
Backend Developer

0개의 댓글