Inflearn Spring 005
스프링 강의 5일차
0. 목차
1. 회원 관리 예제
- ~비즈니스 요구사항 정리~
- ~회원 도메인과 리포지토리 만들기~
- 회원 리포지토리 테스트 케이스 작성
- 회원 서비스 개발
- 회원 서비스 테스트
으로 단계를 나누어서 할 예정이고 오늘은 첫번째 항목까지 포스팅을 하겠습니다!
회원 리포지토리 테스트 케이트 작성
- JUnit이라는 프레임워크로 테스트를 실행하여 기존테스트 방법의 실행시간, 반복실행, 여러 테스트 진행이 어렵다는 단점을 해결한다.
회원 리포지토리 메모리 구현체 테스트
src/test/java
하위 폴더에MemoryMemberRepositoryTest
클래스를 생성한다.- 코드는 아래와 같이 적는다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
repository.clearStore(); // 테스트할때마다 클리어 해주어서 메소드끼리의 의존성 없애기!
}
@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(); // spring2로하면 빨간불!
//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);
}
}
회원 서비스 개발
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
// 회원가입
public Long join(Member member) {
//같은 이름이 있는 중복 회원X
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName((member.getName()))
.ifPresent(m-> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
// 전체회원 조회
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
회원 서비스 테스트
기존에는 회원 서비스가 메모리 회원 리포지토리를 직접 생성
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
}
회원 서비스 코드를 DI 가능하게 변경한다.
public class memberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
회원 서비스 테스트
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.Optional;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach() {
memberRepository.clearStore(); // 테스트할때마다 클리어 해주어서 메소드끼리의 의존성 없애기!
}
@Test
void 회원가입() {
//given
Member member = new Member();
member.setName("hello");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void 중복_회원_예외() {
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}
2. 느낀점
- 개발자가 코드를 새로 만드는 것뿐만 아니라 테스트의 비중도 매우 중요하다.
실제로 약 6~7할 가량이 테스트 코드를 작성하고 있는 모습을 볼 수 있다고 하였음. - 강의를 보면서 따라치기만해서 코드 이해도가 매우 낮은 상태이다. 국비학원에서 충실하게 알려주지 않았다면 따라오기 힘들테니 꼭꼭 복습하는 것을 추천한다. 필자도 간단한 코드임에도 불구하고 전에 배웠던 방식과는 매우 달라서 자주 코드를 보면서 왜 사용했는지 파악하였다.