회원 서비스 개발과 테스트
회원의 도메인과 리포지토리에 관한 내용을 설계했으니, 이를 토대로 비즈니스 로직을 건드려볼 차례다. 먼저 main method의 하위 package로 service 를 생성한 후, MemberService
라는 class를 생성한다.
이 후, MemberService
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();
// 1.
/**
* 2.
*/
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("이미 존재하는 회원입니다.");
});
}
/**
* 3.
*/
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
각 코드 라인에 주석으로 넘버링을 해두었고, 다음은 그 라인에 관한 설명이다.
MemoryMemberRepository
객체를 생성한다.Optional<member> result = memberRepository.findByName(member.getName());
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
로 나타내어진 코드이나 ifPresent
문법을 사용하기 위해 전에
언급했던 Optional
로 코드를 감쌌다. Optional
의 최대 장점이 여기서 나온다. 단순히 NPE(NullPointerException) 를 피하기 위해서도 사용하지만 Optional
은 Wrapper class. 즉, 클래스이므로 각종 메소드를 제공해준다는 것이다. ifPresent
문법은 참조하는 변수(위 코드에서는 member)가 Null이 아니라 어떠한 값이 존재한다면 괄호 안의 로직이 동작하게끔 하는 문법이다.
강사님께서 말씀하시길, findByName
과 같이 회원가입시 동작되는 코드들은 method를 따로 추출하는 것이 좋다고 하셨다. 위 코드를 block 처리한 후, Ctrl + Alt + m을 눌러 메소드를 추출했다. (MacOS의 경우, Cmd + Opt + m) 따라서, 다음과 같이 메소드가 생성되는것이다.
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
findAll
, findById
을 return 해주는 것이 그 특징이다. 다음과 같이, 서비스를 개발할때는 join, findMembers와 같이 조금 더 비즈니스와 맞닿아있는 느낌을 받을 수 있었다. 강사님께서 말씀하신 서비스 클래스의 특징이라고 하셨다. 서비스에 의존적으로 개발을 함으로써 이를 통해 기획자나 다른 이해관계자들과 의사소통을 할 수 있다는 것을 배웠다.
회원 서비스 테스트는 다음 포스팅에서....