실습을 위해 생성한 프로젝트의 JPA의 설정파일인 persistence.xml이다.
이 파일은 /META-INF/persistence.xml 경로에 위치한다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="<http://xmlns.jcp.org/xml/ns/persistence>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"
xsi:schemaLocation="<http://xmlns.jcp.org/xml/ns/persistence> <http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd>">
<persistence-unit name="hello">
<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.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
javax.persistence로 시작하는 속성: JPA 표준 속성hibernate로 시작하는 속성: Hibernate 전용 속성JPA (Java Persistence API)는 자바 진영의 ORM (Object-Relational Mapping) 표준 기술로, 자바 객체와 관계형 데이터베이스 테이블 간의 매핑을 정의하고 이를 통해 데이터베이스 작업을 간소화한다. 대표적인 JPA의 구현체로는 Hibernate가 있으며, Hibernate는 다양한 데이터베이스의 방언(Dialect)을 지원하여 특정 데이터베이스에 종속되지 않도록 도와준다.
각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다른데 다음과 같은 예시가 있다.
가변 문자 : MySQL - VARCHAR, Oracle - VARCHAR2
문자열을 자르는 함수 : SQL 표준 - SUBSTRING(), Oracle - SUBSTR()
페이징 : MySQL - LIMIT, Oracle - ROWNUM
이러한 차이를 방언(Dialect)라고 하며, JPA 구현체들(Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등)은 이런 문제를 해결하려고 다양한 데이터베이스 방언 클래스를 제공한다. 이로써 특정 데이터 베이스의 의존적인 방언 처리는 JPA를 사용하게 되면서 종속적이지 않게 된다.

EntityManagerFactory와 EntityManager
트랜잭션 안에서 데이터 변경
EntityManager의 데이터베이스 커넥션 관리
em.close()로 꼭 닫아줘야한다. (쓰레드간에 공유하면 안되고 무조건 사용하고 버려야한다.)데이터를 가져와서 수정할 때는 수정한 객체를 다시 저장하지 않아도 된다.
💡 값만 바꿨는데 어떻게 반영이 될까?
find()로 db에서 엔티티를 조회하면, JPA는 해당 엔티티를 영속성 컨텍스트에서 관리하게 되는데, 이를 트랜잭션 커밋하는 시점에 확인하고 이 때, 변경된 데이터가 있으면 Update 쿼리가 날아가는 것이다.
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
💡 JPQL과 SQL의 차이점
JPQL : 엔티티 객체를 대상으로 쿼리
SQL : 데이터베이스 테이블을 대상으로 쿼리
📌 본 포스팅은 '인프런 - 김영한님 강의(자바 ORM 표준 JPA 프로그래밍 - 기본편)'를 듣고 정리한 내용입니다.