다가오는 다음을 향해

[JPA] JPA 구현하기(기초) 본문

JPA

[JPA] JPA 구현하기(기초)

hyeseo 2022. 12. 29. 15:05
JPA 구현하기(기초)

 

참고 : https://www.inflearn.com/course/ORM-JPA-Basic/unit/21685?category=questionDetail

※ 공부 정리 목적으로 작성된 글입니다.

 

📌 개발환경


MacBook Pro M1
IntelliJ IDEA (Ultimate Apple Silicon 2022-02)

Maven
java-1.8 
JPA - Hibernate 2.1.214 (설치방법: https://tira-0.tistory.com/236)

 

☘️  pom.xml 파일에 JPA 하이버네이트, h2 데이터베이스 관련 라이브러리 추가


- 하이버네이트 버전은 설치 버전과 동일해야 합니다.

<?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>jpa-basic</groupId>
    <artifactId>ex1-hello-jpa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.10.Final</version>
        </dependency>
        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.1.214</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

 

☘️  JPA 설정 - persistence.xml


- persistence.xml : JPA 설정 파일 입니다.

- 파일경로 : /META-INF/persistence.xml

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa

#JPA가 생성하는 SQL을 출력
spring.jpa.show-sql=true

#JPA가 자동으로 테이블을 생성해주는 기능 (사용: create , 미사용: none)
Spring.jpa.hibernate.ddl-auto=none

 

☘️  JPA 엔티티 매핑


1. Member 테이블을 생성합니다.

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

 

2. Member 엔티티 클래스 생성 및 매핑합니다.

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

- @Entity : 객체와 테이블을 매핑합니다.

- @Id : 데이터베이스 기본키와 매핑합니다.

 

 

 

☘️  JPAMain 클래스


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) {

        // 엔티티매니저팩토리 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

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

        // 트랜잭션
        EntityTransaction tx = em.getTransaction();

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

        try {

            // 회원 수정 - JPA를 통해서 엔티티를 조회하면 JPA가 관리하며, 트랜잭션으로 commit을 할 때 값이 변경되었는지 체크한다. 변경사항이 있으면 update 후 commit한다.
            Member findMember = em.find(Member.class, 1L);
            System.out.println("findMember.getId() = " + findMember.getId());
            System.out.println("findMember.getName() = " + findMember.getName());

            findMember.setName("HelloJPA");

			// 트랜잭션 - 커밋
            tx.commit();
        } catch (Exception e) {
        	// 트랜잭션 - 롤백
            tx.rollback();
        } finally {
            em.close(); // 엔티티 매니저 종료
        }
        emf.close(); // 엔티티 매니저 팩토리 종료
    }
}

ㅁ EntityManagerFactory 

- persistence.xml의 설정정보를 사용해서 JPA를 동작시키기 위한 엔티티 매니저 팩토리를 생성합니다.

- 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 합니다.

 

 EntityManager

- 엔티티 매니저 팩도리에서 엔티티 매니저를 생성합니다.

- 엔티티 매니저 내부에 데이터 소스를 유지하면서 데이터 베이스와 통신합니다.

- 데이터베이스 커넥션과 밀접한 관계가 있기 때문에 쓰레드간에 공유하거나 재사용하면 안됩니다.(동시성 문제 발생)

- 사용이 끝난 엔티티 매니저는 반드시 종료해야합니다.

 

 트랜잭션

- JPA는 항상 트랜잭션 안에서 데이터를 변경해야 합니다.(트랜잭션없이 데이터 변경 시 예외 발생)

 

'JPA' 카테고리의 다른 글

[JPA] 영속성 관리 - 내부 동작 방식  (0) 2022.12.29
[SpringBoot JPA] JPA 구현하기(기초)  (0) 2022.12.15