객체를 관계형 데이터베이스에 저장할 때 발생하는 여러가지 문제점들이 존재한다.
문제점(차이점) | 설명 |
---|---|
상속 | 객체에는 상속이 존재하지만, RDB에는 존재하지 않는다. |
연관관계 | 객체는 참조를 사용하지만, RDB는 FK를 사용한다. |
데이터 타입 | 객체와 RDB에 존재하는 데이터 타입이 다르다. |
데이터 식별 방법 | 객체 - 주소를 통한 식별, RDB - PK를 통한 식별 |
위와 같은 문제를 해결하기 위해선 ORM 기술이 필요하다.
ORM (Object-Relational Mapping)
: 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해 주는 기술
JPA (Java Persistence API)
: 자바 진영의 ORM 기술 표준
애플리케이션과 JDBC 사이에서 동작, SQL을 객체로 자동 변환
1차 캐시와 동일성 보장
: 같은 트랜잭션 안에서는 같은 엔티티를 반환한다!
트랜잭션을 지원하는 쓰기 지연 기능
: 트랜잭션을 커밋할 때까지 쿼리를 모은 다음, 한꺼번에 전송한다.
지연 로딩과 즉시 로딩 옵션
JPA는 특정 데이터베이스에 종속되지 않는다.
: 각 데이터베이스의 방언에 맞게 SQL을 생성한다.
구동 방식을 이해하기 전에, 3가지 요소를 알아야 한다.
1.
Persistence.xml
DB 설정에 필요한 정보를 기술해둔 파일
JPA는 이 파일을 바탕으로 DB의 정보를 가져온다.
Persistence.xml
파일에는 '옵션' 속성들이 존재한다.ddl.auto
속성은 다음 5가지 값을 가질 수 있다.⚠️ create, create-drop, update는 운영 서버에서는 사용하면 안된다!!!!
2. EntityManager
엔티티의 CRUD를 담당하는 인터페이스
엔티티와 관련된 모든 서비스를 담당한다.
- EntityManager의 작업은 트랜잭션 단위로 처리해야 한다.
- EntityManager는 쓰레드간에 공유되지 않는다.
3. EntityMangerFactory
EntityManager를 생성하는 공장 역할 수행
- EntityManagerFactory는
Persistence.xml
파일의 정보를 토대로 생성한다.- EntityManagerFactory는 DB당 하나씩만 생성한다.
이제, JPA의 구동 방식에 대해서 알아보자.
Persistence.xml
설정정보로 EntityManagerFactory
생성EntityManagerFactory
는 필요할 때마다 EntityManager
생성EntityManager
를 통해서 DB에 접근JPQL (Java Persistence Query Language)
: 엔티티 객체를 조회하는 객체 지향 쿼리
⚠️ JPQL은 테이블을 대상으로 쿼리를 하지 않고, 객체를 대상으로 쿼리를 한다.
JPQL에 대해서는 이후에 더 자세히 설명하겠다.