JPA 기초 개념과 코드 예제 (Spring JPA 아님!!)

2024. 5. 28. 09:46Back-End/Spring

JPA(Java Persistence API)는 자바에서 관계형 데이터베이스를 다루기 위한 표준 API이다. JPA를 사용하면 객체 지향적인 방식으로 데이터베이스 작업을 처리할 수 있다. JPA의 주요 개념과 이를 활용한 코드 예제를 작성하겠다.

엔티티(Entity)

엔티티(Entity)는 데이터베이스 테이블과 매핑되는 클래스이다. JPA를 사용하면 데이터베이스의 테이블을 객체 지향적으로 표현할 수 있다. 엔티티 클래스는 @Entity 어노테이션을 사용하여 정의하며, 각 필드는 데이터베이스 테이블의 컬럼에 매핑된다.

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "jpa_user")
@NoArgsConstructor
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

위 코드에서 User 클래스는 jpa_user 테이블과 매핑되며, id, name, email 필드는 각각 테이블의 컬럼에 매핑된다. @GeneratedValue 어노테이션은 id 필드가 자동으로 생성되는 값임을 나타낸다.

엔티티매니저팩토리(EntityManagerFactory)

엔티티매니저팩토리(EntityManagerFactory)는 JPA에서 엔티티매니저(EntityManager)를 생성하는 역할을 한다. 애플리케이션 전체에서 하나만 생성되어야 하며, 생성 비용이 크기 때문에 보통 애플리케이션이 시작될 때 한 번만 생성하고 공유한다.

import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;

public class JpaExample {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("UserPU");
        // 엔티티매니저팩토리 생성
    }
}
 

엔티티매니저(EntityManager)

엔티티매니저(EntityManager)는 엔티티를 관리하는 주요 객체이다. 엔티티의 생명주기를 관리하며, 데이터베이스 작업을 처리한다. 엔티티매니저를 통해 데이터베이스 트랜잭션을 시작, 커밋, 롤백할 수 있다. 엔티티매니저는 엔티티매니저팩토리에서 생성된다.

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;

public class JpaExample {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("UserPU");
        EntityManager em = emf.createEntityManager(); // 엔티티매니저 생성

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

        User user = new User("John Doe", "john@example.com");
        em.persist(user); // 엔티티 저장

        em.getTransaction().commit(); // 트랜잭션 커밋

        em.close(); // 엔티티매니저 종료
        emf.close(); // 엔티티매니저팩토리 종료
    }
}

영속성 컨텍스트(Persistence Context)

영속성 컨텍스트(Persistence Context)는 엔티티를 영구 저장소에 저장하는 환경을 의미한다. 엔티티매니저는 영속성 컨텍스트를 통해 엔티티를 관리한다. 영속성 컨텍스트는 엔티티의 상태를 관리하며, 동일한 영속성 컨텍스트 내에서는 동일한 엔티티가 공유된다. 이를 통해 1차 캐시 기능을 제공하여 성능을 최적화한다.

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;

public class JpaExample {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("UserPU");
        EntityManager em = emf.createEntityManager(); // 엔티티매니저 생성

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

        User user = new User("John Doe", "john@example.com");
        em.persist(user); // 엔티티 저장 (영속 상태)

        User foundUser = em.find(User.class, user.getId()); // 영속성 컨텍스트에서 조회
        System.out.println(foundUser.getName()); // "John Doe"

        em.getTransaction().commit(); // 트랜잭션 커밋

        em.close(); // 엔티티매니저 종료
        emf.close(); // 엔티티매니저팩토리 종료
    }
}
 

META-INF

META-INF는 JAR 파일의 메타데이터를 저장하는 디렉토리이다. JPA 설정 파일인 persistence.xml은 이 디렉토리에 위치해야 한다. persistence.xml 파일은 영속성 유닛을 정의하고, 데이터베이스 연결 설정, JPA 구현체, 엔티티 클래스를 설정한다.

META-INF/
    persistence.xml

persistence.xml

persistence.xml은 JPA 설정 파일로, 영속성 유닛(Persistence Unit)을 정의한다. 이 파일은 META-INF 디렉토리에 위치하며, 데이터베이스 연결 정보와 JPA 구현체를 설정한다.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">

    <persistence-unit name="UserPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>com.example.jpa.User</class>  <!-- Add this line -->
        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3307/exam"/>
            <property name="jakarta.persistence.jdbc.user" value="jeon"/>
            <property name="jakarta.persistence.jdbc.password" value="1234"/>

            <!--create, update, create-drop, validate, none 중에 하나를 지정할 수 있음-->
            <property name="hibernate.hbm2ddl.auto" value="update"/>

            <!--사용할 데이터베이스 방언을 지정한다-->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

            <!--: SQL 명령어를 콘솔에 출력하고 포맷팅할지 여부를 설정한다-->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

 

 

하이버네이트(Hibernate)

하이버네이트(Hibernate)는 JPA의 구현체 중 하나로, ORM(Object-Relational Mapping) 프레임워크이다. JPA 표준을 구현하고 있으며, 데이터베이스와 객체 지향 프로그래밍 간의 불일치를 해결해준다. 하이버네이트를 사용하면 SQL 쿼리를 작성하지 않고도 데이터베이스 작업을 객체 지향적으로 수행할 수 있다.

 

JPA는 객체와 관계형 데이터베이스 간의 매핑을 간단하게 처리할 수 있도록 도와주는 강력한 프레임워크이다. 이를 통해 개발자는 객체 지향 프로그래밍 패러다임을 유지하면서도 데이터베이스 작업을 효율적으로 수행할 수 있다.