Q. 객체를 자바 컬렉션에 저장 하듯이 데이터베이스에 저장할 수는 없을까?
A. 있다. 그게 바로 JPA다.
ORM이란?
- Object-Relational Mapping = 객체 관계 매핑
- 객체는 객체대로 설계하고 관계형 DB는 관계형으로 설계한다.
- 그리고 ORM이라는 기술이 이 둘의 중간에서 서로 다른부분들을 매핑을 해준다.
JPA(Java Persistence API)
- JPA는 EJB의 엔티티 빈으로부터 시작됬는데 EJB의 엔티티 빈은 너무 어렵고 복잡해서 실용성이 떨어지는 기술이었음.
- 그래서 개빈 킹이라는 개발자가 하이버네이트라는 오픈소스를 개발하였고 이 하이버네이트는 많은 인기를 받았음.
- 그래서 EJB가 개빈 킹을 데려와서 JPA 표준을 만듬.
- 즉 JPA는 자바 진영의 OMR 기술 표준 명세
- JPA는 인터페이스의 모음이고 JPA를 구현한 대표적인 구현체로는 하이버네이트가 있음.
- 하이버네이트도 오픈소스였지만 추후 JPA 표준에 맞춰 컨버팅해서 개발함.
- JPA는 Application과 JDBC 사이에서 동작함.
- JDBC Temaplate이나 MyBatis랑 비슷한 느낌으로 JPA가 JDBC API를 대신 사용하는 것
- JPA만의 가장 큰 차이점은 예를 들어 어떤 객체를 DB에 저장한다고하면, JPA에서는 저장할 객체(엔티티)를 분석해서 INSERT SQL을 생성한 다음 JDBC API를 통해 DB에 쿼리를 날려준다.
JPA를 사용하는 이유
1. SQL 중심 개발에서 벗어나 객체 중심을 개발이 가능하다.
- SQL 쿼리문을 작성하지 않고 개발이 가능하다!
2. 생선상 & 유지보수
- SQL 쿼리문을 작성하지 않고 개발 가능 즉 컬렉션에 저장, 조회 하듯이 사용할 수 있기때문에 생산성과 유지보수 측면에서 좋다.
3. 패러다임의 불일치 해결
- 객체 지향과 관계형 데이터베이스 사이의 불일치를 해결해준다.
4. 성능
- 1차 캐시와 엔티티 동일성 보장
- 쓰기 지연
- 지연 로딩 / 즉시 로딩
- 이 부분들에 대해선 뒤에서 더 다루겠다.
등 JPA 사용시 이점이 많다!!
하지만 JPA를 사용하기전에 객체지향, DB와 SQL문에 대해서 잘 알고있어야한다.
JPA로 구성한 코드들을 SQL문으로도 작성이 가능해야한다.
JPA 구동 방식
(Maven 기준으로 설명)
- JPA는 Persistence라는 클래스를 가지고 있고 Persistence라는 클래스가 META-INF 폴더 밑에 persistence.xml이라는 설정 정보 파일을 조회한다.
- Persistence클래스가 설정 정보 파일을 읽은 후 설정 정보를 기반으로 EntityManagerFactory 클래스 생성
- EntityManagerFactory에서 필요할때마다 EntityManager 생성함
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("설정 파일에 작성한 Unit이름");
EntityManager em = emf.createEntityManager();
em.close();
emf.close()
- 참고로 JPA의 모든 변경은 트랜잭션 안에서 실행되야한다.
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
tx.commit();
}catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
엔티티 매니저 팩토리 & 엔티티 매니저
- 엔티티 매니저 팩토리는 말 그대로 엔티티 매니저를 생성하는 공장이다.
- 엔티티 매니저는 엔티티 저장, 수정, 삭제, 조회 등 엔티티와 관련된 모든 일을 처리한다
- 엔티티 매니저 팩토리를 생성할 떄 비용이 상당히 든다. 공장이니까^^
- 그래서 엔티티 매니저 팰토리는 1개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어있음
- 그리고 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하지만 엔티티 매니저는 여러 스레드가 동시에 접근할 경우 동시성 문제가 발생하여 스레드 간 공유 절대 불가
자바 ORM 표준 JPA 프로그래밍-기본편을 학습하면서 정리한 블로그입니다.