-
회원 리포지토리, 서비스 개발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