본문 바로가기

JPA

[JPA] JPA 생성 및 개발

 

 

 

JPA(Java Persistence API)는 특정 데이터베이스에 종속되지 않도록 설계되었습니다. 이는 JPA를 사용하여 애플리케이션을 개발할 때, 데이터베이스 벤더(예: MySQL, Oracle, PostgreSQL 등)에 종속되지 않고, 필요에 따라 쉽게 데이터베이스를 변경할 수 있음을 의미합니다. 이를 가능하게 하는 것이 바로 **데이터베이스 방언(Dialect)**입니다.

 

데이터베이스 방언은 JPA 구현체(Hibernate 등)가 특정 데이터베이스 벤더의 고유한 SQL 문법과 기능을 지원하기 위해 제공하는 설정입니다. 각 데이터베이스는 SQL 표준을 따르면서도, 고유한 확장 기능과 문법을 제공합니다. 방언을 통해 JPA는 이러한 데이터베이스 고유의 기능을 처리할 수 있습니다.

 

 

Hibernate는 Java 언어로 작성된 객체 관계 매핑(ORM) 프레임워크입니다. ORM은 객체 지향 프로그래밍 언어에서 사용되는 객체를 관계형 데이터베이스의 테이블에 매핑하는 기술입니다. Hibernate는 JPA(Java Persistence API)의 구현체 중 하나로, JPA의 표준을 따르면서도 여러 가지 추가 기능을 제공합니다.

 

H2 데이터베이스 설치와 실행

http://www.h2database.com/

최고의 실습용 DB

가볍다.(1.5M)

웹용 쿼리툴 제공

MySQL, Oracle 데이터베이스 시뮬레이션 기능

시퀀스, AUTO INCREMENT 기능 지원


압축을 풀고 bin 디렉토리 아래의 h2.bat 또는 h2.sh 을 실행하면 H2 데이터베이스가 서버 모드로 실행된다.

-> ./h2.sh 실행 명령어

build.gradle

plugins {
    id 'java'
}

group = 'org.example'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

java {
    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'
}

dependencies {
    // JPA 하이버네이트
    implementation 'org.hibernate:hibernate-entitymanager:5.6.12.Final'

    // H2 Database
    runtimeOnly 'com.h2database:h2:2.1.214'

}

tasks.named('test') {
    useJUnitPlatform()
}

JPA 설정하기 - persistence.xml

JPA 설정 파일

/META-INF/persistence.xml 위치

persistence-unit name으로 이름 지정

javax.persistence 시작: JPA 표준 속성

hibernate 시작: 하이버네이트 전용 속성

 

src/main/resources/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">
        <class>org.example.Member</class>
        <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>

 

 

JPA 구동 방식

 

  • 설정 정보 조회
    • JPA는 META-INF/persistence.xml 파일을 통해 설정 정보를 조회합니다.
    • 이 파일은 데이터베이스 연결 정보, 엔티티 클래스, JPA 공급자 등의 설정을 포함합니다.
  • EntityManagerFactory 생성
    • Persistence 클래스는 persistence.xml 파일을 기반으로 EntityManagerFactory를 생성합니다.
    • EntityManagerFactory는 애플리케이션 전체에서 하나만 생성되어야 하며, 비용이 많이 드는 객체입니다.
  • EntityManager 생성
    • EntityManagerFactory를 통해 여러 EntityManager 인스턴스를 생성할 수 있습니다.
    • EntityManager는 실제 데이터베이스 작업을 수행하는 데 사용되며, 트랜잭션을 관리합니다.
    • 각 EntityManager는 하나의 트랜잭션 범위 내에서 사용됩니다.

주요 클래스 및 인터페이스

  • Persistence
    • JPA의 진입점으로, EntityManagerFactory를 생성하는 정적 메서드를 제공합니다.
    • Persistence.createEntityManagerFactory("persistenceUnitName") 메서드를 사용하여 EntityManagerFactory를 생성합니다.
  • EntityManagerFactory
    • EntityManager를 생성하는 팩토리입니다.
    • EntityManagerFactory는 애플리케이션 전체에서 하나만 생성되어야 합니다.
    • close() 메서드를 호출하여 리소스를 해제할 수 있습니다.
  • EntityManager
    • 데이터베이스 작업(삽입, 수정, 삭제, 조회 등)을 수행하는 객체입니다.
    • EntityManager는 스레드 간에 공유되지 않아야 하며, 각각의 트랜잭션 범위 내에서 사용됩니다.
    • beginTransaction(), commit(), rollback() 등의 메서드를 통해 트랜잭션을 관리합니다.

Member.class

package org.example;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Member {
    @Id
    private Long id;
    private String name;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

JpaMain.class

package org.example;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try{
//            1. 저장
//            Member member = new Member();
//            member.setId(1L);
//            member.setName("John Doe");
//            em.persist(member);

//            2. 조회
//            Member member = em.find(Member.class, 1L);
//            System.out.println("member :" + member.getName());

//            3. JPQL
            List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
            for(Member member : result){
                System.out.println("membner :" + member.getName());
            }
            tx.commit();
        } catch (Exception e){
            tx.rollback();
            e.printStackTrace();
        } finally{
            em.close();
        }
        emf.close();
    }
}

 

 

persist(저장)

find(조회)

 

JPQL(전체조회)

 

JPQL (Java Persistence Query Language)는 JPA (Java Persistence API)에서 제공하는 객체 지향 쿼리 언어로, 엔티티 객체를 대상으로 검색을 수행합니다. 이를 통해 개발자는 데이터베이스 테이블이 아닌 엔티티 객체를 직접 다룰 수 있으며, 데이터베이스 종속성을 최소화할 수 있습니다.

JPQL의 특징

  1. 객체 중심의 개발:
    • JPA를 사용하면 엔티티 객체를 중심으로 애플리케이션을 개발합니다. 이는 객체 지향 프로그래밍 패러다임과 잘 맞으며, 개발자가 비즈니스 로직에 더 집중할 수 있게 합니다.
  2. 검색 쿼리 문제:
    • 엔티티 객체를 중심으로 개발하다 보면, 검색 쿼리를 작성할 때도 테이블이 아닌 엔티티 객체를 대상으로 해야 합니다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 비효율적이므로, 필요한 데이터만 DB에서 불러오기 위해 검색 조건이 포함된 SQL이 필요합니다.
  3. JPQL 제공:
    • JPA는 SQL을 추상화한 JPQL을 제공하여, 객체 지향적인 방식으로 쿼리를 작성할 수 있게 합니다. JPQL은 SQL과 문법이 유사하며, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등의 SQL 구문을 지원합니다.
  4. 엔티티 객체 대상 쿼리:
    • JPQL은 엔티티 객체를 대상으로 쿼리를 수행합니다. 반면, SQL은 데이터베이스 테이블을 대상으로 쿼리를 수행합니다.
  5. 객체 지향 쿼리:
    • JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리입니다. 이를 통해 개발자는 데이터베이스의 특정 SQL에 의존하지 않고, 객체 지향적으로 데이터를 검색할 수 있습니다.

'JPA' 카테고리의 다른 글

[JPA] JPA 연관관계 매핑 (2)  (0) 2024.06.29
[JPA] JPA 연관관계 매핑 (1)  (0) 2024.06.29
[JPA] JPA 엔티티 매핑  (0) 2024.06.29
[JPA] JPA 영속성 관리  (0) 2024.06.29
[JPA] JPA 소개  (0) 2024.06.29