저번에 만든 레파지토리를 사용하여 회원 서비스를 만들기 위해 service 디렉토리를 생성하였다. 멤버 서비스는 다음과 같이 구현한다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired //DI로 repository필요하구나 -> 연결
public MemberService(MemberRepository memberRepository) { //생성자 -> member repostiory를 인자로 받음
this.memberRepository = memberRepository; //dependency injection
}
/**
*
회원가입
*/
public Long join(Member member) {
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) { //단축키 ctrl+t로
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);
}
}
멤버 서비스의 기능은 간단하게 회원 가입 및 중복 회원 검출, 전체 회원 조회, id로 멤버 검색이다. 해당 서비스가 잘 돌아가는데 테스트 코드를 작성하였다. 위에서 만든 멤버 서비스에서 ctrl
+ shift
+ t
-> create new test
를 눌러 테스트 코드의 틀을 쉽게 만들 수 있다. 이후 테스트코드를 작성하자.
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();//멤버 레파지토리 생성
memberService = new MemberService(memberRepository); //멤버 서비스 생성/dependency injection
}
@AfterEach
public void afterEach() {
memberRepository.clearStore(); //레파지토리를 비운다.
}
@Test
public void 회원가입() throws Exception {
//Given
Member member = new Member();
member.setName("hello");
//When
Long saveId = memberService.join(member);
//Then
Member findMember = memberRepository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
}
@Test
public void 중복_회원_예외() throws Exception {
//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("이미 존재하는 회원입니다.");
}
}
테스트 코드의 경우 함수 이름에 한글이 들어가도 상관이 없고 더 직관적이기 때문에 한글 이름으로 작성하는게 효율적이다. 모든 케스트가 정상적으로 동작하는 것을 확인할 수 있다.