스프링 부트/스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

11. 회원 서비스 개발

sungw00 2023. 3. 7. 22:46
728x90

회원 리포지토리, 도메인을 활용하여 실제 비즈니스 로직을 작성

1. service 패키지, MemberService 클래스 작성

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();

    /**
     * 회원가입
     */
    public Long join(Member member) {
        // 같은 이름이 있는 중복 회원X
        Optional<Member> result = memberRepository.findByName(member.getName()); // null일 가능성이 있다면 Optional로 감싼다.
        result.ifPresent(m -> {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        });

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

}

하지만 Optional을 반환하는 것은 깔끔하지 않으므로 아래처럼 사용

private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName()) // null일 가능성이 있다면 Optional로 감싼다.
                .ifPresent(m -> { // findByName의 결과가 Optional<Member>이기때문에 바로 .ifPresent 메서드를 실행할 수 있다.
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
    }

 전체 회원을 조회하는 findMembers() 메서드와 단일 회원을 조회하는 findOne() 메서드 추가

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

    /**
     * 단일 회원 조회
     */
    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }

최종 작성 코드

 

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();

    /**
     * 회원가입
     */
    public Long join(Member member) {
        // 같은 이름이 있는 중복 회원X
        validateDuplicateMember(member); // 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName()) // null일 가능성이 있다면 Optional로 감싼다.
                .ifPresent(m -> { // findByName의 결과가 Optional<Member>이기때문에 바로 .ifPresent 메서드를 실행할 수 있다.
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
    }

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

    /**
     * 단일 회원 조회
     */
    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }

}
728x90