JPA란
참고
What is JPA?
orm이란,
- Object Reation Mapping의 준말로, 객체와 rdb 사이의 괴리감을 줄여준다.
- 자바 코드로 rdb를 사용한다는 점에서 jdbc, mybatis 등과 같다.
- 하지만 jdbc, mybatis 등은 sql 쿼리문 작성이 빠질 순 없었다.
- jpa를 사용하면 개발자는 쿼리문 작성을 확 줄일 수 있다.
- 줄여주는 거지 아예 빠지진 않는다.
- orm은 rdb를 객체 사용하듯 편하게 사용하게 해주는 프레임 워크이다.
jpa란,
- java persistence api의 준말로, 자바 표준 orm 인터페이스이다.
- 표준 인터페이스로 구현체로는 hibernate 등이 있다.
- jpa를 통해 자바 개발자는 rdb에서 값을 가져오는 것을 마치 컬렉션에서 값을 꺼내오듯 사용할 수 있다.
- jpa 역시 jdbc를 사용하며, 그저 개발자가 귀찮을 일(커넥션 관리 등)을 보이지 않게 해준다.
spring-data-jps란,
- jpa를 스프링에서 사용하기 쉽도록 한 번 더 감싼 프레임워크이다.
- pure jpa보다 더 간단해 보이지만, 성능이나 사이드 이펙트 등을 고려해 제대로 공부하고 사용해야 한다.
Jpa init
JPA 설정
- META-INF/persistence.xml에 JPA 설정 파일이 들어간다.
- persistence-unit 태그는 DB 하나 당 하나의 설정이 들어간다.
- persistence.xml에 persistence-unit이 두 개 이상이라면, DB도 두 개 이상 사용이 가능하다.
- persistence-unit은 이름으로 구분한다.
- properties 태그 안에 property들이 들어가며, JPA 설정 정보들이 들어간다.
- javax.persistence로 시작한다면 JPA 표준 속성
- hibernate로 시작한다면 hibernate 전용 속성
- 만약 gradle을 사용한다면, class 태그 안에 엔티티 클래스들을 하나하나 다 명시해줘야 한다.
- 이거 maven은 안 그러던데 왜지??
JPA 동작 방식
- Persistence 객체로부터 EntityManagerFactory 객체를 받아온다.
- Persistence.createEntityManagerFactory(persistenceUnitName);
- Persistence 객체는 persistence.xml의 설정 정보를 바탕으로 EntityManagerFactory를 생성한다.
- EntityManagerFactory는 웹 서버가 떠 있는 동안에 계속 살아 있으며, 웹 서버가 죽을 때 없어진다.
- EntityManagerFactory는 EntityManager를 생성한다.
- emf.createEntityManager();
- EntityManger는 한 트랜잭션 당 하나를 생성해서 사용하며, 트랜잭션이 끝날 때 같이 close한다.
- EntityManager는 하나의 db 커넥션을 물고있기 때문에, 트랜잭션이 끝나면 꼭 close한다.
- EntityManager를 여러 쓰레드가 공유해선 안된다. 장애 발생이 우려됨.
- Entity 클래스의 객체를 EntityManager 객체를 이용해 작업을 수행한다.
- 조회를 제외한 생성, 수정, 삭제 작업은 트랜잭션 내에서 사용해야 한다. 아니면 동작 안함.
- em.getTransaction();
- tx.begin();
- tx.commit();
- tx.rollback();
- 조회를 제외한 생성, 수정, 삭제 작업은 트랜잭션 내에서 사용해야 한다. 아니면 동작 안함.
JPA Dialect
- JPA는 특정 RDBMS에 종속적이지 않다.
- 각각의 DB들은 조금씩 문법이 다른데, JPA는 어떤 DB를 사용하든 코드를 바꿀 필요가 없다.
- persistence.xml에 적절한 dialect를 명시해두면, 그에 맞는 쿼리로 바꿔서 날려준다.
- Hibernate는 약 40가지의 방언을 지원한다.
JPQL
- JPA를 사용하면 엔티티 중심적으로 개발한다.
- 애플리케이션에 필요한 데이터만 DB로부터 받아오기 위해선 검색 조건이 포함된 쿼리가 필요하다.
- JPQL은 SQL을 추상화한 객체 지향 쿼리 언어이다.
- JPQL 역시 특정 RDBMS에 종속적이지 않다.
- JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 언어이다.
This post is licensed under CC BY 4.0 by the author.