JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와 상호작용하는 방식을 표준화한 API입니다. JPA를 사용하면 자바 객체를 데이터베이스의 테이블과 매핑하여, 객체 지향 프로그래밍 방식으로 데이터를 다룰 수 있습니다. 이를 통해 SQL 쿼리를 직접 작성하는 번거로움 없이, 자바 코드로 데이터베이스 작업을 수행할 수 있습니다.
90퍼가 인터페이스로이루어진 JPA
JPA (Java Persistence API)
JPA는 자바 객체와 관계형 데이터베이스 간의 매핑을 정의하는 표준 API입니다. JPA는 인터페이스로 이루어져 있으며, 구현체는 없습니다. 대신, JPA를 구현하는 여러 프레임워크가 있으며, 이 중 가장 널리 사용되는 것이 Hibernate입니다.
JPA의 주요 인터페이스
- EntityManager: 엔티티 객체의 생명주기를 관리하는 인터페이스입니다.
- EntityTransaction: 트랜잭션을 관리하는 인터페이스입니다.
- Query: 데이터베이스 쿼리를 표현하는 인터페이스입니다.
Hibernate
Hibernate는 JPA의 구현체 중 하나로, 자바 객체를 데이터베이스 테이블에 매핑하고 SQL 쿼리를 자동으로 생성해주는 ORM (Object-Relational Mapping) 프레임워크입니다. Hibernate는 JPA 인터페이스를 구현하면서 추가적인 기능을 제공합니다.
Hibernate의 주요 기능
- 자동 매핑: 자바 객체를 데이터베이스 테이블에 자동으로 매핑합니다.
- HQL (Hibernate Query Language): 객체 지향 쿼리 언어로, SQL과 유사하지만 객체를 대상으로 쿼리합니다.
- 캐싱: 1차 캐시와 2차 캐시를 지원하여 데이터베이스 접근 성능을 최적화합니다.
주요 개념
- 엔티티(Entity):
- 데이터베이스 테이블에 매핑되는 자바 클래스입니다. 각 엔티티 인스턴스는 데이터베이스 테이블의 한 행(row)에 해당합니다.
- 영속성 컨텍스트(Persistence Context):
- 엔티티 객체를 영속성 상태로 관리하는 환경입니다. 엔티티 매니저(Entity Manager)를 통해 영속성 컨텍스트에 접근할 수 있습니다.
- 엔티티 매니저(Entity Manager):
- 영속성 컨텍스트를 관리하고, 엔티티 객체의 생명 주기를 관리합니다. 엔티티의 저장, 수정, 삭제, 조회 작업을 수행합니다.
- 쿼리 언어(Query Language):
- JPQL(Java Persistence Query Language)은 객체 지향 쿼리 언어로, 엔티티 객체를 대상으로 쿼리를 작성할 수 있습니다.
구성 요소
- 엔티티 클래스(Entity Class):
- @Entity 어노테이션을 사용하여 정의합니다. 이 클래스는 데이터베이스 테이블에 매핑되며, 필드는 테이블의 컬럼에 매핑됩니다.
- 영속성 유닛(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는 데이터베이스와 상호작용하는 복잡한 과정을 추상화하여 자바 개발자가 더 쉽게 데이터를 다룰 수 있게 합니다.
'JPA' 카테고리의 다른 글
이너 조인(Inner Join)과 레프트 조인(Left Join) (0) | 2024.09.20 |
---|---|
JPA 자동생성전략 3가지방법 ( IDENTITY, SEQUENCE, TABLE ) (2) | 2024.09.11 |
JPA가 제공하는 주요 CRUD 기능 (0) | 2024.09.10 |
데이터베이스 영속화 (0) | 2024.09.10 |
JDBC와 JPA의 관계 (0) | 2024.09.09 |