๐Ÿ”™๋’ค๋กœ๊ฐ€๊ธฐ

MemberRepository

package jpabook.jpashop.domain.repository;

import jpabook.jpashop.domain.Member;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import java.util.List;

@Repository // ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์˜ ๋Œ€์ƒ์ด ๋˜์–ด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋จ
@RequiredArgsConstructor
public class MemberRepository {

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

๊ธฐ์ˆ  ์„ค๋ช…

@Repository : ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก, JPA ์˜ˆ์™ธ๋ฅผ ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ์˜ˆ์™ธ๋กœ ๋ณ€ํ™˜

@PersistenceContext : ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €(Entitymanager) ์ฃผ์ž…

@PersistenceUnit: ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ(EntitymanagerFactory) ์ฃผ์ž…

๊ธฐ๋Šฅ ์„ค๋ช…

save() : ํšŒ์› ์ •๋ณด ์ €์žฅ

findOne() : ํšŒ์› ์ •๋ณด PK๊ฐ’์œผ๋กœ 1๊ฐœ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ

findAll() : ๋ชจ๋“  ํšŒ์› ์ •๋ณด List๋กœ ๋ฐ˜ํ™˜

findByName() : ํšŒ์› ์ •๋ณด name๊ฐ’์œผ๋กœ 1๊ฐœ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ

MemberService

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 org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service
@Transactional(readOnly = true)
public class MemberService {
    @Autowired
    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);
    }
}

<aside> โš ๏ธ @RequiredArgsConstructor ์• ๋…ธํ…Œ์ด์…˜์€ final์ด ๋ถ™์€ ํ•„๋“œ๋งŒ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. setter ์ฃผ์ž…, constructor ์ฃผ์ž…, Autowired ์ฃผ์ž… ๋“ฑ์˜ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ๊ฐ„ํŽธํ•˜๋‹ค.

</aside>

๊ธฐ์ˆ  ์„ค๋ช…

@Service

@Transactional : ํŠธ๋žœ์žญ์…˜, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ