회원 관리 예제 - 백엔드 개발1(repository, test)

김현지·2023년 5월 18일
0

Spring

목록 보기
5/5

비즈니스 요구사항 정리

  • 저장할 데이터 : 회원ID, 이름
  • 기능 : 회원 등록, 조회
  • 시나리오 : DB 미선정 상태 -> interface 필요

코드 작성하기

  1. src > main > hello.hellospring에 domain패키지 생성 후 Member클래스 작성합니다.
package hello.hellospring.domain;

//Member객체 생성하게 되는 클래스
public class Member {

//회원 번호(식별자, 임의의 값, 시스템이 저장할 아이디), 외부에서 변경불가.
    private Long id; 
//가입자 이름, 외부에서 변경불가
    private String name; 

    //getter, setter, toString()등 생성 단축키 : alt+insert
    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;
    }
}
  1. src > main > hello.hellospring에 repository패키지 생성 후 MemberRepository인터페이스를 작성합니다.
    • interface : 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스입니다. 다중 상속이 가능합니다.
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

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


public interface MemberRepository{
    //회원 정보 저장할 메소드
    Member save(Member member);
    //null값 발생 시 Optional로 wrapping해서 처리.
    //id값 기준으로 회원정보 찾는 메소드
    Optional<Member> findById(Long id);
    //회원 이름 기준으로 회원정보 찾는 메소드
    Optional<Member> findByName(String name);

    List<Member> findAll();

}
  1. src > main > hello.hellospring > repository에 MemoryMemberRepository클래스를 작성합니다. 이 때 implements 예약어를 사용해서 MemberRepository인터페이스를 상속 받고 구현합니다.
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) {
        // 값이 없으면 null이 나오므로 optional로 감싸서 반환(client에서 추가작업 가능)
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                //filter(람다)
                .filter(member ->  member.getName().equals(name)) //파라메터 값이랑 member.getName값과 일치하면 반환
                .findAny();//하나라도 찾는 것
                //없으면 Optional에서 null을 감싸서 반환
    }

    @Override
    public List<Member> findAll() {
        //store에 저장된 멤버들이 ArrayList에 담겨져서 반환 됨
        return new ArrayList<>(store.values());
    }
}
  1. 동작 검증을 위한 테스트(협업 시 필수) 케이스 작성
  • 테스트 케이스 : JUnit이라는 프레임워크로 테스트 케이스 실행 -> 테스트 효율성 증대.
    테스트 클래스는 '테스트 할 클래스명+Test '으로 작명
  • 테스트는 동작 순서에 의존하면 안된다. 순서와 무관하게 데이터를 입력해야하므로 store를 비우는 메소드와 @AfterEach가 필요함
  • 테스트 후 개발을 하는, 뒤집는 방법 : 테스트 주도 개발(TDD)
  • 이번 강의는 구현 클래스부터 만들고 그 후에 테스트 함
  1. src > test > java > hello.hellospring > repository 에 MemoryMemberRepositoryTest 작성

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 static org.assertj.core.api.Assertions.assertThat;

//다른곳에서 사용하는 클래스가 아니므로 접근제한자 생략 가능
//class레벨에서 테스트를 실행하면 테스트 클래스 전체가 실행 됨.
class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

    //@Test가 하나 끝날때 마다 repository를 초기화 해주는 것이 필요
    @AfterEach //어떤 작업이 끝나고 수행하는 callback메소드
    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();
        //sysout으로 디버깅하던걸 대체. 출력되는건 없지만 정상적으로 테스트가 됨.
        //Assertions.assertEquals(result, member);
        
        //편의성을 조금 더 개선한 것, assertj
        //Alt+Enter로 static import하면 8행과 같은 코드가 생기고, Assertions를 입력하지 않아도 된다.
        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();
        //아래의 isEqualTo와 같지 않아서 테스트 에러 발생
        //Member result = repository.findByName("spring2").get();
        
        assertThat(result).isEqualTo(member1);
    }
    
}

0개의 댓글

관련 채용 정보