개발일기

회원 서비스 개발 본문

Spring/Spring tutorial - 코드로 배우는 스프링 (김영한)

회원 서비스 개발

한둥둥 2022. 9. 19. 21:40
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

public class MemberService {
    private final MemberRepository memberRepository= new MemoryMemberRepository();
    /*
     * 회원 가입
     * @param member
     * return
     *  */
    public Long join(Member member){
        //같은 이름이 있는 중복 회원X
       Optional<Member> result = memberRepository.findByName(member.getName()); //<- memberRepository.findById(member.getName());
        
        memberRepository.save(member);
        return member.getId();
    }
}

repository에 있는 command + option + v 를 누르면 그냥 리턴을 해준다. 

result.ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        });

ifPresent는 안에 Member변수가 이미 있는 경우를 뜻한다. 

m-> 통해서 이미 있는 회원이라고 문자열을 출력 해주자. 여기서 ifPresent가 가능한 이유는 Optional이기 때문에 사용할 수 있는 메소드이다. 

기존에는 if(null!=) 이런식으로 작성해야 했다. 또한 Optional을 해주면 Optional이라는 것 안에 멤버객체가 있는 것이다. 

Optional을 통한 메서드는 isPresent말고도 여러개가 있다. 

과거에는 null이 있으면 if(null~~) 이런식으로 했지만 이제는 null이 있으면 Optional로 감싸서 반환해준다. 

덕분에 ifPresent 같은 것들을 사용할 수 있다. 

데이터를 꺼내고 싶으면 result.get(); <- 을 사용해서 데이터를 꺼내줄 수 있다. 

직접 바로 꺼내는 것은 권장하지 않는 방법이다.  

OrAtGet()이걸 많이씀 값이 있으면 이걸 꺼내고 없으면 이걸꺼내 이런식으로 사용한다. 

memberRepository.findByName(member.getName()).ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        });
        memberRepository.save(member);
        return member.getId();

이런식으로 변수명에 해당 값을 반환하지 않고 바로 사용 

 

이렇게 하면 메서드가 쭉나오는데 이걸 메서드로 따로 뽑으려고 하면 따로 뽑아서 사용할 수 있음. 

조금 더 깔끔한 코드를 위해서 메서드를 뽑는게 더 좋다. 

memberRespositroy에서 ctrl + t하면 리펙토링과 관련된 여러가지 것들이 나온다. 

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();
    /*
     * 회원 가입
     * @param member
     * return
     *  */
    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("이미 존재하는 회원입니다.");
        });
    }
}

 이제 중복회원을 받지 않는다. 

서비스는 좀 더 기능적인 이름으로 사용하고 repository는 좀 더 개발스럽게 용어로 지어준다. 

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();
    /**
     * 회원 가입
     * @param member
     * return
     *  */
    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("이미 존재하는 회원입니다.");
        });
    }

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

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

우리가 만든 코드가 잘되는지 테스트 코드를 작성하여 확인할 것이다.