애정코딩 💻

WEB/JPA 2021.05.13 댓글 0 Joana

1. 자바 ORM 표준 JPA 프로그래밍 - 간단한 실습

아래와 같이 작성했을 때 저장이 될까?

에러가 생긴다. 왜냐하면 JPA는 트렌젝션이는 단위가 매우 중요하기 때문에 JPA의 모든 기능은 트렌젝션 안에서 이루어져야 한다.

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    Member member = new Member();
    member.setId(1L);
    member.setName("AE");

    em.persist(member);

    em.close();
    emf.close();

트렌젝션을 추가한 코드

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();
    try {

      Member member = new Member();
      member.setId(2L);
      member.setName("JE");
      em.persist(member);

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
    } finally {
      em.close();
    }
    emf.close();
  }

 

업데이트할 경우에도 저장을 해야할까?

 

아래와 같이 persist는 하지 않아도 된다 왜냐하면 JPA를 통해서 Entity를 가지고 오면 JPA가 관리하면서 변경이 되었는지 트렌젝션을 커밋하는 시점을 다 체크 하여 변경되었을 때 업데이트 쿼리를 실행한다.

	Member member = em.find(Member.class, 1L);
	member.setName("HELLO");
	tx.commit();

 

EntityManager 사용 주의!

엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유한다.

엔티티 매니저는 쓰레드간에 공유하지 않는다 -> close()로 계속 닫아주어야 한다. ( 요청이 올때마다 쓰고 버리고를 반복 )

JPA의 모든 데이터 변경은 트렌젝션 안에서 실행해야 한다.

 

JPQL

JPA를 사용하면 엔티티 객체를 중심으로 개발한다.

문제는 검색 쿼리인데 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.

애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.

그러므로 JPQL이라는 객체 쿼리 언어를 제공한다. GROUP BY, HAVING, JOIN 등 지원 하고, 엔티티 객체를 대상으로 쿼리한다.

아래와 같이 사용하는것이 JPQL인데 DB방언을(MySql, Oracle 등) 변경하면 쿼리문법도 자동으로 변경되어 실행된다.

List<Member> result = em.createQuery("select m from Member m", Member.class)
	.setFirstResult(5)
	.setMaxResults(8)
	.getResultList();

 

 

 

반응형