[Spring] 입문_백엔드 개발(2)

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

[ 회원 객체 ]

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

[ 회원 레포지토리 인터페이스 ]

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();
}
  • Optional은 findById, findByName의 결과가 null인 경우 Optional로 감싸서 null반환

[ 회원 레포지토리 메모리 구현체 ]

  • Repository interface를 가지고와서 동작하게 만듦
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;  // key값 생성

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        // null인경우 대비+클라이언트에서 뭔가를 할 수 있음
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        // 루프돌면서 확인하다가 동일한게 있으면 반환, 없으면 optional에 null포함시켜 반환
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());  // store.values()=member리스트 값들
    }

	// 레포지토리 테스트 시 필요
    public void clearStore() {
        store.clear();
    }
}

2. 테스트 케이스 작성

[ save() ]

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

public class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

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

        Member result = repository.findById(member.getId()).get();
        // 검증: 내가 입력한 member랑 저장한 후 id로 찾은 result랑 동일?
        // System.out.println("result = " + (result == member));
        // Assertions.assertEquals(member, result);  // 출력되는건 없고 녹색불
        Assertions.assertThat(member).isEqualTo(result);  // core
    }
    ..
}

[ findByName() ]

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

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

    Member result = repository.findByName("gayoung1").get();  // .get으로 꺼내기
    Assertions.assertThat(result).isEqualTo(member1);
    }
  • 성공 시
  • 실패 시

[ findAll() ]

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

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

    List<Member> result = repository.findAll();
    Assertions.assertThat(result.size()).isEqualTo(2);
}

[ Test 전체실행 ]

  • 전체 실행을 한다면, test는 순서대로 test되지않음
  • findAll() 과 findByName()에서 member1, member2가 겹침 -> 테스트 하나 끝나고 나면 clear해줘야함
  • 우리가 회원 레포지토리 메모리 구현체(MemoryMemberRepository)에 clearStore() 작성해준 이유
  • afterEach()함수 추가 필수!
@AfterEach
public void afterEach() {
    repository.clearStore();
}

좋은 웹페이지 즐겨찾기