오늘은 몰랐으면 내일은 알면 된다

[Spring 입문] 7. 회원관리 예제(3) 회원 서비스 개발 본문

Java/Spring

[Spring 입문] 7. 회원관리 예제(3) 회원 서비스 개발

마스터피쓰 2022. 9. 24. 17:45

먼저 다음과 같이 service 패키지 아래에 memberService 클래스를 만든다

 

그 다음, repository를 불러온다. 아직 db가 정해져있지 않기 때문에, 앞서 MemoryMemberRepository를 만들어 두었다.

 

private final MemberRepository memberRepository = new MemoryMemberRepository();

 

단순히 저장만 하려면 repo 의 save 메서드를 불러주면 되겠다.

 

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

 

그러나 만약 같은 이름을 가진 회원은 가입을 못하게 하려면 어떻게 해야할까?

이름으로 검색했을 때 그 결과가 나온다면 IlligalStateException을 발생시킨다.

 

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

 

ifPresent는 어떠한 값이 있으면 로직을 동작시킨다. null의 가능성이 있는 경우 Optional로 감싸서 처리하는데, 이 경우에 사용할 수 있는 메서드 중 하나이다.

 

그런데 optional을 바로 반환하는 것은 권장되지 않는다고 한다.

다음과 같이 코드를 수정할 수 있다.

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

 

그런데 또! findByName은 중복되어서 사용할 수 있기 때문에, 따로 메서드를 뽑는 것이 좋다고 한다.

windows에서의 경우 ctrl+alt+shift+T 로 refactoring을 할 수 있다.

 

extract method 선택

 

extract method 를 선택하게 되면 메서드를 추출하여 refactoring 할 수 있고, 메서드 이름을 지정할 수 있다.

 

 

그러면 다음과 같은 코드가 완성되었다.

 

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

 

service는 비즈니스 의존적으로 설계해야한다. repo는 단순히 데이터를 넣었다 빼는 용도로 설계되기 때문에, 메서드명 자체도 기능에 충실하게 작성해야 한다. service도 마찬가지로 비즈니스 로직을 실행시키는, 동작에 관련된 이름으로 작성한다.

 

그 외에 모든 멤버찾기, 특정 멤버찾기도 아래와 같이 작성한다.

 

    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

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