ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회원 리포지토리, 서비스 개발
    JPA/JPA 활용 2023. 7. 11. 18:08

    MemberRepository class

    @Repository // Repository로 스프링 빈 등록(컴포넌트 스캔의 대상)
    @RequiredArgsConstructor
    public class MemberRepository {
    
        // @Autowired  ->  @RequiredArgsConstructor로 대체
        // 원래는 @PersistenceContext인데 스프링 데이터 JPA에서 @Autowired를 지원해주는 것
        private EntityManager em;
        
        /*
        public MemberRepository(EntityManager em) {
            this.em = em;
        }    
         */   //    ->        @RequiredArgsConstructor로 대체
    
        public void save(Member member) {
            em.persist(member); // JPA가 회원을 저장
        }
    
        public Member findOne(Long id) {
            return em.find(Member.class, id); // 멤버를 찾아서 반환
        }
    
        public List<Member> findAll() {
            List<Member> result = em.createQuery("select m from Member m", Member.class)
                    .getResultList();
            // (JPQL, 반환타입).getResultList() 순으로 작성 (JPQL에서 from의 대상은 entity)
            return result;
        }
    
        public List<Member> findByName(String name) {
            return em.createQuery("select m from Member m where m.name = :name", Member.class)
                    .setParameter("name", name)
                    .getResultList(); // 이름을 가지고 회원들을 조회
        }
    }

    회원을 저장하는 memberRepository이다.

    기능은 회원을 저장하는 save기능, 하나의 회원을 조회하는 findOne기능, 회원을 모두 조회하는 findAll기능, 회원의 이름을 조회하는 findByName 기능이 있다. JPA를 사용해서 짧은 코드로 4기능을 구현했다.

     

     

     

     

    MemberService class

    @Service
    @Transactional(readOnly = true) // 중요!! 까먹지 않기
    @RequiredArgsConstructor
    public class MemberService {
    
        private final MemberRepository memberRepository;
    
        /*
        @Autowired // 스프링이 빈에 등록되어 있는 리포지토리를 인젝션해줌
        public MemberService(MemberRepository memberRepository) {
            this.memberRepository = memberRepository; // 생성자 주입
        }
        */  // ->   @RequiredArgsConstructor로 대체
    
        /**
         *  회원 가입
         */
        @Transactional // 쓰기에는 무조건 readOnly false(default)로 해야함
        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("이미 존재하는 회원입니다.");
            }
        }
    
        // 회원 전체 조회
        // @Transactional(readOnly = true) // 단순한 읽기는 readOnly = true
        public List<Member> findMembers() {
            return memberRepository.findAll();
        }
    
        // @Transactional(readOnly = true)
        public Member findOne(Long memberId) {
            return memberRepository.findOne(memberId);
        }
    }

    회원 service 기능이다. join 메서드에서 중복회원을 검증하고 중복회원이 없으면 회원을 저장한다. find에서 멤버들의 리스트나 멤버 한명을 찾을 수 있다. 물론 이 모든 동작은 트랜잭션 안에서 이루어진다.

    코드를 작성할 때 @Transaction 애노테이션과 @RequiredArgsConstructor의 사용법을 숙지하고 클래스를 작성할 때 잘 사용해야한다.

    'JPA > JPA 활용' 카테고리의 다른 글

    상품 리포지토리, 서비스 개발  (0) 2023.07.11
    상품 엔티티 개발(비즈니스 로직)  (0) 2023.07.11
    회원 가입, 조회 기능 테스트  (0) 2023.07.11
    엔티티 설계시 주의점  (0) 2023.07.11
    회원 도메인 개발  (0) 2023.07.11
Designed by Tistory.