[JPA] JPA 시작하기

jimmy·2025년 1월 16일

persistence.xml

실습을 위해 생성한 프로젝트의 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란 무엇인가?

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를 사용하게 되면서 종속적이지 않게 된다.


JPA 구동 방식

  1. Persistence 클래스에서 시작
  2. persistence.xml에서 설정 정보를 조회
  3. EntityManagerFactory 객체 생성
  4. EntityManagerFactory에서 필요할 때마다 EntityManager를 생성하여 데이터베이스 작업 수행

JPA 주의 사항

  1. EntityManagerFactory와 EntityManager

    • EntityManagerFactory는 웹 서버가 올라오는 시점에 DB당 1개의 객체만 생성한다.
    • EntityManager는 트랜잭션 단위로 생성된다.
  2. 트랜잭션 안에서 데이터 변경

    • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다.
    • 트랜잭션이 없으면 데이터베이스에 변경 사항이 반영되지 않는다.
  3. EntityManager의 데이터베이스 커넥션 관리

    • EntityManager가 내부적으로 데이터베이스 커넥션을 물고 동작하기 때문에 em.close()로 꼭 닫아줘야한다. (쓰레드간에 공유하면 안되고 무조건 사용하고 버려야한다.)
    • EntityManager가 내부적으로 데이터베이스 커넥션을 물고 동작한다는 것은, EntityManager가 데이터베이스와의 상호작용을 위해 데이터베이스 연결을 관리한다는 뜻이다.
      즉, EntityManager는 데이터베이스에 쿼리를 보내거나, 데이터를 가져오는 등의 작업을 수행할 때, 필요한 커넥션을 열고 이를 유지한다.
      이 커넥션은 리소스이기 때문에, 사용이 끝난 후에는 닫아주어야 하는데, 그렇지 않으면 커넥션 누수가 발생할 수 있어, 나중에 새로운 커넥션을 열 수 없거나 성능 저하가 발생할 수 있다.
      따라서 em.close()를 호출하여 EntityManager를 닫음으로써, 내부적으로 열려 있는 커넥션도 함께 종료해 주는 것이 중요하다.

더티체킹

데이터를 가져와서 수정할 때는 수정한 객체를 다시 저장하지 않아도 된다.

💡 값만 바꿨는데 어떻게 반영이 될까?
find()로 db에서 엔티티를 조회하면, JPA는 해당 엔티티를 영속성 컨텍스트에서 관리하게 되는데, 이를 트랜잭션 커밋하는 시점에 확인하고 이 때, 변경된 데이터가 있으면 Update 쿼리가 날아가는 것이다.


JPQL

JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.

💡 JPQL과 SQL의 차이점
JPQL : 엔티티 객체를 대상으로 쿼리
SQL : 데이터베이스 테이블을 대상으로 쿼리


📌 본 포스팅은 '인프런 - 김영한님 강의(자바 ORM 표준 JPA 프로그래밍 - 기본편)'를 듣고 정리한 내용입니다.

profile
백문이 불여일기

0개의 댓글