# 회원 리포지토리 개발

기술 설명

* **@Repository : 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환**
* @PersistenceContext : 엔티티 메니저( EntityManager ) 주입
* @PersistenceUnit : 엔티티 메니터 팩토리( EntityManagerFactory ) 주입

기능 설명

* save()\
  영속성 컨텍스트에 Member 객체 넣는다.\
  트랜잭션이 커밋되는 시점에 DB에 반영된다!(DB에 insert 쿼리가 들어간다!)

  ```java
  EntityManager.persist(member);
  ```
* findOne()\
  JPA의 find메서드 사용\
  **find(타입,PK)**

  ```
  return em.find(Member.class,id);
  ```
* findAll()\
  JPQL : SQL과 거의 똑같은데 from의 대상이 테이블이 아니라 엔티티다!\
  **EntityManager.creatQuery(JPQL쿼리, 조회 타입)**

  ```
  return em.createQuery("select m from Member m",Member.class)
          .getResultList();
  ```
* findByName()\
  **파라미터 바인딩(where m.name = :name)**&#xD574;서 특정 이름의 회원들만 조회한다!

  ```
  return em.createQuery("select m from Member m where m.name = :name",Member.class)
          .setParameter("name",name)
          .getResultList();
  ```

```java
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);
    }
    public List<Member> findAll(){
        return em.createQuery("select m from Member m",Member.class)
                .getResultList();
    }
    // m.name = :name 파라미터 바인딩해서 특정 이 회원들만 조회
    public List<Member> findByName(String name){//,Member.class : 조회 타입은 Member
        return em.createQuery("select m from Member m where m.name = :name",Member.class)
                .setParameter("name",name)
                .getResultList();
    }
}
```
