1. 회원 레포지토리 개발

구현 기능

회원 등록

회원 목록 조회

순서

회원 엔티티 코드 다시 보기

회원 리포지토리 개발

회원 서비스 개발

회원 기능 테스트

회원 리포지토리 코드

package jpabook.jpashop.repository;

import jpabook.jpashop.domain.Member;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

@Repository
public class MemberRepository {

    **@PersistenceContext
    private EntityManager em;**

    public void save(Member member){
        **em.persist(member);**
    }

    public Member findOne(Long id) {
        **return em.find(Member.class, id); //첫번째는 타입, 두번째는 PK**
    }

    public List<Member> findAll() {
        **return em.createQuery("select m from Member m", Member.class)
                .getResultList();**
    }

    public List<Member> fineByName(String name) {
        **return em.createQuery("select m from Member m where m.name=:name", Member.class)
                .setParameter("name", name)
                .getResultList();**
    }
}
* **@PersistenceContext**: **컨테이너가 관리하는 엔티티 매니저를 주입하는 어노테이션**

순수 자바 환경에서는 엔티티 매니저 팩토리에서 엔티티 매니저를 직접 생성해서 사용했지만, 

스프링이나 J2EE 컨테이너를 사용하면 **컨테이너가 엔티티 매니저를 관리하고 제공**해준다.

따라서 **엔티티 매니저 팩토리에서 엔티티 매니저를 직접 생성해서 사용하는 것이 아니라** / **컨테이너가 제공하는 엔티티 매니저를 사용해야 한다.

* JPQL : SQL를 추상화한 JPQL이라는 객체지향 쿼리 언어 제공**

**엔티티 객체를 대상으로 쿼리한다.** 쉽게 이야기하여 클래스와 필드를 대상으로 쿼리한다. (이에 반해 SQL은 데이터베이스 테이블을 대상으로 쿼리하는 차이점)

JPQL은 데이터베이스 테이블을 전혀 알지 못한다.

JPQL을 사용하려면 **먼저 em.createQuery(JPQL 반환 타입) 메소드를 실행**해서 **쿼리 객체**를 **생성**한 후 **쿼리 객체의 getRequltList() 메서드를 호출**

파라미터 없이 전체 조회하면 바로 getResultList() 메서드를 호출하면 되지만, 파라미터와 함께 조회하기 위해서는 setParameter("name",name)과 같이 세팅 후 getResultList() 메서드 호출

파라미터와 함께 조회하게 되면 특정 이름에 대한 회원을 찾을 수도 있다.

*** persist(member): 엔티티 저장** 

만약 sql로 치자면 "INSERT INTO MEMBER (MEMBER_ID,NAME,CITY,STREET, ZIPCODE) VALUES ('ID1','민지','서울','중랑구','02089")" 와 같은 작업

엔티티 매니저를 사용하여 회원 엔티티를 영속성 컨테스트에 저장한다.

*** find(Member.class,id): 한 건 조회**

만약 sql로 치자면 "SELECT * FROM MEMBER WHERE ID='id1"과 같은 작업

영속성 컨테스트의 1차 캐시에서 엔티티를 찾고, 찾는 엔티티가 없다면 데이터베이스에서 조회

<순수 자바 환경에서 엔티티 매니저 팩토리에서 엔티티 매니저를 직접 생성>

<순수 자바 환경에서 엔티티 매니저 팩토리에서 엔티티 매니저를 직접 생성>

EntityManagerFactory emf = Persistance.createEntityManagerFactory("jpabook");

이름이 jpabook인 영속성 유닛을 찾아 엔티티 매니저 팩토리를 생성한다. 

엔티티 매니저 팩토리를 생성하는 비용은 아주 크기 때문에 **엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.**

Untitled

*** persist(member): 엔티티 저장** 

엔티티 매니저를 사용하여 회원 엔티티를 영속성 컨테스트에 저장한다.

1차 캐시에 회원 엔티티를 저장하게 된다.

Untitled

*** find(Member.class,id): 한 건 조회**

1차 캐시에서 엔티티를 찾고, 찾는 엔티티가 없다면 데이터베이스에서 조회

기술 설명

@Repository : 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환

@PersistenceContext : 엔티티 메니저( EntityManager ) 주입

@PersistenceUnit : 엔티티 메니터 팩토리( EntityManagerFactory ) 주입

기능 설명

save()

findOne()

findAll()

findByName()