[작성일: 2023. 05. 12]
회원 관리
회원 서비스 개발
service.class
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
public Long join(Member member) {
// 회원 가입
// 같은 이름의 중복 회원은 허용하지 않는다는 룰 생성
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> findeOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
회원 서비스 테스트
- 기존에는 회원 서비스가 메모리 회원 리포지토리를 직접 생성하게 했지만, 그럴 경우 test에서 new를 사용하여 새로운 객체가 생성된다. 지금은 static이라 상관없을지 몰라도 나중에는 다른 객체들이 생성될 확률이 높기 때문에 코드를 수정해주어야 한다.
- 회원 서비스 코드를 DI 가능하게 변경한다.
MemberService
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
MemberServiceTest
- (window 기준) ctrl + shift + T를 누르면 쉽게 Test Class를 작성할 수 있다.
- Test는 사실 과감하게 한글로 작성해도 된다. (ex : Join ➡️ 회원가입)
- given, when, then 활용
- 인텔리제이 static import : alt + enter ➡️ Add on - demand static import
- ctrl + alt + V : 자동으로 값을 저장할 변수 생성(편리함)
- Shift + F10 : 이전에 실행했던 Test를 다시 실행해줌.
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 static org.assertj.core.api.Assertions.assertThat;
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("이미 존재하는 회원입니다.");
// try {
// memberService.join(member1);
// fail();
// } catch(IllegalStateException e) {
// assertThat(e.getMessage()).isEqualTo("이미 존하는 회원입니다.");
// }
// then
}
- @BeforeEach : 각 테스트 실행 전에 호출되며, 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고 의존관계를 새로 맺어준다.
🐣 출처: 인프런 김영한님 강의
이 글은 인프런의 김영한님 스프링 강의를 보고 작성한 글입니다.
강의를 들으면서 정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.