[Spring]/JPA 프로그래밍 - 기본편

Hello JPA - 애플리케이션 개발

응파카 2023. 3. 28. 21:56

JPA 구동 방식

  1. Persistence 클래스가 META-INF/persistence.xml 설정정보를 조회한다.
  2. 이를 사용해 EntityManagerFactory 클래스를 만든다.
  3. JPA 동작을 위한 EntityManager를 생성하여 실행한다.
  4. JPA 구현체에 따라 DB 커넥션 풀도 설정한다.

persistence.xml과 EntityManager

 

 

 


 

 

트랜잭션 추가 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

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

'[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