회원 관리 예제

황준하·2023년 6월 20일

Spring 기본

목록 보기
2/38
post-thumbnail

요구사항 정리

데이터: 회원ID, 이름

기능: 회원 등록, 조회

컨트롤러

   웹 MVC의 컨트롤러 역할

서비스

   핵심 비즈니스 로직 후현

리포지토리

   데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리

도메인

   비즈니스 도메인 객체 ex)회원, 주문 쿠폰 등등 주로 DB에 저장하고 관리됨

회원 도메인과 리포지토리

package hello.hellospring.repository;

import hello.hellospring.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();
}
package hello.hellospring.repository;

import hello.hellospring.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;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));      //null이 반환되는걸 방지
    }

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

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

작성하는 이유

개발한 기능을 테스트할때, 자바의 main 메서드를 이용해서 실행한다.

이러한 방법은 시간이 너무 오래걸리고, 반복해서 테스트가 어렵고, 여러 테스트를 한번에 실행하기 어렵다.

JUnit이라는 프레임 워크로 테스트를 실행해서 이 문제를 해결할 수 있다.

테스트주도개발 TDD

개발하기 전에 미리 테스트 케이스를 작성하기도 한다.

package hello.hellospring.repository;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import hello.hellospring.domain.Member;

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

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

class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach(){
        repository.clearStore();    
        //여러개의 메소드가 동시에 테스트되기때문에 하나가 끝날때마다 store를 지워줘야 한다.
    }

    @Test
    public void save(){
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        Member result = repository.findById(member.getId()).get(); 
        //Optional은 get()으로 꺼낼수 있지만 좋은방법은 아님.
        //방법1. Assertions.assertEquals(member, null);
        assertThat(member).isEqualTo(result);       
        //alt+Enter => add on-demand static import~
    }

    @Test
    public void findByName() {
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();      //shift + F6 => rename
        member2.setName("spring2");
        repository.save(member2);

        Member result = repository.findByName("spring2").get();

        assertThat(result).isEqualTo(member2);
    }

    @Test
    public void findALL(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring1");
        repository.save(member2);

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

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


}

0개의 댓글