카테고리 없음

[SPRING.핵심2] 회원&주문 예제

Mink__02 2024. 3. 14. 14:09

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

[ 1 ]  회원

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

[ 2 ] 주문& 할인 정책


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

 


 

2. 회원 Domain 

[ 1 ] 회원 Domain 설계

▷ Enum(Enumeration)
: 관련 있는 상수들의 집합
- 상수로 사용 가능, 메서드 정의 가능, 싱글톤 패턴을 구현하는데 사용

 

[ 2 ] 회원 Domain 개발ㅋ

.↑ spring component package                                                                                 ↑  spring test code pacage                            

Member Entity

//Grage
public enum Grade {
    Basic,
    Vip
}
//------------------//

//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;
    }
    //Getter Setter
    public Long getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public Grade getGrade() {
        return grade;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}

Member Repository

//MemberRepository

public interface MemberRepository {
    //Member 저장하기
    void save(Member member);
    //Member 찾기
    Member findById(Long memberId);
}
//----------------------------------

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

MemberService

//MemberService.java
public interface MemberService {

    void join(Member member);

    Member findMember (Long memberId);
}
//---------------------------------//

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

 

[ 3 ] 회원 Domain Code 분석

Entity → Repo → Service → Application (Botton Up) 방식.

 

Member Entity

- Member entity 객체에 id, name, grade 를 가진다. grade는 하나의 객체로 설정하였고 basic/vip로 설정할 수 있다.
- 생성자(호출되면, member에 대한 id/name/grade 속성), get&setter도 넣어준다

setter/getter → request/response 로 바꿀 수 있지 않을까,,? 에 대해 고민해보자

 

Member Repository

- Service (가입/찾기) 에 따른 Repository를 interface로 구현해준다. 
- return 값이 없는 void join / Member 객체로 return 할 findMember 객체로 구성한다.
- MemoryRepository는 key:Long / value: Member 형태로 저장되며, 객체 변수명은 store로 지정한다.
( store.put / store.get 은 java Map의 function이다)

Member Service

- Member 객체를 가입/ memberId를 받아 Member로 반환하는 function 설정
- MemberServiceImpl에서 구현한다.
- MemberServiceimpl는 MemberService를 override
- MemberRepository를 memoryRepository로 구체화 한다.

 


3. 주문 domain

 

[ 1 ] 주문 domain 설계