6. JPA

[JPA] JPA(Java Persistence API)란?

Dorothy. 2024. 9. 30. 06:38

안녕하세요, Dorothy입니다.

오늘은 JPA에 대해서 공부해보겠습니다.

오늘은 JPA 의 간단한 개념을 알아보고, 그 구성요소 및 예제를 다뤄볼게요.

JPA는 짧게 말하자면 JAVA에서 DB와 상호작용하는 표준화 API입니다.

공부해두면 데이터매핑과 관련하여 활용할 곳이 꽤 많겠죠?

일단 시작해보겠습니다. 집중해주세요~!!

 


 

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

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


 1. JPA (Java Persistence API) 

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

1) JPA의 주요 인터페이스

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

 

2) Hibernate

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

 

(1) Hibernate의 주요 기능

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



 2. 주요 개념 

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

 3. 구성 요소 

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

 

 4. 예제 

 

1) 엔티티 클래스

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

 

2) 영속성 유닛 설정

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>

 

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

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는 데이터베이스와 상호작용하는 복잡한 과정을 추상화하여 자바 개발자가 더 쉽게 데이터를 다룰 수 있게 합니다.

 

 


이상입니다!!