반응형
이제 서비스를 만들겠습니다. service/MemberService.java를 생성합니다.
memberRepository클래스와 다르게 service 클래스는 비즈니스에 가까운 용어를 사용해야 합니다(비즈니스를 처리해야 되기 때문에). 보시면 join(), findMembers()와 같은 용어를 사용합니다. memberRepository는 save, findById 등 단순하게 넣었다 뺐다 와 같은 용어를 사용합니다.

service/MemberService

 

회원 가입하기

// MemberService.java

public class MemberService {
	
    // service를 만들기 위해서는 repository가 있어야 합니다.
    
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    // 회원 가입
    public long join(Member member) {

        // 같은 이름 있으면 회원가입이 안되게 하기 -> 프로젝트 조건

        Optional<Member> result = memberRepository.findByName(member.getName());
        result.ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        } );

        // ifPresent -> null이 아니라 어떤 값이 있으면
        // 혹시나 null 일 수 있으면 Optional로 감싸서 반환해준다.
        // 추가적으로 result.orElseGet(값이 있으면 꺼내고 없으면 여기 있는 메소드 실행)를 많이 사용한다.

        // 회원 가입 시 아이디를 반환시켜 준다.
        memberRepository.save(member);
        return member.getId();
 
 	}
}

Optional을 바로 반환 시키는 것을 권장하지 않습니다.

Optional<Member> result = memberRepository.findByName(member.getName());
	result.ifPresent(m -> {
		throw new IllegalStateException("이미 존재하는 회원입니다.");
        } );

        
        memberRepository.save(member);
        return member.getId();

 저 구문을 변경시킵니다.

 memberRepository.findByName(member.getName())
                // result가 반환되었기 때문에 바로 ifPresent를 사용할 수 있습니다.
            .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
        memberRepository.save(member);
        return member.getId();

코드를 잘 보시면 findByName이라고 해서 로직이 쭉 나옵니다. 이런 경우에는 메서드로 뽑는 게 좋습니다.
단축키 ctrl + T (리팩터링 단축키) 여기서 메서드 추출 (command + option + M)을 자주 사용하게 됩니다.

메서드 추출 (command + option + M)
메서드 추출 2

이름을 validateDuplicateMember로 만들었습니다.
// 회원 가입
    public long join(Member member) {
        validateDuplicateMember(member); // 중복 회원 검증

        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                // result가 반환되었기 때문에 바로 ifPresent를 사용할 수 있습니다.
            .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
    }​

저렇게 만드시면 '중복 회원을 검증하고 통과하면 바로 저장하는구나'라고 바로 이해할 수 있습니다.

 

 

회원 조회하기

전체 회원 조회하기
...
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }
...​

회원 한명만 조회하기
public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }​

 

반응형
복사했습니다!