스프링 입문 - 회원 관리 예제

이연희·2022년 6월 29일
0

Inflearn_Spring_Study

목록 보기
3/3

Inflearn Spring Study

회원 정보 저장과 서비스

MemoryMemberRepository

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

MemberService

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);
}
profile
공부기록

0개의 댓글