회원 서비스 클래스를 만들어보자
회원 서비스는, 회원 도메인
과 회원 리포지토리
를 활용해서 실제 비즈니스 로직을 작성한다.
MemberRepository, 즉 리포지토리에서는 save, findById, findByName 처럼 단순히 데이터를 저장소에 넣었다뺐다 하는 느낌이 들었다.
그런데, MemberService, 즉 서비스에서는 join, findMembers 처럼 네이밍이 좀 더 비즈니스적이다. 서비스 클래스에서는 비즈니스에 가까운 용어를 써야 한다.
service/MemberService.java
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) {
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m ->{
throw new IllegalStateException("이미 존재하는 회원입니다");
});
}
/**
* 전체 회원 조회
*/
public List<Member> findMembers(){
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);
}
}
서비스는 비즈니스에 의존적으로 설계하고, 리포지토리는 "단순히, 기계적으로, 데이터 넣었다빼" 이런 느낌의 네이밍으로 설계하는 것이 좋다.
서비스 클래스 작성을 완료했다. 이제, 정말 회원 이름이 중복되면 익셉션이 발생되는지 검증을 해볼 차례이다. 다음 포스팅에서는 테스트 케이스를 작성해볼 것이다.