BackEnd/JPA
[Spring Data JPA] 회원가입 기능 및 회원 조회 + 의존성 주입
이수밈
2024. 3. 3. 13:51
이런 구조로 data jpa 배우는중..
1. Field Injection
@Service
@Transactional(readOnly = true)
public class MemberService {
//field injection
@Autowired
private MemberRepository memberRepository;
2. Setter Injection
@Service
@Transactional(readOnly = true)
public class MemberService {
private MemberRepository memberRepository;
//setter injection
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
3. Constructor Injection
@Service
@Transactional(readOnly = true)
public class MemberService {
private MemberRepository memberRepository;
@Autowired //생성자 injection (autowired annotation 없어도 자동 주입됨)
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
4. Lombok annotation을 이용한 요즘 의존성 주입 방법 - 최신 Spring Boot 에서만 지원
@Service
@Transactional(readOnly = true)
//lombok annotation
@RequiredArgsConstructor // : final 붙은 필드에 대해서만 생성자 만듬
public class MemberService {
private final MemberRepository memberRepository;
🎶전체 코드
MemberService.java
package jpabook.jpashop.service;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional(readOnly = true)
//lombok annotation
@RequiredArgsConstructor // : final 붙은 필드에 대해서만 생성자 만듬
public class MemberService {
//field injection
// @Autowired
private final MemberRepository memberRepository;
// @Autowired //생성자 injection (autowired annotation 없어도 자동 주입됨)
// public MemberService(MemberRepository memberRepository) {
// this.memberRepository = memberRepository;
// }
// //setter injection
// @Autowired
// public void setMemberRepository(MemberRepository memberRepository) {
// this.memberRepository = memberRepository;
// }
//회원 가입
@Transactional
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);
}
}
MemberRepository.java
package jpabook.jpashop.repository;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jpabook.jpashop.domain.Member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
//스프링 빈으로 등록해줌
@Repository
@RequiredArgsConstructor
public class MemberRepository {
// @PersistenceContext
//의존성 주입
private final EntityManager em;
// public MemberRepository(EntityManager em){
// this.em = em;
// }
public void save(Member member){
em.persist(member);
} //db에 insert 쿼리 전송
public Member findOne(Long id){
return em.find(Member.class, id);
}
//jpql
public List<Member> findAll(){
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();
}
}