이 글은 김영한 님의 저서 「자바 ORM 표준 JPA 프로그래밍」을 학습한 내용을 정리한 글입니다. 모든 출처는 해당 저서에 있습니다.
자바로 작성된 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)
💡 인메모리(In-memory)
▪ 데이터가 시스템 메모리에 저장
▪ 프로그램 종료시 데이터 손실
프로젝트 생성, 테스트 빌드, 배포등의 작업을 위한 프로그램
구분 | 내용 |
---|---|
특징 | ▪ 각 프로젝트에 대한 XML기반 빌드 스크립트 개발 ▪ 형식적인 규칙 x - 결과물 넣을 정확한 위치 지정 필요 - 프로젝트에 특화된 Target과 Dependency 이용해 모델링 ▪ 절차적 : 명확한 빌드 절차 정의 필요 ▪ 생명주기 x → 각 target에 대한 의존관계 및 일련의 작업 정의 필요 |
단점 | ▪ 프로젝트가 복잡해질 경우 각각의 Build 과정 이해 어려움 ▪ XML, Remote Repository(Dependency) 사용 x ▪ 스크립트의 재사용 어려움 |
구분 | 내용 |
---|---|
특징 | ▪ Dependency 관리 ▪ 표준화된 프로젝트(Standardize project) 제공 ▪ XML, Remote Repository 사용 가능 : 개발에 필요한 종속되는 'jar', 'class path'를 'POM.xml'에 선언시 다운로드 없이 사용 가능 ▪ 상속형 : 하위 XML이 필요 없는 속성도 모두 표기 ▪ 계층적인 데이터를 표현하기에 좋음 |
단점 | ▪ 라이브러리가 서로 종속시 XML의 복잡도 증가 ▪ 플로우나 조건부 상황 표현 어려움 ▪ 맞춤화 된 로직 실행 어려움 |
JPA & 하이버네이트(Hibernate) : JPA 표준과 하이버네이트를 포함하는 라이브러리
hibernate-core
: 하이버네이트 라이브러리hibernate-entitymanager
: 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리hibernate-jpa-2.1-api
: JPA 2.1 표준 API를 모아둔 라이브러리H2 데이터베이스 : H2 데이터베이스 접속을 위한 라이브러리
DB와 객체의 관계를 매핑해주는 기능
패키지 → javax.persistence
종류
항목 | 내용 |
---|---|
@Entity | ▪ 테이블과 매핑할 클래스를 JPA에게 알려줌 ▪ @Entity 가 사용된 클래스를 엔티티 클래스라고 함 |
@Table | ▪ 엔티티 클래스에 매핑할 테이블 정보 알려줌 ▪ 생략시 클래스명을 테이블(엔티티)명으로 매핑 |
@Id | ▪ 엔티티 클래스의 필드를 테이블의 기본 키(Primary key)에 매핑 ▪ @Id가 사용된 필드를 식별자 필드라고 함 |
@Column | ▪ 필드를 컬럼에 매핑 ▪ 생략시 필드명을 사용하여 칼럼명으로 매핑 ▪ 대소문자 구분하는 데이터베이스 사용시 명시적으로 매핑해야 함 |
persistence.xml
을 사용하여 설정 정보 관리META-INF/persistence.xml
클래스 패스 경로에 존재<?xml version="1.0" encoding="UTF-8"?>
<!--XML 네임스페이스와 사용 버전 지정-->
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<!--영속성 유닛 등록 및 이름 부여-->
<persistence-unit name="jpabook" >
<properties>
<!--필수 속성-->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<!--옵션-->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
</persistence>
💡 영속성 유닛(Persistence-unit)
- 응용프로그램의 EntityManager 인스턴스에 의해 관리되는 모든 엔티티 클래스 집합
- 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛 등록
- 고유한 이름을 부여해야 함
✅ 속성값 분석
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
...
JPA 표준 속성
속성 | 설명 | 중요도 |
---|---|---|
javax.persistence.jdbc.driver | JDBC 드라이버 | 필수 |
javax.persistence.jdbc.user | 데이터베이스 접속 아이디 | 필수 |
javax.persistence.jdbc.password | 데이터베이스 접속 비밀번호 | 필수 |
javax.persistence.jdbc.url | 데이터베이스 접속 url | 필수 |
하이버네이트 속성
속성 | 설명 | 중요도 |
---|---|---|
hibernate.dialect | 데이터베이스 방언(dialect) 설정 | 필수 |
hibernate.show_sql | 하이버네이트가 실행한 SQL 출력 | 옵션 |
hibernate.format_sql | 하이버네이트가 실행한 SQL을 출력할 때 보기 쉽게 정렬 | 옵션 |
hibernate.use_sql_comments | 쿼리 출력시 주석도 출력 | 옵션 |
hibernate.id.new_generator_mappings | JPA 표준에 맞춘 새로운 키 생성 전략 사용 | 옵션 |
🔍 차이점
javax.persistence
- JPA 표준 속성
- 특정 구현체에 종속되지 않음
hibernate
- 하이버네이트 전용 속성
- 하이버네이트에서만 사용 가능
SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능
각 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다름
[예시]
항목 | 오라클 | 오라클 외 |
---|---|---|
데이터 타입 - 가변 문자 타입 - | VARCHAR2 | VARCHAR |
함수명 - 문자열 자르는 함수 - | SUBSTR() | SUBSTRING() |
페이징 처리 | ROWNUM | LIMIT |
특정 데이터베이스에 종속되는 기능 사용
→ 데이터베이스 교체 어려움
package jpabook.start;
import javax.persistence.*;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
//[엔티티 매니저 팩토리] - 생성
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("jpabook");
//[엔티티 매니저] - 생성
EntityManager em = emf.createEntityManager();
//[트랜잭션] - 획득
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); //[트랜잭션] - 시작
logic(em); //비즈니스 로직 실행
tx.commit(); //[트랜잭션] - 커밋
} catch (Exception e) {
tx.rollback(); //[트랜잭션] - 롤백
} finally {
em.close(); //[엔티티 매니저] - 종료
}
emf.close(); //[엔티티 매니저 팩토리] - 종료
}
//비즈니스 로직
private static void logic(EntityManager em) {...}
}
엔티티 매니저 팩토리
엔티티 매니저
사용이 끝난 엔티티 매니저나 애플리케이션 종료시 엔티티 매니저 팩토리는 반드시 종료
엔티티 매니저(em
)를 통해 작업(등록
, 수정
, 삭제
, 조회
) 수행
- JPA에서 SQL을 추상화하여 제공하는 객체지향 쿼리 언어
- SQL과 문법의 거의 유사함
- 데이터베이스 테이블 인식 x
개요
JPQL vs SQL
JPQL | SQL | |
---|---|---|
쿼리 대상 | 엔티티 객체 | 데이터베이스 테이블 |
대소문자 구분 | O | x |
사용
em.createQuery(JPQL, 반환 타입)
메소드 실행getResultList()
메소드 호출📖 참고