인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의노트
데이터베이스 방언
JPA는 특정 데이터베이스에 종속되지 않는다.
각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다.
방언 : SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
어플리케이션을 설정할 때, 어떤 방언으로 변환하여 쿼리를 날려야 할지 정해 줄 수 있다.
hibernate는 40가지 이상의 데이터베이스 방언을 지원한다.
ex. H2 데이터베이스 쿼리로 바꿔서 날려줘~
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
JPA 구동 방식
- Persistence가 MeTA-INF/persistence.xml에서 설정 정보를 조회
- Persistence가 EntityManagerFactory 생성
- EntityManagerFactory가 EntityManager 생성
주의
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
> 프로젝트에서는 빈으로 만들어서 관리했었다.!
- 엔티티 매니저는 스레드간에 공유X(사용하고 버려야 한다)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL 소개
JPA를 사용하면 엔티티 객체를 중심으로 개발한다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 이 때, 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하다. 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. > 특정 데이터베이스 SQL에 의존하지 않는다.
예를 들어 이런 식으로 쿼리를 날리면
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
List<Member> result = em.createQuery("select m from Member as m",Member.class)
.setFirstResult(5)
.setMaxResults(8)
.getResultList();
for(Member member : result){
System.out.println("member.getName() = " + member.getName());
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
"select m from Member as m" 쿼리는 Member라는 객체 대상으로 쿼리가 짜여져 있다.
이 쿼리를 설정해두었던 방언으로 JPA가 번역해서 DB쪽에 쿼리를 날려준다.
'STUDY > JPA' 카테고리의 다른 글
[3-3] 플러시 (0) | 2023.07.05 |
---|---|
[3-2] 영속성 컨텍스트의 이점 (+Batch) (0) | 2023.07.04 |
[3-1] 영속성 컨텍스트란? (0) | 2023.07.03 |
[1-2] JPA 소개 (0) | 2023.06.29 |
[1-1] JPA가 나오게 된 배경 - SQL 중심적인 개발의 문제점 (0) | 2023.06.28 |