[Spring boot] JPA - 순수 JPA 프로젝트 설정(import 문제, 라이브러리 정리)

순수 JPA IntellJ로 만들어보기

Maven으로 진행

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>pureJPA</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>pureJPA</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!-- JPA API -->
    <dependency>
      <groupId>jakarta.persistence</groupId>
      <artifactId>jakarta.persistence-api</artifactId>
      <version>3.1.0</version>
    </dependency>

    <!-- JPA 구현체 (Hibernate) -->
    <dependency>
      <groupId>org.hibernate.orm</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>6.4.4.Final</version>
    </dependency>

    <!-- DB (예: H2) -->
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>2.2.224</version>
      <scope>runtime</scope>
    </dependency>

    <!-- 로그 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>2.0.12</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
             version="3.0">

    <persistence-unit name="pure-jpa">
        <class>com.example.Member</class>

        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:file:/Users/jeongjaeyoon/database/h2/h2"/>
            <property name="jakarta.persistence.jdbc.user" value="sa"/>
            <property name="jakarta.persistence.jdbc.password" value=""/>

            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>

</persistence>

 

DataBase(H2) 설정

H2 데이터베이스 설정

https://www.h2database.com/html/main.html

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2.5 MB jar file size     Supp

www.h2database.com

 

  • All Platforms 선택

 

h2폴더로 들어가서 파일 생성

touch h2.mv.db
(base) h2 % cd bin
(base) bin % chmod +x h2.sh
(base) bin % ls
h2-2.4.240.jar	h2.bat		h2.sh		h2w.bat
(base) bin % ./h2.sh

 

JDBC URL은 다음과 같이 진행

jdbc:h2:file:/Users/{본인꺼}/database/h2/h2
  • 위처럼 해야되는 게
    • 이 URL은 H2가 이렇게 해석함
    • DB 이름(파일 베이스): /Users/jeongjaeyoon/database/h2
    • 찾는 파일: /Users/jeongjaeyoon/database/h2.mv.db
    • 그래서 /database/h2/h2.mv.db 이렇게 해주어야함

SQL문

CREATE TABLE MEMBER(
   ID VARCHAR(255) NOT NULL,
   NAME VARCHAR(255),
   AGE INTEGER NOT NULL,
   PRIMARY KEY (ID)
)

 

값 넣기

INSERT INTO MEMBER (ID, NAME, AGE)
VALUES ('member1', '재윤', 25);

 

 

라이브러리 정리

  • JPA 구현체로 우리는 하이버네이트를 사용 여기서 핵심 라이브러리는 다음과 같음
    • hibernate-core : 하이버네이트 라이브러리
    • hibernate-entitymanager: 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리
  • pom.xml
    • <dependencies>에 사용할 라이브러리 지정 → groupId + artifactId + version만 적어주면 라이브러리(jar 파일)를 메이븐 공식 저장소에서 내려 받아 라이브러리에 추가됨
    • JPA, 하이버네이트(hibernate-entitymanager) : JPA 표준과 하이버네이트를 포함하는 라이브럴, hibernate-entitymanger를 라이브러로 지정하면 다음 중요 라이브러리도 함께 내려 받음
      • hibernate-core.jar
    • H2 DB : H2 DB에 접속해야 하므로 h2 라이브러리
  • persistence.xml
    • <persistence-unit name="pure-jpa"> → JPA 설정은 영속성 유닛이라는 것부터 시작하는데 일반적으로 연결할 DB당 하나의 영속성 유닛을 등록함 그리고 이 유닛에 고유한 이름을 부여해야하는데 pure-jpa로 함.
    • <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/> → JDBC 드라이버 user, password는 DB 접속 아이디 비번, url은 DB 접속 url
    • <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> → 이건 DB 방언 설정
    → persistence로 시작하는 속성은 JPA 표준 속성으로 특정 구현체에 종속되지 않는다. 반면 hibernate로 시작하는 속성은 하이버네이트 전용 속성이라 하이버네이트에서만 사용 가능

 

  • JPA는 특정 DB에 종속되지 않음
    • SQL 표준을 지키지 않거나 특정 DB만의 고유한 기능을 JPA에서는 방언(Dialect)라고 함. 그래서 persistence.xml에서 하이버네이트한테 방언 알려준 거임.

 

import 문제

  • 현재 이렇게 임포트를 함
import jakarta.persistence.*;
  • 참고용은
import javax.persistence.*

 

차이부터 보자

  • 옛날 JPA(JAVA EE 시절) 패키지
import javax.persistence.*
  • 현재 JPA(jakarta EE 시절) 패키지
import jakarta.persistence.*;

 

개념/기능은 거의 동일함 하지만 패키지 이름이 바뀌었기 때문에 바이너리 호환이 깨진 대규모 네임 스페이스 변경임

 

왜 바뀌었나?

Java EE → Jakarta EE로 넘어가면서 발생한 변화

  • 과거 Java EE는 javax.* 네임스페이스를 사용
  • Java EE가 Eclipse Foundation으로 넘어가 “Jakarta EE”가 됨
  • 상표/법적 이유로 javax.*를 계속 쓸 수 없어서
  • *Jakarta EE 9부터 패키지명이 전부 jakarta.로 변경

가장 중요한 차이 → 호환성

소스 코드는 비슷해 보여도

import javax.persistence.Entity;

import jakarta.persistence.Entity;

 

 

→ 이 두개는 JVM 입장에서 완전히 다른 타입임

 

같은 프로젝트에서 절대 섞어 쓰면 안 된다…

 

Spring boot 기준으로 딱 갈림

  • Spring boot 2.x
    • JPA 패키지 → javax.persistence
    • Hibernate → 5.x 계열
    • Java 최소 버전 → 8 ~ 11
    • 주요 변화 → 기존 EE
  • Spring boot 3.x
    • JPA 패키지 → jakarta.persistence
    • Hibernate → 6.x 계열
    • Java 최소 버전 → 17+
    • 주요 변화 → Jakarta EE 전환 완료

내가 판 프로젝트를 보면

    <dependency>
      <groupId>org.hibernate.orm</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>6.4.4.Final</version>
    </dependency>

 

  • 현재 자바 21을 사용중

→ 그래서 jakarta가 맞음