본문 바로가기
Spring/JPA

Spring Boot Repository EntityManager / EntityManagerFactory 엔티티매니저 / 엔티티매니저팩토리

by 코딩균 2021. 12. 27.

JPA를 시작하기 위해서는 엔티티 매니저 팩토리를 생성 후

앤티티 매니저 팩토리가 엔티티 매니저를 생성하여야 한다

 

앤티티 매니저 팩토리 생성 

EntityManagerFactory emf = Persistence.createEntityManagerFactory("test")
  1. application.yml의 환경설정 정보를 가지고 entityManagerFactory를 생성 (통상적으로 META_INF/persistence.xml에서 persistence-unit 이름이 test와 같은 것을 찾아서 생성)
  2. 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을 사용하여 조건에 따른 튜플 가져오는 작업