관리 메뉴

JAN's History

JPA기본기 다지기_JPA 기초와 매핑 본문

JPA

JPA기본기 다지기_JPA 기초와 매핑

JANNNNNN 2024. 3. 21. 11:20

객체 매핑하기

  • @Entity : JPA가 관리할 객체
  • @Id : DB PK와 매핑할 필드
@Entity
public class Member{

    @Id
    private Long id;
    private String name;
    ...
}
CREATE TABLE member (
    id bigint not null,
    name varchar(255),
    ...
    primary key (id)
);

persistence.xml

  • JPA 설정 파일
  • 경로 : /META-INF/persistence.xml
  • javax.persistence로 시작: JPA 표준 속성
  • hibernate로 시작 : Hibernate 전용 속성

dialect? 데이터베이스 방언!

  • JPA는 특정 DB에 종속적이지 않은 기술!
    • 하지만 DB 사정은 다르다! 벤더마다 조금씩 다름
      • MySQL - VARCHAR / Oracle - VARCHAR2
      • MySQL - LIMIT / Oracle - ROWNUM
  • hibernate.dialect
    • H2 (org.hibernate.dialect.H2Dialect)
    • Oracle 10g (org.hibernate.dialect.Oracle10gDialect)
    • MySQL (org.hibernate.dialect.MySQL5InnoDBDialect)
    • etc...

실습

2. H2 Database 실행 후 접속 확인

  1. H2 Console.exe를 찾은 후 실행
  2. 인터넷 브라우저 주소창에서 localhost의 8082 포트로 접속 (localhost:8082)
  3. member 테이블 생성
CREATE TABLE member (
    id bigint not null,
    name varchar(255),
    primary key (id)
);

member 테이블 생성

3. STS에 Maven 프로젝트 생성

4. Dependency 추가

pom.xml에 다음과 같이 dependency를 추가해준다.

    <dependencies>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.0.Final</version>
        </dependency>

        <!-- H2 Database -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
            <!-- <scope>test</scope> -->
        </dependency>

    </dependencies>

5. JPA 설정 파일 생성

resources/META-INF/persistence.xml 생성하기

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
    <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"/>


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

persistence.xml에 위에 내용 복사 + 붙여넣기

➡️ hibernate를 기본으로 JDBC를 사용한다는 뜻

6. Member class 생성

package hellojpa.entity;

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

@Entity // JPA의 객체이다!
public class Member {

    @Id // PK값이다!
    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;
    }
}

7. Main class 및 method 생성

package hellojpa;

import hellojpa.entity.Member;

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

public class Main {
    public static void main(String[] args) {
        // 1. EntityManagerFactory 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        // 2. EntityManagerFactory를 통해 EntityManager 생성
        EntityManager em = emf.createEntityManager();
        // 3. EntityManager를 통해 트랜잭션 획득
        EntityTransaction tx = em.getTransaction();

        // 4. 트랜잭션 시작
        tx.begin();

        // 5. 새로 삽입할 Member 객체 생성
        Member member = new Member();
        member.setId(100L);
        member.setName("안녕하세요");

        // 6.EntityManager를 통해 생성한 Member 객체 저장
        em.persist(member);

        // 7. 트랜잭션 커밋
        tx.commit();

        // 8. EntityManagerFactory 및 EntityManager 종료
        em.close();
        emf.close();
    }
}

실행

실행 후 확인!

9. 좀 더 보완해보자

트랜잭션을 처리하다가 중간에 에러가 날 수도 있다. 이런 경우 트랜잭션의 특징 중 하나인 원자성을 지키기 위해 롤백을 해준다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
		
		EntityManager em = emf.createEntityManager();
		EntityTransaction tx = em.getTransaction();
		tx.begin();

// 에러 났을 경우를 대비해 try-catch로 처리
try {
    // 5. 새로 삽입할 Member 객체 생성
    Member member = new Member();
    member.setId(100L);
    member.setName("안녕하세요");

    // 6.EntityManager를 통해 생성한 Member 객체 저장
    em.persist(member);

    // 7. 트랜잭션 커밋
    tx.commit();
} catch (Exception e) {
    // 8. 실패하면 롤백!
    tx.rollback();
} finally {
    // 잘 처리되든 말든
    // 9. EntityManagerFactory 및 EntityManager 종료
    em.close();
    emf.close();
}

주의

  • EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유
  • EntityManger는 쓰레드간 공유하면 안됨(사용하고 버리자)
  • JPA의 모든 데이터는 트랜잭션 안에서 실행

더 알아볼 것

  • 연관관계
  • 쓰레드