JPA (Java Persistence API)

SEUNGJUN·2024년 1월 26일

JPA?

자바 어플리케이션과 관계형 데이터베이스 간의 데이터를 영구적으로 저장하고 관리하기 위한 자바 표준 인터페이스로, JPA는 ORM(Object-Relational-Mapping) 기술을 기반으로 객체 지향 프로그래밍과 관계형 데이터 베이스 간의 상호작용을 편하게 해준다.

JPA Keyword

1. ORM

ORM은 객체 지향 프로그래밍에서 사용되는 객체와 관계형 데이터베이스 간의 매핑을 의미 한다. 객체를 데이터베이스에 저장하거나 조회하는데 편리하게 해준다.

2. Entity

데이터베이스에서 영구적으로 저장되는 객체를 의미한다. 예시로 학생 정보를 담고 있는 자바 클래스가 학생 엔터티가 될수가 있다.

3. JPA 어노테이션

어노테이션을 사용하여 자바 객체를 데이터베이스 테이블에 매핑을 한다. @Entity, @Table, @Id 등의 어노테이션을 사용하여 클래스와 필드를 데이터베이스 스키마에 매핑할 수 있다.

4. EntityManager

JPA에서 데이터베이스와의 통신은 EntityManager를 통해서 이루어 진다. EntityManager는 영속성 컨텍스트를 관리하고, 언터티를 데이터베이스에 저장하거나 조회하는 등의 작업을 수행한다.

5. JPQL (Java Persistence Query Language)

JPA는 데이터베이스에 대한 쿼리를 작성하기 위한 JPQL을 제공한다. JPQL은 SQL과 유사하지만, 테이블이 아닌 엔터티와 필드에 대한 쿼리를 작성할수 있다.

JPA 생명주기(Entity Lifecycle)

JPA 엔터티의 생명주기는 객체가 생성되어서 영속성 컨텍스트에 저장되고, 데이터베이스에 저장되고, 마지막으로 삭제되는 과정.

코드 예제

import javax.persistence.*;

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

}

1. Transient (비영속)

// Transient 상태: 새로운 Student 객체 생성
Student transientStudent = new Student();
transientStudent.setName("John");

transientStudent 객체는 아직 영속성 컨텍스트에 저장되지 않았으므로 transient 상태에 있다고 할수 있다.

2. Managed (영속)

EntityManager entityManager = // EntityManager 얻기
entityManager.getTransaction().begin();

// Managed 상태: transientStudent를 영속화
entityManager.persist(transientStudent);

entityManager.getTransaction().commit();

transientStudent 객체는 entityManager.persist(transientStudent)를 통해 데이터베이스에 저장되어 있다. 이 객체는 관리 상태로, 영속성 컨텍스트와 연결 되어 있다.

3. Detached (중지)

entityManager.detach(transientStudent);

entityManager.detach(transientStudent)를 호출하여 transientStudent 객체를 영속성 컨텍스트에서 분리한다. 이후의 변경 사항은 자동으로 데이터 베이스와 동기화되지 않는다.

4. Removed (삭제)

entityManager.getTransaction().begin();

// Managed 상태: 데이터베이스에서 학생 삭제
entityManager.remove(transientStudent);

entityManager.getTransaction().commit();

transientStudent 객체는 관리 상태에서 entityManager.remove(transientStudent)를 통해 데이터베이스에서 삭제 되었고, 이후 객체는 removed 상태에 있다.

profile
RECORD DEVELOPER

0개의 댓글