자바 ORM 표준 JPA 프로그래밍(기본편) - JPA 시작하기

최준석·2022년 10월 21일
0

JPA시작하기


JPA로 개발을 하기위해 필요한 설정

1. resources/META-INF/persistence.xml 파일 만든 후 DB 연결관련 설정하기

예시)

<?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/~/jpashop"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <!-- 옵션 -->

            <!-- SQL쿼리문 출력해주는 설정 -->
            <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>

persistence-unit name으로 이름을 지정한다.

javax.persistence로 시작하는 설정은 JPA 표준 속성이고, hibernate로 시작하는 설정은 하이버네이트 적용 속성이다.

hibernate.dialect 부분은 어떤 DB방언을 사용할건지 설정해주는 부분이다. 설정하면 JPA에서 자동으로 해당 DB의 방언으로 번역해 쿼리를 날림

데이터베이스 방언이란?

SQL표준을 지키지 않는 각 DB만의 고유한 기능

하이버네이트는 40가지 이상의 다양한 DB방언을 지원한다.

2. pom.xml에 필요한 디펜던시 설정

예시)

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>jpa-basic</groupId>
    <artifactId>ex1-hello-jpa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ex1-hello-jpa</name>
    <description>ex1-hello-jpa</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.12.Final</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

필요한 디펜던시들을 해당 Springboot버전에 맞게 입력해주고 동기화 해주면 된다.

3. main/java 안에 Main클래스 생성

예시)

package hellojpa;

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 {
			//실행할 코드 입력
            
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}

EntityManagerFactoryEntityManager를 생성하고 EntityTransaction내에서 로직을 실행한 후 commit()하는 코드이다. Transaction중에 문제가 생기면 catch()문 내에 있는 rollback()을 실행하며, 결과와 상관없이 em.close()를 통해 EntityManager를 닫고 그 후에 애플리케이션의 모든 로직이 끝나면 EntityManagerFactory를 닫는다.

객체와 테이블을 생성하고 매핑하기

@Entity : JPA가 관리할 객체
@Id : 데이터베이스 PK와 매핑

주의점

엔티티 매니저 팩토리(EntityManagerFactory)는 하나만 생성해서 애플리케이션 전체에서 공유한다.
엔티티 매니저(EntityManager)는 쓰레드간에 공유하지 않고 사용이 끝나자 말자 닫아주어야 한다.

JPA의 모든 데이터는 트랜잭션안에서 실행 되어야 한다.

가장 단순한 조회 방법

EntityManager.find()

JPQL

JPA를 사용하면 엔티티객체를 중심으로 개발하는데, 검색을 할 때도 테이블이 아닌 Entity 객체를 대상으로 검색한다. 모든 DB데이터를 객체로 변환해 가져와서 검색하는건 불가능 하므로 필요한 데이터만 가져오려면 SQL쿼리문이 필요하다. 이때 사용하는 것이 JPQL인데, SQL문법과 상당히 유사하면서 객체를 대상으로 쿼리를 날리면 이걸 SQL쿼리문으로 변환해 데이터베이스 테이블을 대상으로 쿼리를 날린다.

출처 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
(자바 ORM 표준 JPA 프로그래밍 - 기본편)

profile
Back-End Web Developer

0개의 댓글