[JPA] 본격적인 JPA 학습에 앞서...

조성우·2024년 3월 13일

JPA - 공부

목록 보기
2/16
post-thumbnail

JPA를 최대한 활용하려면?

  1. 객체와 테이블을 올바르게 설계하고 매핑해야 함
  2. JPA 내부 동작 방식을 이해해야 함 (디버깅, 장애 상황 대처)

JPA 구동 방식

  1. Persistence에서 설정 정보 조회 (META-INF/persistence.xml)
  2. EntityManagerFactory 생성
  3. EntityManager 생성

주의

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드간에 공유 X (사용하고 버려야 함)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

JPQL

  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • JPQL엔티티 객체를 대상으로 쿼리, SQL은 데이터베이스 테이블을 대상으로 쿼리
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존 X
  • JPQL을 한마디로 정의하면 객체 지향 SQL

JPA 동작 확인 및 간단한 실습 코드

public class JpaMain {

    public static void main(String[] args) {

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

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

        try {
            // 등록
//            Member member = new Member();
//            member.setId(1L);
//            member.setName("hello1");
//            em.persist(member);

            // 조회 / 수정
//            Member findMember = em.find(Member.class, 1L);
//            System.out.println(findMember.getId() + " " + findMember.getName());
//            findMember.setName("hello2");

            List<Member> result = em.createQuery("select m from Member as m where m.id < 100", Member.class)  // JPQL
                    .setFirstResult(0)
                    .setMaxResults(2)
                    .getResultList();

            for (Member member : result) {
                System.out.println(member.getName());
            }
            tx.commit();  // 커밋 직전에 업데이트 쿼리를 만들어 날림
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
            emf.close();
        }
    }
}

0개의 댓글