회원 관리 예제 - 백엔드 개발
- 비즈니스 요구사항 정리
- 회원 도메인과 리포지토리 만들기
- 회원 서비스 개발
- 회원 리포지토리 테스트 케이스 작성
- 회원 서비스 테스트
비즈니스 요구사항 정리
- 데이터: 회원ID, 이름
- 기능: 회원 등록, 조회
- 아직 데이터 저장소가 선정되지 않음(가상의 시나리오)
웹 애플리케이션 계층 구조

- 컨트롤러: 웹 MVC의 컨트롤러 역할
- 서비스: 핵심 비즈니스 로직 구현
- 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
- 도메인: 비즈니스 도메인 객체, 예)회원,주문,쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
Code
1. 회원 도메인과 레포지토리 만들기
- 요구사항인 Id(식별자), 이름 두가지가 들어간 Member클래스 생성
- 회원 레포지토리(정보 저장소)의 인터페이스를 만든다 4가지 기능 선언.
- 회원 레포지토리를 만들어 인터페이스를 가져온다. 각 메소드의 기능을 구현해준다.
Member
public class Member {
private Long id;
private String name;
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;
}
}
MemberRepository (interface)
public interface MemberRepository {
Member Save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List(Member> findAll();
MemoryMemberRepository
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));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findALl() {
return new ArrayList<>(store.values());
}
}
public void clearStore() {
store.clear();
2. 회원 레포지토리 테스트케이스 작성
- 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비와 실행 자체가 오래걸리고 여러번 반복실행을 테스트 할수없기에 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.
MemoryMemberRepository.Test
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
public class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
repository.clearStore();
}
@Test
public void save() {
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
assertThat(member).isEqualTo(result);
}
@Test
public void findByName() {
Member member1 = new Member();
member1.setName("Spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("Spring2");
repository.save(member2);
Member result = repository.findByName("Spring1").get();
assertThat(result).isEqualTo(member1);
}
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("Spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("Spring2");
repository.save(member2);
List<Member> result = repository.findALl();
assertThat(result.size()).isEqualTo(2);
}
}