회원 리포지토리 개발

학습 페이지

회원 도메인을 개발해보자. 구현해야 할 기능은 회원 등록, 회원 목록 조회 두 가지이다.

도메인 개발 순서는 리포지 개발 - 서비스 개발 - 기능 테스트 순이다.

MemberRepository

package jpabook.jpashop.repository;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jpabook.jpashop.domain.Member;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository //스프링빈이 컴포넌트 스캔으로 빈으로 등록해준다.
public class MemberRepository {

    @PersistenceContext //스프링이 매니저 만들어 주입해준다.
    private EntityManager em;

    public void save(Member member){ 
        em.persist(member);
    }

    public Member findOne(Long id){ //단건 조회
        return em.find(Member.class, id);
    }

    public List<Member> findAll() { //JPQL이용한 전체 조회

        return em.createQuery("select m from Member m", Member.class).
                getResultList();
    }
    
    public List<Member> findByName(String name){ //파라미터 바인딩해서 특정 이름 가진 회원 조회
        return em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();
    }
}

참고로 매니저 말고 매니저 팩토리를 스프링한테 주입받고 싶으면 다음의 애너테이션을 사용하면 된다.

@PersistenceUnit
private EntityManagerFactory emf;

회원 서비스 개발

학습 페이지

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MemberService {
    @Autowired
    private MemberRepository memberRepository;

   /**
    회원 가입
    **/
    public Long join(Member member){
       validateDuplicateMember(member); //문제있으면 예외 발생시킨다.
       memberRepository.save(member);
       return member.getId();
    }

    private void validateDuplicateMember(Member member){ //중복회원 가입 방지 위한 기본적인 검증메서드
        //EXCEPTION
        
    }
    //회원 전체 조회
}

기본적인 회원가입 메서드를 개발할때 중복회원 가입 방지 validation을 넣어보자.

엔티티 매니저에 persist하면 그 순간 id가 1차 캐시의 키가 된다. 만약 해당 키를 가진 member엔티티가 이미 존재한다면 중복회원이다.

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MemberService {
    @Autowired
    private MemberRepository memberRepository;

   /**
    회원 가입
    **/
    public Long join(Member member){
       validateDuplicateMember(member); //문제있으면 예외 발생시킨다.
       memberRepository.save(member);
       return member.getId();
    }

    private void validateDuplicateMember(Member member){ //중복회원 가입 방지 위한 기본적인 검증메서드
        List<Member> findMembers = memberRepository.findByName(member.getName());
        if(!findMembers.isEmpty()) {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        }
    }
    //회원 전체 조회
}

나머지 회원 조회 부분도 만들어보자.

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MemberService {
    @Autowired
    private MemberRepository memberRepository;

   /**
    회원 가입
    **/
    public Long join(Member member){
       validateDuplicateMember(member); //문제있으면 예외 발생시킨다.
       memberRepository.save(member);
       return member.getId();
    }

    private void validateDuplicateMember(Member member){ //중복회원 가입 방지 위한 기본적인 검증메서드
        List<Member> findMembers = memberRepository.findByName(member.getName());
        if(!findMembers.isEmpty()) {
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        }
    }
    //회원 전체 조회
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }
		//회원 단건 조회
    public Member findOne(Long memberId){
        return memberRepository.findOne(memberId);
    }
}