이 물이 뭘까? 1. 땀 2. 눈물
정답은 그냥 "물"이다. 왜냐면 나는 힘들어도 눈물을 잘 흘리지는 않지 (˘・_・˘)
📌 회원 도메인 설계
📌 회원 도메인 개발
📌 회원 도메인 테스스
확장을 가능하게!!
역할에 대한, 회원저장소에 대한 역할을 메모리 회원 저장소
, 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
에서 구현체에 의존한다.
의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있음