JPA를 시작하기 위해서는 엔티티 매니저 팩토리를 생성 후
앤티티 매니저 팩토리가 엔티티 매니저를 생성하여야 한다
앤티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test")
- application.yml의 환경설정 정보를 가지고 entityManagerFactory를 생성 (통상적으로 META_INF/persistence.xml에서 persistence-unit 이름이 test와 같은 것을 찾아서 생성)
- JPA 동작 위한 기반 객체 생성 and 데이터베이스 커넥션 풀을 생성
-> 작업과 비용이 크므로 어플리케이션 전체에서 한번만 생성하는 것이 좋음
엔티티 매니저 생성
EntityManager em = emmf.createEntityManager();
- 엔티티 매니저는 내부의 데이터 소스를 유지하면서 db와 통신
- 데이터베이스 연결이 꼬고 필요한 시점까지 db와의 커넥션을 얻지 않음 -> 트랜젝션 시작할때 커넥션 시작
- db와 연결되어 있으므로 스레드간의 공유하면 안됨
참고 : application.yml
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true <-운영환경에서는 system out이 아닌 다 log를 통해 찍어야 함
format_sql: true
logging:
level:
org.hibernate.SQL: debug
org.hibernate.type: trace
resource/application.yml
spring, jpa, hibernate, logging 설정 가능
Repository 레포지토리
package jpabook.jpashop.repository;
import jpabook.jpashop.domain.Member;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import java.util.List;
@Repository // component annotation으로 인해 spring의 component 스캔의 대상이 되어서
public class MemberRepository {
@PersistenceContext
private EntityManager em; // spring이 entity manager를 생성하여서 주입해준다
//@PersistenceUnit
//private EntityManagerFactory emf;
// 직접 주입 받을 수도 있음
public void save(Member member){
em.persist(member);
}
public Member findById(Long id){
return em.find(Member.class, id);
}
public List<Member> findAll(){
return em.createQuery("select m from Member m", Member.class).getResultList();
// entity 객체를 대상으로 조회
}
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 - 해당 component annotation으로 인해 spring의 componenet 스캔 대상이 되어서 repository로 인식함
- @PersistenceContext - spring이 entity manager를 생성하여 주입한다. spring이 중앙 관리 하므로 스레드 간에 entity manager가 공유되는 것을 방지
- @PersistenceUnit - EntityManagerFactory를 직접 주입받아서 entityManager를 직접 생성할 수 있다
- em.persist(엔티티객체) - 해당 객체를 Persistence context에 저장, flush() 되어야 db에 반영
- em.find(Member.class, id) - primary key를 기준으로 db에는 index가 생성되어있으므로 해당 키값을 가지고 db에서 튜플을 가져오는 작업
- em.createQuery(...) - JPQL을 사용하여 조건에 따른 튜플 가져오는 작업
'Spring > JPA' 카테고리의 다른 글
[JPA] 1:N / N:1 상황에서의 N+1 문제 해결 (Fetch Join ~ 지연로딩/Batch Size) (0) | 2022.03.09 |
---|---|
[JPA] Hibernate Batch Size 설정 (0) | 2022.03.09 |
[JPA] 준영속 엔티티를 변경하는 방법 - 변경 감지 / 병합(Merge) (0) | 2022.02.15 |
[JPA] JPA 세팅 및 MySQL 8 아마존 RDS 연결하기 by Spring Boot (0) | 2021.09.10 |
[JPA] JPA 등장 배경 + ORM에 대한 이야기 (0) | 2021.09.10 |