회원 서비스: 회원 리포지토리와 도메인을 활용하여 실제 비즈니스 로직을 작성하는 것.
우선
main - java - hellospring에 service라는 패키지를 하나 생성하였다.
그리고 service 패키지 밑에 MemberService라는 클래스를 하나 생성하였다.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
public Long join(Member member){
//같은 이름이 있는 중복 회원은 X
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
memberRepository.save(member);
return member.getId();
}
}
MemberService 클래스에 작성한 코드이다.
우선 private final MemberRepository memberRepository = new MemoryMemberRepository();를 한 후
회원 가입 코드를 작성하였다.
public Long join(Member member){
memberRepository.save(member);
return member.getId();
}
회원가입은 그냥 단순하게 memberRepository에 save만 호출해주면 된다.
그리고 임의로 Id만 반환하게 해 놓았다.
그런데 비즈니스 로직 중에 같은 이름을 가진 회원이 있는 회원은 안 된다는 룰이 있었다.
따라서 같은 이름이 있는 중복 회원은 안 된다는 코드를 추가 작성해야 한다.
memberRepsoitory.findByName으로 같은 이름을 검색한다.
memberRepsoitory.findByName(member.getName());
*단축키 command + option + v
-> Optional result = memberRepository.findByName(member.getName());
자동반환
이렇게 Optional로 반환이 되었고,
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
만약 member가 존재한다면, 이미 존재하는 회원입니다. 라는 에러를 출력하는 코드를 작성하였다.
ifPresent는 member가 null이 아니라 이미 어떠한 값이 있으면, 동작한다.
Optional이기 때문에 가능한 일이다.
기존에는 member가 null이 아니면, 이라고 했을 것이다..
Optional로 한 번 감싸면, Optional 안에 member 객체가 있는 것이기 때문에 Optional에 존재하는 여러 메소드를 사용할 수가 있다.
=> 과거에는 if null이 아니면 이라고 코딩을 하였지만, 지금은 Null일 가능성이 있으면 Optional로 감싸서 코딩을 해주고, 감싼 덕분에 ifPresent와 같은 메소드를 사용 가능하다.
꺼내고 싶으면 그냥
result.get();으로 꺼내주면 된다.
그럼 자동으로 Member member1 = result.get();으로 변환된다.
하지만 get()으로 직접 꺼내는 것은 별로 권장하진 않는 방법이다.
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
이렇게 logic이 쭉 나열 돼 있는 코드보다는, 메소드로 뽑아주는 코드가 더 좋다.
따라서 아래 사진처럼 코드를 수정해 주었다.
Optional코드를 드래그해서, 단축키 control + t를 사용하여 Extract Method를 선택해 주었다. command + option + m 을 사용하면 바로 Extract Method가 가능하다.
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("이미 존재하는 회원입니다.");
});
}
}
수정된 코드를 포함한 MemberService 코드이다.
validateDuplicateMember는 임의로 정한 메소드 이름이다.
**전체 회원 조회 기능 코드를 이 다음에 작성하는데, 자꾸 뭘 추가하려고만 하면 validateDuplicateMember가 사라지길래 맨 처음에 command + option + m을 치면 나오는 extracted(member);의 extracted를 내가 직접 validateDuplicateMember로 수정하지 않고, extracted옆에 뜨는 환경설정 표시를 눌러서 more option에 들어간 후, refactor로 수정해줬더니 더 이상 그런 오류가 생기지 않았다.
다음은 전체 회원 조회 기능을 만들었다.
전체 회원 조회 기능은 매우 간단하다.
public List<Member> findMembers(){
return memberRepository.findAll();
}
반환 타입이 List였기 때문에 return 만 해주면 간단하게 끝이 난다.
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
이 코드는 findById를 했을 때 memberId를 반환해주는 코드이다.
여러 가지 방법이 있는데 제일 좋은 방법은 이전에 배웠던 테스트 케이스를 작성하는 방법이다.
그 방법은 다음 시간에...