일반적인 웹 애플리케이션 계층 구조
아직 데이터 저장소가 선정되지 않은 경우, 인터페이스 및 구현 클래스를 만들어 추후 구현 클래스를 변경할 수 있도록 설계한다.
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
...
}
*다만 HashMap은 동시성 문제가 고려되어 있지 않아, 실무에서는 ConcurrentHashMap, AtomicLong 사용을 고려한다.
자바는 JUnit이라는 프레임워크로 테스트를 실행한다.
테스트는 각각 독립적으로 실행되어야 한다. 테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.