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();
    }

}