회원 등록
회원 목록 조회
회원 엔티티 코드 다시 보기
회원 리포지토리 개발
회원 서비스 개발
회원 기능 테스트
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인 영속성 유닛을 찾아 엔티티 매니저 팩토리를 생성한다.
엔티티 매니저 팩토리를 생성하는 비용은 아주 크기 때문에 **엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.**
*** persist(member): 엔티티 저장**
엔티티 매니저를 사용하여 회원 엔티티를 영속성 컨테스트에 저장한다.
1차 캐시에 회원 엔티티를 저장하게 된다.
*** find(Member.class,id): 한 건 조회**
1차 캐시에서 엔티티를 찾고, 찾는 엔티티가 없다면 데이터베이스에서 조회
@Repository : 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환
@PersistenceContext : 엔티티 메니저( EntityManager ) 주입
@PersistenceUnit : 엔티티 메니터 팩토리( EntityManagerFactory ) 주입
save()
findOne()
findAll()
findByName()