JPA

JPA 시작

ewok 2023. 4. 10. 16:18

H2 데이터 베이스 설치

Archive Downloads (h2database.com)

 

Archive Downloads

 

www.h2database.com

 

압축 푼 폴더에서 bin/h2.bat를 실행한다.

 

브라우저에서 아래와 같은 창이 뜬다.

정보는 위와 같아야 한다.

 

 

프로젝트 구조

프로젝트 생성

 

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>jpastudy</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- h2DataBase -->
        <!-- version은 pc에 설치한 h2데이터베이스와 맞춰줘야함!! -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>

        <!-- hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.15.Final</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

</project>

 

객체 매핑

h2에 테이블 생성

create table MEMBER (
    ID VARCHAR(255) NOT NULL,
    NAME VARCHAR(255),
    AGE INTEGER,
    PRIMARY KEY (ID)
);

 

회원 클래스 생성

package jpabook.start;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity // 해당 클래스를 테이블과 매핑한다고 JPA에게 알려준다.
@Table(name = "MEMBER") // 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
public class Member {
    @Id // 엔티티 클래스의 필드를 테이블의 기본키에 매핑한다.
    @Column(name = "ID")    // 필드를 컬럼에 매핑한다.
    private String id;          //아이디
    @Column(name = "NAME")
    private String username;    //이름
    // 매핑 어노테이션이 없다면 필드명을 사용해서 컬럼명으로 매핑한다.
    private Integer age;        //나이

    //Getter, Setter
    public String getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

 

  • @Entity
    • 해당 클래스를 테이블과 매핑한다고 JPA에게 알려준다.
    • @Entity가 사용된 클래스를 엔티티 클래스라고 한다.
  • @Table
    • 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
    • 생략하면 클래스 이름을 테이블 이름으로 매핑한다.
  • @Id
    • 엔티티 클래스의 필드를 테이블의 기본키에 매핑한다.
    • @Id가 사용된 필드를 식별자 필드라 한다.
  • @Column
    • 필드를 컬럼에 매핑한다.
  • 매핑 정보가 없는 필드
    • 여기서는 age가 해당된다.
    • 매핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑한다.

 

persistence.xml 설정

설정 파일이 META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식할 수 있다.

 

<?xml version="1.0" encoding="utf-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="jpastudy">
        <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.id.new_generator_mappings" value="true"/>

        </properties>
    </persistence-unit>
</persistence>

필수 속성의 마지막은 데이터베이스의 방언을 설정하는 것이다.

 

옵션

  • hibernate.show_sql : 하이버네이트가 실행한 SQL을 출력한다.
  • hibernate.format_sql : 하이버네이트가 실행한 SQL을 출력할 때 보기 쉽게 정렬한다.
  • hibernate.user_sql_comments : 쿼리를 출력할 때 주석도 함께 출력한다.
  • hibernate.id.new_generator_mapping : JPA 표준에 맞춘 새로운 키 생성 전략을 사용한다.

 

애플리케이션 개발

package jpabook.start;

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("jpastudy");

        // 엔티티 매니저 생성
        EntityManager em = emf.createEntityManager();

        // 트랜잭션 획득
        EntityTransaction tx = em.getTransaction(); // 트랜잭션 API
        try {
            tx.begin();     // 트랜잭션 시작
            logic(em);      // 비즈니스 로직 실행
            tx.commit();    // 트랜잭션 커밋
        } catch (Exception e) {
            tx.rollback();  // 트랜잭션 롤백
        } finally {
            em.close();     // 엔티티 매니저 종료
        }
        emf.close();;       // 엔티티 매니저 팩토리 종료
    }

    // 비즈니스 로직
    private static void logic(EntityManager em) {

        String id = "id1";
        Member member = new Member();
        member.setId(id);
        member.setUsername("지한");
        member.setAge(2);

        // 등록
        em.persist(member);

        // 수정
        member.setAge(20);

        // 한 건 조회
        Member findMember = em.find(Member.class, id);
        System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());

        // 목록 조회
        List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
        System.out.println("member.size=" + members.size());

        // 삭제
        em.remove(member);
    }
}

 

엔티티 매니저 팩토리 생성

JPA를 시작하려면 persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야 한다.

 

엔티티 매니저 생성

JPA의 기능 대부분은 엔티티 매니저가 제공한다. 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.

엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용하면  안 된다.

실행결과