본문 바로가기

JPA 프로그래밍

[자바 ORM 표준 JPA 프로그래밍] Hello World 프로젝트 ( 2/2 )

- JPA 설정하기 ( persistence.xml)

  • JPA 설정파일
  • /META-INF/persistence.xml 위치
  • persistence-unit name으로 이름 지정
  • javax.persistence로 시작 : JPA 표준 속성
  • hibernate로 시작 : 하이버네이트 전용 속성

 

- persistence.xml 생성( 위치 : 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">
        <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는 특정 데이터베이스에 종속적이지 않습니다.
  • 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다릅니다.
    • 가변 문자 : Mysql은 VARCHA, Oracle은 VARCAR2
    • 문자열을 자르는 함수 : SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()
    • 페이징 : MySQL은 LIMIT, Oracle은 ROWNUM
  • 방언 : SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능

- hibernate.dialect 속성에 데이터베이스 지정

  • H2 : org.hibernate.dialect.H2Dialect
  • Oracle 10g : org.hibernate.dialect.Oracle10gDialect
  • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect

※ 하이버네이트는 40가지 이상의 데이터베이스 방언을 지원합니다.

 

- EntityManagerFactory와 EntityManager

  • EntityManagerFactory는 고객의 요청이 올 때마다 (thread가 하나 생성될 때마다) EntityManager를 생성하다.
  • EntityManager는 내부적으로 DB connection pool을 사용해서 DB에 접근한다.
  • EntityManagerFactory
    • JPA는 EntityManagerFactory가 만들어야 한다.
    • application loading 시점에 DB당 딱 하나만 생성되어야 한다.
  • EntityManager
    • 실제, Transaction 단위를 수행할 때마다 생성한다.
    • 즉, 고객의 요청이 올 때마다 사용했다가 닫는다.
    • thread 간에 공유하면 안된다.(사용 후 버림)
    • EntityManager인스턴스생성 후 close()메서드 반드시 호출
      • Transaction 수행 후에는 반드시 EntityManager를 닫는다.
      • 그래야 내부적으로 DB Connection을 반환한다.
  • EntityTransaction
    • Data를 "변경"하는 모든 작업은 반드시 Transaction 안에서 이루어 져야 합니다.

- JPA 작동 방식

※ Persistenct 클래스에서 설정 정보(1)를 읽어서 EntityManagerFactory 생성(2) 후 EntityManager 들을 생성(3)합니다.

 

 

- 실습진행

https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMain.java

 

oss0202/ex1-hello-jpa

JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.

github.com

 

1. 테이블 생성

create table Member (
 id bigint not null,
 name varchar(255),
 primary key (id)
);

2. Entity 생성

package hellojpa;

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

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

    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;
    }
}

3. Persist 실행

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        
        // 1. EntityManagerFactory 생성(persistence.xml name 매칭)
        // application loading 시점에 DB당 딱 하나만 생성되어야 한다.
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");
        
        // 2. EntityManager 생성
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        //transaction 처리가 반드시 있어야 한다.
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();

        // 3. 실제 code 작성
        Member member = new Member();

        member.setId(1L);
        member.setName("HelloA");

        entityManager.persist(member);

        tx.commit();

        entityManager.close();
        //WAS 가 종료되는 시점에 EntityManagerFactory 를 닫는다
        // -> 내부적으로 Connection pooling에 대한 Resource가 Release된다.
        entityManagerFactory.close();;
    }
}

 

※ Entity, Column이 실제 테이블과 다를 경우 매핑을 해주면 됩니다.

// Table 매핑
...
@Entity
@Table(name = "USER")
public class Member {
...

// Column 매핑
...
@Column(name - "username")
    private String name;
...

 

- 정석코드 ( try ~ catch)

https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainFind.java

 

oss0202/ex1-hello-jpa

JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.

github.com

- Update

// 별도로 persist 메서드를 호출해서 저장할 필요가 없다.
findMember.setName("HelloJPA");

https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainUpdate.java

 

oss0202/ex1-hello-jpa

JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.

github.com

- Delete

// 찾은 객체를 넣어주면 된다.
em.remove(findMember);

https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainDelete.java

 

oss0202/ex1-hello-jpa

JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.

github.com

 

- JPQL

  • SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • JPQL은 엔티티 객체를 대항으로 쿼리(DB를 변경해도 쿼리변경 불필요)
    • SQL은 데이터베이스 테이블을 대상으로 쿼리
  • SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요

https://github.com/oss0202/ex1-hello-jpa/blob/master/src/main/java/hellojpa/JpaMainJPQL.java

 

oss0202/ex1-hello-jpa

JPA Hello World. Contribute to oss0202/ex1-hello-jpa development by creating an account on GitHub.

github.com

 

출처

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com