간단한 개발관련 내용

JPA(Java Persistence API)의 개요 본문

Framework/JPA

JPA(Java Persistence API)의 개요

vincenzo.dev.82 2024. 9. 28. 22:48
반응형

JPA(Java Persistence API)의 개요

JPA(Java Persistence API)는 자바 애플리케이션에서 객체와 관계형 데이터베이스 간의 매핑을 처리하기 위한 표준 ORM(Object-Relational Mapping) 프레임워크입니다. JPA는 자바 객체데이터베이스 테이블 간의 매핑을 정의하여, SQL을 직접 작성하지 않고도 데이터베이스와 상호작용할 수 있게 해줍니다. EJB 3.0의 일부로 도입되었으며, 현재는 자바 표준 ORM 기술로 자리 잡았습니다.

JPA는 인터페이스로만 구성되어 있으며, 실제 구현은 Hibernate, EclipseLink, DataNucleus와 같은 JPA 구현체에 의해 이루어집니다. 즉, JPA는 데이터베이스와 상호작용하는 표준 인터페이스를 정의할 뿐이고, 그 표준을 기반으로 실제 동작은 구현체가 담당합니다.

JPA의 주요 특징

  1. 객체와 관계형 데이터베이스 간의 매핑(ORM)예를 들어, 아래와 같은 자바 클래스를 정의하면, JPA는 이를 데이터베이스의 테이블과 매핑하여 SQL 쿼리 없이도 데이터를 조작할 수 있습니다.
  2. @Entity
    public class User {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     private String name;
     private String email; 
     // getters and setters
    }
  3. JPA는 자바 클래스와 데이터베이스 테이블 간의 매핑을 설정하여, 애플리케이션에서 객체지향적인 코드로 데이터베이스와 상호작용할 수 있도록 지원합니다. ORM을 통해 SQL 쿼리 작성 없이 자바 객체를 이용해 데이터베이스 작업이 가능하며, 이를 통해 코드의 가독성유지보수성을 향상시킵니다.
  4. POJO(Plain Old Java Object) 기반
  5. JPA는 POJO 클래스(필드와 메서드만 있는 단순한 자바 객체)를 기반으로 ORM을 제공합니다. 이를 통해 자바 엔티티 클래스는 특수한 API나 라이브러리에 종속되지 않고, 일반적인 자바 객체처럼 사용할 수 있습니다. 이로 인해 코드가 간결해지고 유지보수가 쉬워집니다.
  6. 영속성 컨텍스트(Persistence Context) 관리
    • 변경 감지(Dirty Checking): 트랜잭션 내에서 엔티티 객체의 값이 변경되면, 트랜잭션이 끝날 때 변경 사항을 자동으로 데이터베이스에 반영합니다.
    • 1차 캐시: 동일한 엔티티를 여러 번 조회할 때, 영속성 컨텍스트에서 캐싱된 값을 반환하여 불필요한 데이터베이스 접근을 줄입니다.
  7. JPA는 영속성 컨텍스트(Persistence Context)를 통해 엔티티 객체의 상태를 관리합니다. 영속성 컨텍스트는 특정 트랜잭션 동안 엔티티의 상태를 관리하고, 엔티티의 변경 사항을 자동으로 감지하여 데이터베이스에 반영합니다. 이를 통해 변경 감지(Dirty Checking), 1차 캐시 등 다양한 기능을 제공할 수 있습니다.
  8. 트랜잭션 관리
  9. JPA는 트랜잭션을 통해 데이터의 일관성을 보장합니다. 데이터베이스와 상호작용할 때는 항상 트랜잭션 단위로 작업을 수행하며, 트랜잭션이 종료되기 전까지는 데이터가 데이터베이스에 반영되지 않습니다. 트랜잭션이 완료되면 데이터가 커밋되고, 실패하면 롤백하여 데이터의 일관성을 유지합니다.
  10. JPQL(Java Persistence Query Language)예를 들어, 아래는 User 엔티티에 대한 JPQL 쿼리입니다:
  11. String jpql = "SELECT u FROM User u WHERE u.name = :name"; List<User> users = entityManager.createQuery(jpql, User.class) .setParameter("name", "John") .getResultList();
  12. JPA는 데이터베이스에 독립적인 JPQL이라는 쿼리 언어를 제공합니다. JPQL은 SQL과 유사하지만, 데이터베이스 테이블이 아닌 자바 엔티티 객체를 대상으로 쿼리를 작성합니다. 이를 통해 데이터베이스에 종속적이지 않은 코드를 작성할 수 있으며, 다양한 데이터베이스를 쉽게 교체할 수 있습니다.
  13. 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)
    • 지연 로딩(Lazy Loading): 연관된 엔티티가 실제로 사용될 때까지 데이터베이스에서 로드하지 않습니다. 성능 최적화를 위해 많이 사용됩니다.
    • 즉시 로딩(Eager Loading): 엔티티를 조회할 때 연관된 모든 엔티티를 즉시 로드합니다.
  14. JPA는 엔티티 간의 연관 관계를 설정할 때, 연관된 엔티티를 언제 로딩할지 선택할 수 있는 기능을 제공합니다. 지연 로딩은 해당 엔티티를 실제로 필요할 때 로딩하는 방식이고, 즉시 로딩은 엔티티 조회 시점에 연관된 엔티티도 함께 로딩하는 방식입니다.
  15. 다양한 연관 관계 매핑 지원
    • @OneToOne: 1:1 관계 매핑
    • @OneToMany: 1:N 관계 매핑
    • @ManyToOne: N:1 관계 매핑
    • @ManyToMany: N:N 관계 매핑
    예를 들어, UserOrder 간의 관계에서 하나의 사용자가 여러 개의 주문을 할 수 있는 1:N 관계를 매핑하는 방식입니다.
  16. @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "user") private List<Order> orders; } @Entity public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "user_id") private User user; }
  17. JPA는 객체 간의 다양한 연관 관계를 데이터베이스 테이블에 매핑할 수 있도록 지원합니다. 이는 1:1, 1:N, N:1, N:N과 같은 관계를 객체 간에서도 자연스럽게 처리할 수 있도록 합니다.
  18. 2차 캐시(Second-Level Cache) 지원
  19. JPA는 2차 캐시를 통해 데이터베이스 접근을 줄이고 성능을 최적화할 수 있습니다. 1차 캐시는 영속성 컨텍스트 내에서만 유효하지만, 2차 캐시는 영속성 컨텍스트가 다르더라도 동일한 엔티티를 캐싱하여 성능을 향상시킬 수 있습니다. 2차 캐시는 Ehcache, Infinispan, Hazelcast와 같은 외부 캐시 라이브러리와 연동해 사용할 수 있습니다.

JPA의 주요 특징 요약

  1. 객체와 관계형 데이터베이스 간의 매핑을 통해 SQL을 직접 작성하지 않고도 데이터베이스 작업 가능
  2. POJO 기반으로 객체지향적 개발 방식 지원
  3. 영속성 컨텍스트를 통한 엔티티의 상태 관리와 변경 감지(Dirty Checking), 1차 캐시 제공
  4. 트랜잭션 관리를 통해 데이터의 일관성 보장
  5. JPQL을 통해 데이터베이스에 독립적인 쿼리 작성 가능
  6. 지연 로딩즉시 로딩을 통해 성능 최적화
  7. 다양한 연관 관계 매핑(1:1, 1:N, N:1, N:N) 지원
  8. 2차 캐시를 통한 성능 최적화 가능

결론

JPA는 객체와 관계형 데이터베이스 간의 매핑을 통해 SQL을 직접 작성하지 않고도 데이터베이스 작업을 할 수 있도록 지원하는 표준 ORM 기술입니다. JPA는 객체지향적 개발 방식을 유지하면서도 데이터베이스와의 상호작용을 간편하게 처리할 수 있도록 해줍니다. 이를 통해 생산성유지보수성을 높이고, 성능 최적화를 위한 다양한 기능을 제공합니다.

반응형