JPA 구동 방식
- Persistence 클래스가 META-INF/persistence.xml 설정정보를 조회한다.
- 이를 사용해 EntityManagerFactory 클래스를 만든다.
- JPA 동작을 위한 EntityManager를 생성하여 실행한다.
- JPA 구현체에 따라 DB 커넥션 풀도 설정한다.
트랜잭션 추가 X
//회원 등록
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
EntityManager entityManager1 = entityManagerFactory.createEntityManager();
Member member1 = new Member();
member1.setId(1L);
member1.setName("HelloA");
entityManager1.persist(member1);
Member member2 = new Member();
member2.setId(2L);
member2.setName("HelloB");
entityManager1.persist(member2);
Member member3 = new Member();
member3.setId(3L);
member3.setName("HelloC");
entityManager1.persist(member3);
entityManager1.close();
entityManagerFactory.close();
JPA 모든 기능은 트랜잭션 안에서 이루어져야 한다.
트랜잭션 없이 데이터를 변경하면 예외가 발생한다.
트랜잭션을 시작하려면 아래와 같이 엔티티 매니저에서 트랜잭션 API를 받아와야 한다.
트랜잭션 추가 O
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
//회원 등록
//EntityManager 설정 부분
EntityManager entityManager1 = entityManagerFactory.createEntityManager();
//트랜잭션 관리 부분
EntityTransaction transaction1 = entityManager1.getTransaction();
transaction1.begin();
//비즈니스 로직 부분
try{
Member member1 = new Member();
member1.setId(1L);
member1.setName("HelloA");
entityManager1.persist(member1);
Member member2 = new Member();
member2.setId(2L);
member2.setName("HelloB");
entityManager1.persist(member2);
Member member3 = new Member();
member3.setId(3L);
member3.setName("HelloC");
entityManager1.persist(member3);
transaction1.commit();
}catch(Exception e){
transaction1.rollback();
}finally {
entityManager1.close();
}
entityManagerFactory.close();
위와 같이 EntityManager 설정, 트랜잭션 관리, 비즈니스 로직 세 부분으로 구성된다.
수정 후에 따로 persist() 해 주지 않아도 된다.
JPA는 Entity가 변경되었는지 추적하는 기능을 갖고 있다.
이 기능으로 변경사항을 체크하여 업데이트 쿼리를 실행해준다.
//회원 수정
EntityManager entityManager3 = entityManagerFactory.createEntityManager();
EntityTransaction transaction3 = entityManager3.getTransaction();
transaction3.begin();
try{
Member foundMember = entityManager3.find(Member.class, 1L);
foundMember.setName("HelloJPA");
transaction3.commit();
}catch(Exception e){
transaction3.rollback();
}finally {
entityManager3.close();
}
EntityManagerFactory 사용 시 주의사항
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다.
- EntityManagerFactory는 딱 하나만 생성해서 애플리케이션 전체에서 공유한다.
- JPA 구동방식만 봐도 알 수 있듯이 비용이 크기 때문.
- EntityManager는 쓰레드 간 공유하지 않는다. 사용 후에는 버려야 한다.
entityManager.close();
- 앱 종료 시 EntityManagerFactory 종료
entityManagerFactory.close();
JPQL
//회원 목록 조회
List<Member> members = entityManager.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
- JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
- 문제는 검색 쿼리인데 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.
- 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
- 이런 문제점을 JPA는 JPQL(Java Persistence Query Language)라는 쿼리 언어로 해결했다
차이점
- JPQL : 엔티티 객체를 대상으로 쿼리. (클래스와 필드)
- SQL : 데이터베이스 테이블을 대상으로 쿼리.
++
- GROUP BY, HAVING, JOIN 등을 지원 하고, 엔티티 객체를 대상으로 쿼리한다.
- 아래와 같이 사용하는것이 JPQL인데 DB방언을(MySql, Oracle 등) 변경하면 쿼리문법도 자동으로 변경되어 실행된다.
- JPQL 표현
- select m from Member m에서, from Member는 MEMBER 테이블이 아닌 Member 회원 엔티티 객체이다.
- JPQL은 데이터베이스 테이블을 전혀 알지 못한다.
- JPA는 JPQL을 분석, 적절한 SQL을 만들어 DB의 데이터를 조회한다.
- SQL과 달리 JPQL은 대소문자를 구분한다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'[Spring] > JPA 프로그래밍 - 기본편' 카테고리의 다른 글
영속성 컨텍스트 2 (0) | 2023.04.08 |
---|---|
영속성 컨텍스트 1 (0) | 2023.04.07 |
Hello JPA - 프로젝트 생성 (0) | 2023.03.27 |
JPA 소개 (0) | 2023.03.27 |
SQL 중심적인 개발의 문제점 (0) | 2023.03.27 |