Spring/Spring Data JPA

[자바 ORM 표준 JPA 프로그래밍] 2. JPA 시작

noahkim_ 2023. 11. 28. 00:21

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.

 

1. 컴포넌트

컴포넌트 역할 특징 주의사항 및 사용 방식
EntityManagerFactory - Connection Pool 생성 및 관리
- EntityManager 인스턴스 생성
- 생성 비용 높음 (Singleton으로 관리) - 앱 실행 시 한 번만 생성
- 전역으로 공유
EntityManager - DB 통신
- 쿼리 실행 (JPQL 사용)
- 커넥션 획득 (DataSource 사용)
- 스레드 안전하지 않음
- 요청마다 생성 또는 주입
- 스레드 간 공유 금지
EntityTransaction - 트랜잭션 처리 담당 - EntityManager를 통해 획득
- 트랜잭션 범위 안에서만 DB 작업 가능
- begin()
→ 작업
→ commit() or rollback()

 

예제

더보기
public class JpaMain {
    public static void main(String[] args) {
        // 엔티티 매니저 팩토리 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
        EntityManager em = emf.createEntityManager(); // 엔티티 매니저 생성
        EntityTransaction tx = em.getTransaction();   // 트랜잭션 기능 획득

        try {
            tx.begin();  // 트랜잭션 시작
            logic(em);   // 비즈니스 로직
            tx.commit(); // 트랜잭션 커밋
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback(); //트랜잭션 롤백
        } finally {
            em.close();  // 엔티티 매니저 종료
        }

        emf.close();     // 엔티티 매니저 팩토리 종료
    }
}

 

2. JPQL

  • Java Persistence Query Language
  • SQL을 추상화한 객체 지향 쿼리 언어
  • JPA에서 데이터베이스 쿼리를 작성할 때 사용함
항목 내용
쿼리 대상
Entity 객체를 대상으로 쿼리 수행
- 클래스와 필드 기준으로 작성 (테이블 ❌)
쿼리 실행 방식
SQL로 변환되어 실행됨 (JPQL은 SQL을 직접 다루지 않음)
장점
- DB 독립적 코드 작성 가능
- 객체 지향적 개발과 자연스럽게 통합

 

예제

더보기
@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String dept;    

    // Getters and setters
}
String jpql = "SELECT e FROM Employee e WHERE e.department = :dept";
TypedQuery<Employee> query = entityManager.createQuery(jpql, Employee.class);
query.setParameter("dept", "HR");
List<Employee> results = query.getResultList();