JPA와 ORM

2024. 5. 30. 03:03Back-End

Java Persistence API (JPA)는 자바 플랫폼에서 객체 관계 매핑(ORM) 기술을 위한 표준이다.

ORM(Object-Relational Mapping)은 객체 지향 프로그래밍 언어의 객체를 관계형 데이터베이스의 테이블과 매핑하는 기술이다.

이 글에서는 JPA의 핵심 요소인 EntityManagerFactory, EntityManager, persist 등에 대해 상세히 알아보고, JPA 구현체 중 하나인 Hibernate에 대해서도 설명할 것이다.

 

ORM과 Hibernate

ORM (Object-Relational Mapping)

ORM은 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블 사이의 변환을 자동화하는 기술이다. ORM을 사용하면 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있다. ORM의 주요 장점은 다음과 같다:

  • 생산성 향상: 데이터베이스와의 상호작용을 추상화하여 개발 생산성을 높일 수 있다.
  • 유지보수 용이: 코드가 간결해지고, 데이터베이스 스키마 변화에 유연하게 대응할 수 있다.
  • 객체 지향적 프로그래밍: 객체 지향 패러다임에 맞는 코드를 작성할 수 있다.

Hibernate

Hibernate는 JPA의 가장 널리 사용되는 구현체 중 하나로, 강력하고 유연한 ORM 프레임워크이다. Hibernate는 JPA 표준을 구현하며, 추가적인 기능을 제공한다. Hibernate를 사용하면 JPA의 장점을 활용하면서도 다양한 확장 기능을 사용할 수 있다.

 

JPA의 주요 요소

EntityManagerFactory와 EntityManager

JPA에서 데이터베이스와의 상호작용을 관리하는 주요 인터페이스는 EntityManagerFactory와 EntityManager이다.

  • EntityManagerFactory: JPA 애플리케이션에서 데이터베이스와의 연결을 관리하는 팩토리 클래스이다. EntityManagerFactory는 애플리케이션 전체에서 하나만 생성되며, 여러 EntityManager 인스턴스를 생성하는 데 사용된다.
  • EntityManager: 실제 데이터베이스 작업을 수행하는 인터페이스이다. 데이터베이스 CRUD(Create, Read, Update, Delete) 작업을 관리하며, 엔티티의 생명주기를 관리한다.

EntityManager와 EntityManagerFactory 예제

다음은 EntityManagerFactory와 EntityManager를 사용하는 예제이다.

 

JPADemo.java

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

public class JPADemo {
    public static void main(String[] args) {
        // EntityManagerFactory 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");

        // EntityManager 생성
        EntityManager em = emf.createEntityManager();

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

        // 새로운 엔티티 생성 및 저장
        Person person = new Person();
        person.setName("John Doe");
        em.persist(person);

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

        // EntityManager 종료
        em.close();

        // EntityManagerFactory 종료
        emf.close();
    }
}

 

Person.java

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

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Getters and setters
    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;
    }
}

 

설명

  • Persistence.createEntityManagerFactory("my-persistence-unit"): persistence.xml 파일에서 정의한 my-persistence-unit 이름의 영속성 유닛을 기반으로 EntityManagerFactory를 생성하는 코드이다.
  • emf.createEntityManager(): EntityManagerFactory를 사용하여 EntityManager를 생성하는 코드이다.
  • em.getTransaction().begin(): 트랜잭션을 시작하는 코드이다.
  • em.persist(person): 새로운 엔티티를 데이터베이스에 저장하는 코드이다.
  • em.getTransaction().commit(): 트랜잭션을 커밋하여 변경사항을 데이터베이스에 반영하는 코드이다.
  • em.close(): EntityManager를 닫는 코드이다.
  • emf.close(): EntityManagerFactory를 닫는 코드이다.

JPA의 주요 메서드

persist

persist 메서드는 새로운 엔티티를 영속성 컨텍스트에 저장한다. 엔티티가 영속성 컨텍스트에 저장되면, 트랜잭션이 커밋될 때 데이터베이스에 반영된다.

 

find

find 메서드는 데이터베이스에서 엔티티를 조회한다.

Person foundPerson = em.find(Person.class, personId);

 

remove

remove 메서드는 영속성 컨텍스트에서 엔티티를 삭제한다.

em.remove(person);

 

merge

merge 메서드는 분리된(Detached) 엔티티를 영속성 컨텍스트에 병합한다.

Person mergedPerson = em.merge(detachedPerson);

 

결론

JPA와 Hibernate는 자바 애플리케이션에서 데이터베이스와의 상호작용을 단순화하고, 생산성을 향상시키는 강력한 도구이다. EntityManagerFactory와 EntityManager는 JPA의 핵심 요소로, 데이터베이스 연결을 관리하고 CRUD 작업을 수행한다.

persist, find, remove, merge와 같은 주요 메서드를 사용하여 엔티티의 생명주기를 관리할 수 있다.

Hibernate JPA 표준 구현체로, 추가적인 기능과 유연성을 제공하여 더욱 강력한 데이터베이스 관리를 가능하게 한다.