Spring(기초) - 회원 관리 예제(1)

Kwon Yongho·2023년 3월 29일
0

Spring

목록 보기
2/37
post-thumbnail

회원 관리 예제

  1. 비즈니스 요구사항 정리
  2. 회원 도메인과 리포지토리 만들기
  3. 회원 리포지토리 테스트 케이스 작성
  4. 회원 서비스 개발
  5. 회원 서비스 테스트

1. 비즈니스 요구사항 정리

  • 컨트롤러: 웹 MVC의 컨트롤러 역할
  • 서비스: 핵심 비즈니스 로직 구현
  • 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

2. 회원 도메인과 리포지토리 만들기

/hello/spring/domain/Member.class

package hello.spring.domain;

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

/hello/spring/repository/MemberRepository.interface

package hello.spring.repository;

import hello.spring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

/hello/spring/repository/MemoryMemberRepository.class

package hello.spring.repository;

import hello.spring.domain.Member;

import java.util.*;

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;
    }
    // sequence = key값 생성

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

3. 회원 리포지토리 테스트 케이스 작성

test/java/hello/spring/repository/MemoryMemberRepositoryTest.java

package hello.spring.repository;

import hello.spring.domain.Member;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

    @Test
    public void save() {

        //given
        Member member = new Member();
        member.setName("spring");

        //when
        repository.save(member);

        //then
        Member result = repository.findById(member.getId()).get();
        assertThat(result).isEqualTo(member);
    }

    @Test
    public void findByName() {

        //given
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);
        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        //when
        Member result = repository.findByName("spring1").get();

        //then
        assertThat(result).isEqualTo(member1);
    }

    @Test
    public void findAll() {

        //given
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);
        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        //when
        List<Member> result = repository.findAll();

        //then
        assertThat(result.size()).isEqualTo(2);
    }
}


테스트 시 오류 발생

  • 이유?
    findAll에서 member1 에 spring1를 이미 저장했는데
    findName에서 한번 더 저장하기 때문에 오류 발생

All 테스트 시 순서대로 작동하지 않기 때문에 순서 의존적으로 테스트케이스를 작성해서는 안됨
--> 테스트가 끝나면 데이터를 clear 해줘야 함.

@AfterEach : 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다. 이렇게
되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다. @AfterEach 를 사용하면 각 테스트가
종료될 때 마다 이 기능을 실행한다. 여기서는 메모리 DB에 저장된 데이터를 삭제한다.

소스추가

 // 구현체에 추가
 public void clearStore() {
 store.clear();
 }
 
 //테스트케이스에 추가
 @AfterEach
 public void afterEach() {
     repository.clearStore();
 }
 


소스 수정 후 테스트 성공

참고
김영한: 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(인프런)
Github - https://github.com/b2b2004/spring-ex

0개의 댓글