Spring 핵심 원리 - Project 설계 (도메인,레포지,서비스)

김태훈·2023년 1월 3일
0

Spring 핵심 원리

목록 보기
2/15

1. 비즈니스 요구사항과 설계

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

  • 주문과 할인 정책
    회원은 상품을 주문할 수 있다.
    회원 등급에 따라 할인 정책을 적용할 수 있다.
    할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용한다 (나중에 변경 될 수
    있다.)
    할인 정책은 변경 가능성이 높다. (미확정)


아직 DB가 정해지지 않았으므로, 회원 저장소라는 Interface를 만들어 구현체를 달리 한다.
위쪽의 클라이언트, 회원서비스, 회원 저장소는 구현이고,
메모리 회원 저장소, DB회워 저장소, 외부 시스템 연동 회원 저장소는 역할이다.
구현과 역할을 반드시 분리할 것!!

출처 : 김영한님 스프링 강의

2. 설계 개발

회원에는 일반, VIP 등급이 존재 -> 따라서 등급을 나눠야 함.

1. member 패키지 만들기

2. enum 클래스로 등급 만들기

enum 클래스란?
클래스 처럼 보이게 하는 상수로써, 서로 관련있는 상수들 끼리 모아서 대표할 수 있는 이름으로 타입을 정읳나느 클래스이다.

package Goat.core.member;

public enum Grade {
    BASIC,
    VIP
}

3. 회원 Entity 클래스 만들기

package Goat.core.member;

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

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

4. MemberRepository 만들기

당연히 Repository는 인터페이스로 만들어야함에 유의하자.
두가지 기능만 탑재한다고 가정

package Goat.core.member;

public interface MemberRepository {
    
    void save (Member member);
    Member findById(Long memberId);
}

원래는 인터페이스와 구현체를 다른 폴더에 두는 것이 좋지만, 여기서는 그냥 같이 두는 것으로 하자

5. Memory 사용하는 Repository 구현체 작성

package Goat.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);
    }
}

Memory를 사용하는 Repository이므로, HashMap이라는 저장소를 임의로 만들어 사용해 보자.

6. MemberService 인터페이스/구현체 만들기

  • 인터페이스
package Goat.core.member;

public interface MemberService {
    void join(Member member);
    void findMember(Long memberId);
}
  • 구현체
package Goat.core.member;

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);
    }
}
profile
기록하고, 공유합시다

0개의 댓글