티스토리 뷰

비즈니스 요구사항과 설계

  • 회원
    • 회원을 가입하고 조회할 수 있다.
    • 회원은 일반과 VIP 두 가지 등급이 있다.
    • 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)
  • 주문과 할인 정책
    • 회원은 상품을 주문할 수 있다.
    • 회원 등급에 따라 할인 정책을 적용할 수 있다.
    • 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경될 수 있다.)
    • 할인 정책은 변경 가능성이 높다.
      회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다.
      최악의 경우 할인을 적용하지 않을 수도 있다. (미확정)

요구사항을 보면 회원 데이터, 할인 정책 같은 부분은 지금 결정하기 어려운 부분이다.

 

그렇다고 이런 정책이 결정될 때 까지 개발을 무기한 기다릴 수도 없다.

우리는 앞에서 배운 객체 지향 설계 방법이 있지 않은가!!??

 

따라서 인터페이스를 만들고 구현체를 언제든지 갈아끼울 수 있도록 설계하면 된다.



회원 도메인 설계

회원 도메인 요구사항

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



회원 도메인 개발

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

}


Grade

public enum Grade {
    BASIC, VIP
}


MemberRepository: interface

public interface MemberRepository {

    void save(Member member);
    Member findById(Long memberId);
}


MemoryMemberRepository: MemberRepository에 대한 구현체

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: interface

public interface MemberService {
    void join(Member member);
    Member findMember(Long memberId);
}


MemberServiceImpl: MemberService에 대한 구현체

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



이번 강의 후기

요즘 새로운 프로젝트 설계하면서 어디서부터 어디까지 설계를 완벽하게 해야할지 고민이 됐는데,
이렇게 요구사항을 나열하고 다이어그램으로 그리는 방식이 도움되는거 같다.
매번 생각하지만 좋은 설계하는건 정말 어렵다. (설계 왕왕초보)

 

그리고 요즘엔 repository 인터페이스는 쓰지만,

Service를 인터페이스로 만들고 구현체 클래스 만들어서 쓰는 방식으로 개발하지 않아서 오랜만에 봐서 조금 어색했다.

 

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함