회원 서비스 개발

2023. 5. 1. 05:19카테고리 없음

package com.example.demo.service;

import com.example.demo.Repository.MemberRepository;
import com.example.demo.Repository.MemoryMemberRepository;
import com.example.demo.domain.Member;

import java.util.List;
import java.util.Optional;

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

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

 

위에있는 코드는 회원 가입 서비스에 대한 코드 이다. 

private final MemberRepository memberRepository;

위 코드는 먼저 새로운 메모리멤버레퍼지토리 생성자를 만들되, 이 클래스에서만 쓸 수 있고, 고치지 못하도록 final로 설정해준 것을 볼 수 있다.

Join() : 그리고 join이라는 이름에 (도메인)member정보를 사용할수 있도록 넣어주고,  memberRepository클래스에 있는 save 생성자에 member를 넣어주고 그 값을 다시 반환시켜주는 member.getId()를 넣어준다. 그런데 이제 이 두개의 코드 위에 validateDuplicateMember(member);이 있는데 이것은 밑에있는

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

이 코드들을 메서드로 따로 뽑아낸 것이다. ( 단축키는 Ctrl + Alt + Shift + T) 이 코드의 역할은 memberRepository으로 findByName안에 member객체에 getName값으로 넘어온 파라미터를 찾는다. member.getName()가 만약  멤버에 값이 있으면(null이 아닌), throw new IllegalStateException으로 이미 존재하는 값이라고 알려주게 된다. 그리고 그 밑에 있는 List안에 Member의 배열을 넣어주고 findMember라는 이름으로 함수를 만들어받게끔 설정해준뒤(return으로 바로 하는 이유는 이미 findAll의 타입이 List이기 때문임), 반환시킬때 memberRepository에서 findAll의 값으로 반환하게끔 만들어주고, findOne()은 위에 똑같이 사용한다. null값이 나올수도 있으니 Optional로 감싸준것이다.