[Spring] 스프링 입문 웹 개발 기초(12)

회원 서비스 개발

먼저 sevice 패키지를 만들어주고, MemberService를 만들어준다.

spring44

회원 서비스이므로 당연히 회원 리포지토리가 당연히 필요하다.

private final MemberRepository memberRepository = new MemoryMemberRepository();

다음으로 회원가입을 만들어본다.

회원가입은 단순하게 memberRepository에 save해주면 된다.

그리고 임의로 일단 member.getId를 통해 아이디를 반환해준다.

public Long join(Member member){
    memberRepository.save(member);
    return member.getId();
}

하지만 회원가입을 할 때 우리는 중복된 이름은 가입하지 못하게 한다는 조건이 있었다.

memberRepository.findByName(member.getName());

										V
			
						 	Ctrl + Alt + V 

										V

Optional<Member> result = memberRepository.findByName(member.getName());

이제 result에 담긴 이름이 null이 아닌 존재하는 값이 있다면 로직이 동작을 하는 ifPresent로 작업해준다.

원래 코드는 아래와 같다.

public Long join(Member member){
    //같은 이름이 있는 중복 회원은 안된다.
    Optional<Member> result = memberRepository.findByName(member.getName());
    result.ifPresent(m -> {
        throw new IllegalStateException("이미 존재하는 회원입니다.");
    });
    memberRepository.save(member);
    return member.getId();
}

하지만 Optional이 들어있는 것이 이쁘지 않다면 어쩌피 Optional로 반환될 것이고 result는 이미 반환되었으니 없애도 된다.

다시 말하자면 findByName의 결과는 어쩌피 Optional이니 바로 한다는 것이다.

public Long join(Member member){
    //같은 이름이 있는 중복 회원은 안된다.
    memberRepository.findByName(member.getName())
            .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
    memberRepository.save(member);
    return member.getId();
}

훨씬 깔끔해졌다. 하지만 이런식으로 findByName 아래로 로직이 쭉 나온다면 메서드를 뽑는것이 훨씬 좋다.

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) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }
}

이렇게 변하게 된다. 훨씬 깔끔하고 이쁜 것 같다.

이제는 전체 회원 조회 기능을 만들어야 한다.

정말 쉽다. memberRepository에 findAll 기능을 써주고 findMembers 자체를 List로 만들었기에 그냥 return 해주면 끝이다.

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

마지막으로 아이디를 찾는 기능을 만들어준다.

public Optional<Member> findOne(Long memberId){
    return memberRepository.findById(memberId);
}

Leave a comment