본문 바로가기
JPA Study

JPA(Java Persistence API)

by xogns93 2024. 8. 8.

JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와 상호작용하는 방식을 표준화한 API입니다. JPA를 사용하면 자바 객체를 데이터베이스의 테이블과 매핑하여, 객체 지향 프로그래밍 방식으로 데이터를 다룰 수 있습니다. 이를 통해 SQL 쿼리를 직접 작성하는 번거로움 없이, 자바 코드로 데이터베이스 작업을 수행할 수 있습니다.

90퍼가 인터페이스로이루어진 JPA


JPA (Java Persistence API)

JPA는 자바 객체와 관계형 데이터베이스 간의 매핑을 정의하는 표준 API입니다. JPA는 인터페이스로 이루어져 있으며, 구현체는 없습니다. 대신, JPA를 구현하는 여러 프레임워크가 있으며, 이 중 가장 널리 사용되는 것이 Hibernate입니다.

JPA의 주요 인터페이스

  1. EntityManager: 엔티티 객체의 생명주기를 관리하는 인터페이스입니다.
  2. EntityTransaction: 트랜잭션을 관리하는 인터페이스입니다.
  3. Query: 데이터베이스 쿼리를 표현하는 인터페이스입니다.

Hibernate

Hibernate는 JPA의 구현체 중 하나로, 자바 객체를 데이터베이스 테이블에 매핑하고 SQL 쿼리를 자동으로 생성해주는 ORM (Object-Relational Mapping) 프레임워크입니다. Hibernate는 JPA 인터페이스를 구현하면서 추가적인 기능을 제공합니다.

Hibernate의 주요 기능

  1. 자동 매핑: 자바 객체를 데이터베이스 테이블에 자동으로 매핑합니다.
  2. HQL (Hibernate Query Language): 객체 지향 쿼리 언어로, SQL과 유사하지만 객체를 대상으로 쿼리합니다.
  3. 캐싱: 1차 캐시와 2차 캐시를 지원하여 데이터베이스 접근 성능을 최적화합니다.



주요 개념

  1. 엔티티(Entity):
    • 데이터베이스 테이블에 매핑되는 자바 클래스입니다. 각 엔티티 인스턴스는 데이터베이스 테이블의 한 행(row)에 해당합니다.
  2. 영속성 컨텍스트(Persistence Context):
    • 엔티티 객체를 영속성 상태로 관리하는 환경입니다. 엔티티 매니저(Entity Manager)를 통해 영속성 컨텍스트에 접근할 수 있습니다.
  3. 엔티티 매니저(Entity Manager):
    • 영속성 컨텍스트를 관리하고, 엔티티 객체의 생명 주기를 관리합니다. 엔티티의 저장, 수정, 삭제, 조회 작업을 수행합니다.
  4. 쿼리 언어(Query Language):
    • JPQL(Java Persistence Query Language)은 객체 지향 쿼리 언어로, 엔티티 객체를 대상으로 쿼리를 작성할 수 있습니다.

구성 요소

  1. 엔티티 클래스(Entity Class):
    • @Entity 어노테이션을 사용하여 정의합니다. 이 클래스는 데이터베이스 테이블에 매핑되며, 필드는 테이블의 컬럼에 매핑됩니다.
  2. 영속성 유닛(Persistence Unit):
    • persistence.xml 파일에서 정의하며, 엔티티 매니저 팩토리(EntityManagerFactory)와 엔티티 매니저(EntityManager)를 생성하는 데 필요한 설정을 포함합니다.

예제

엔티티 클래스

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // 이 클래스가 데이터베이스 테이블에 매핑된다는 것을 나타냄
public class Person {
    @Id // 이 필드가 기본 키임을 나타냄
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 자동 생성
    private Long id;
    private String name;
    private int age;

    // 기본 생성자
    public Person() {}

    // 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getter와 setter 메서드
    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;
    }

    public int getAge() {
        return age;
    }

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

영속성 유닛 설정

persistence.xml

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
    <persistence-unit name="example-unit">
        <class>com.example.entity.Person</class>
        <properties>
            <!-- 데이터베이스 설정 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <!-- Hibernate 설정 -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

엔티티 매니저를 사용한 데이터베이스 작업

import com.example.entity.Person;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit");
        EntityManager em = emf.createEntityManager();

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

        // 새로운 Person 객체 생성 및 저장
        Person person = new Person("John Doe", 30);
        em.persist(person);

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

        // 모든 Person 객체 조회
        List<Person> persons = em.createQuery("SELECT p FROM Person p", Person.class).getResultList();
        for (Person p : persons) {
            System.out.println("ID: " + p.getId() + ", Name: " + p.getName() + ", Age: " + p.getAge());
        }

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

이 예제에서는 JPA를 사용하여 Person 엔티티를 데이터베이스에 저장하고 조회하는 과정을 보여주었습니다. JPA는 데이터베이스와 상호작용하는 복잡한 과정을 추상화하여 자바 개발자가 더 쉽게 데이터를 다룰 수 있게 합니다.