[스프링 핵심원리 기본편] 2. (2) 회원 도메인 설계와 개발

코린이서현이·2023년 11월 9일
0

💧들어가면서💧

이 물이 뭘까? 1. 땀 2. 눈물 
정답은 그냥 "물"이다. 왜냐면 나는 힘들어도 눈물을 잘 흘리지는 않지 (˘・_・˘) 

🎯 목표

📌 회원 도메인 설계
📌 회원 도메인 개발
📌 회원 도메인 테스스

📌 회원 도메인 설계

☑️ 회원 도메인 요구사항

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

🤔 구현과 역할을 왜 나눈다고 했지요?

확장을 가능하게!!

회원 도메인 협력 관계


역할에 대한, 회원저장소에 대한 역할을 메모리 회원 저장소, DB 회원 저장소, 외부 시스템 연동 회원 저장소으로 구현!

회원 클래스 다이어그램

☑️ 실제 구현 레밸 : 인터페이스와 클래스

(사실 정적)

회원 객체 다이어그램

☑️

(사실 동적)

📌 회원 도메인 설계

⏺️ Grade

package hello.core.member;

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

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

📐 MemberRepositroy

public interface MemberRepository {

  void save(Member member);

  Member finbyId(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 finbyId(Long memberId) {
    return store.get(memberId);
  }
}

📐 MemberService

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.finbyId(memberId);
  }
}

📌 회원 도메인 테스트

📄 MemberServiceTest

class MemberServiceTest {

  MemberService memberService = new MemberServiceImpl();

  @Test
  void join() {
    //given
    Member member = new Member(1L,"memberA",Grade.VIP);

    //when
    memberService.join(member);
    Member findMember = memberService.findMember(1L);

    //then
    Assertions.assertThat(member).isEqualTo(findMember);
  }
}

⭐ 테스트코드를 짜는 것이 중요해요!

⚠️ 이 회원 도메인 설계의 문제점 ⁉️

🤔 이 코드의 설계상 문제점은 무엇일까요?
다른 저장소로 변경할 때 OCP 원칙을 잘 준수할까요?
DIP를 잘 지키고 있을까요?

public class MemberServiceImpl implements MemberService{
  private final MemberRepository memberRepository = new MemoryMemberRepository();

➡️ MemberService에서 구현체에 의존한다.
의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글