store: 회원을 회원 아이디 번호와 함께 저장하기 위한 변수
sequence: 회원 아이디 번호
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
sequence를 증가시키고 회원 아이디로 저장, 멤버를 반환
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
회원 아이디가 없을 경우를 대비하여 ofNullable로 감싸서 반환(null 값이 반환될 수 있다.)
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
회원 이름으로부터 회원이 있는지 조회하는 로직
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
findByName() 메서드로 멤버가 존재하는지 확인하고 회원을 등록하는 로직
//회원가입
public Long join(Member member) {
//같은 이름이 있는 중복 회원X
//중복 회원 검증
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m->{
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
테스트 간에 의존을 없애주고 독립적으로 실행 가능하게 한다. 여러 테스트를 실행하면 메모리 DB에 직전 테스트 결과가 남을 수 있는데, 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다. @AfterEach를 사용하면 메모리 DB에 저장된 데이터를 삭제한다.
@AfterEach
public void afterEach(){
repository.clearStore();
}
각 테스트를 실행하기 전에 호출된다. memberService 객체를 생성하기 위해 memberRepository를 의존 주입한다. 아래의 beforeEach() 메서드는 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고, 의존관계를 새로 맺어준다.
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}