Framework/Spring Boot

회원 관리 예제 #03 회원 서비스 개발

반응형

디렉토리 구조

이제 Service 패키지를 만들었다. 여기서 비즈니스 로직을 구현한다.

현재까지의 디렉토리 구조

 

코드 정리

먼저 멤버 레포지토리 객체를 생성한다. 서비스를 만들기 위해서 각종 메소드를 호출해와야 하기 때문에 클래스 내에서 공유될 객체다. 먼저 Optional 객체를 선언하여 사용한다.

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    //서비스를 만들려면 우선 repository가 있어야겠죠

    /**
     * 회원 가입
     */
    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();
    }

}

 

Optional객체를 생성하지 않고 바로 사용한다. 이미 MemoryMemberRepository에서 Optional로 반환되기 때문에 별도로 선언하지 않고서 바로 Optional의 메소드를 사용할 수 있다.

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    //서비스를 만들려면 우선 repository가 있어야겠죠

    /**
     * 회원 가입
     */
    public Long join(Member member){
        //같은 이름이 있는 중복 회원X
        memberRepository.findByName(member.getName())
        	.ifPresent(m->{
        		throw new IllegalStateException("이미 존재하는 회원입니다.");
        	});
        //함수로 별도로 빼주는 것이 좋다

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

 

해당 코드를 메소드로 빼낸 모습.

public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    //서비스를 만들려면 우선 repository가 있어야겠죠

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


}

 

최종 작성 코드

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();
    //서비스를 만들려면 우선 repository가 있어야겠죠

    /**
     * 회원 가입
     */
    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);
    }
}

 

내용 정리

  • 레포지토리에서는 더 개발 친화적인 단어들을 선택하여 이름을 설정한다.
  • 서비스에서는 비즈니스 의존적으로 설계하며, 비즈니스적 역할에 맞도록 이름을 설정한다.
  • Optional의 메소드 ifPresent(): 인자로 주어진 내용이 존재한다면 내부 메소드를 실행한다.
  • Optional의 메소드 orElseGet(): 인자로 주어진 내용이 존재하면 그대로 리턴하고 아니면 내부 메소드를 실행한다.
728x90
반응형