김영한, ⌜자바 ORM 표준 JPA 프로그래밍⌟ 과
인프런 강의 <자바 ORM 표준 JPA 프로그래밍 - 기본편> 으로
공부한 JPA를 정리한 내용이다.
특정 데이터베이스에 종속적이지 않기 떄문에 다른 데이터베이스로 손쉽게 교체할 수 있다.
각 데이터베이스는 SQL표준과 조금씩 다른 문법과 함수가 있다. 이처럼 특정 데이터베이스만의 고유한 기능을 방언(Dialect)라고 한다.
하이버네이트를 포함 JPA 구현체들은 다양한 데이터베이스 방언 클래스를 제공한다.
표준 문법에 맞춰 JPA를 사용하면 특정 데이터베이스에 의존적인 SQL은 데이터베이스 방언이 처리해준다.
public class JpaMain {
public static void main(String[] args) {
// 어플리케이션 로딩 시점에 딱 하나만 만들어놔야함
// 엔티티매니저팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// 실제 트랜잭션 단위마다 꼭 만들어줘야함
// 엔티티매니저 생성
EntityManager em = emf.createEntityManager();
// 트랜잭션 획득
EntityTransaction tx = em.getTransaction();
tx.begin(); // 트랜잭션 시작
// 실행 code 작성
try {
... // 비즈니스 로직
...
tx.commit(); // 트랜잭션 커밋
} catch (Exception e) { // 예외처리
tx.rollback(); // 트랜잭션 롤백
} finally {
// 꼭 닫아줘야함
em.close(); // 엔티티매니저 종료
}
emf.close(); // 엔티티매니저팩토리 종료
}
}
JPA 설정 정보(persistence.xml / 스프링에서 application.yml)를 사용해 엔티티매니저 팩토리를 생성 후 엔티티매니저 생성.
엔티티매니저팩토리는 어플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야함.
엔티티매니저를 사용해 데이터베이스에 엔티티를 등록/수정/삭제/조회 가능
스레디간 공유나 재사용 불가 (데이터베이스 커넥션과 밀접한 관계가 있으므로)
요청이 올 떄마다 엔티티매니저 생성
사용이 끝나면 반드시 종료해야함
JPA를 사용하면 항상 트랜잭션 안에서 데이터 변경이 이뤄져야 함.
트랜잭션 시작은 엔티티매니저에서 트랜잭션 API를 받아와야 함
EntityTransaction tx = em.getTransaction();
JPA는 엔티티 객체 중심 개발이므로 검색 시에도 테이블이 아닌 엔티티 객체를 대상으로 검색해야함. 근데 그러려면 모든 데이터를 불러와서 객체로 변경한 다음 검색해야 하는데 사실상 불가능임. 그래서 검색 조건이 포함된 SQL을 사용해야하는데 JPQL(Java Persistence Query Language. SQL을 추상화한 객체지향 쿼리 언어) 을 작성하면 됨.
JPQL과 SQL의 차이점
면접 예상 질문