Technical NOTE

JPA(Java Persistence API) 의 버전별 특정 본문

카테고리 없음

JPA(Java Persistence API) 의 버전별 특정

테크니컬노트 2024. 9. 24. 14:31
반응형

JPA(Java Persistence API)의 버전별 특징은, 각 버전이 출시되면서 새로운 기능이 추가되고 성능이 향상되는 과정을 반영합니다. JPA는 처음 EJB 3.0의 일부로 시작되어 점차 독립적인 표준으로 발전해왔습니다. 각 버전의 주요 특징과 발전 사항을 아래에 정리했습니다.


1. JPA 1.0 (2006년)

  • 출시 배경: JPA 1.0은 EJB 3.0의 일부로서 처음 등장했습니다. EJB 2.x의 복잡성을 줄이고, 객체와 관계형 데이터베이스 간의 매핑을 더 쉽게 하기 위해 ORM(Object-Relational Mapping) 표준으로 정의되었습니다.
  • 주요 특징:
    • 기본 엔터티 매핑: @Entity, @Table, @Id 등을 사용한 기본적인 객체와 데이터베이스 테이블 간의 매핑.
    • 영속성 컨텍스트: EntityManager를 통해 영속성 컨텍스트와 상호작용하며 엔터티 객체를 관리.
    • JPQL (Java Persistence Query Language): 객체를 기반으로 하는 질의 언어를 도입. 이는 SQL과 유사하지만 객체를 대상으로 질의를 수행함.
    • 기본 CRUD 연산 지원: 엔터티를 영속화(persist), 조회(find), 삭제(remove), 수정(merge)할 수 있는 기능 제공.
  • 한계점:
    • 기본적인 ORM 기능은 제공했지만, 기능의 범위나 성숙도는 제한적이었음.
    • 복잡한 쿼리 처리와 성능 최적화 기능은 부족.

2. JPA 2.0 (2009년)

  • 출시 배경: JPA 2.0은 Java EE 6의 일부로 발표되었으며, JPA 1.0의 한계를 극복하기 위해 여러 새로운 기능과 성능 개선을 도입했습니다.
  • 주요 특징:
    • Criteria API: JPQL을 대신해 타입 안전한 쿼리를 동적으로 생성할 수 있는 API를 제공. 쿼리를 코드로 작성하여 더 유연하고 유지보수 가능한 방식으로 쿼리 작성 가능.
      CriteriaBuilder cb = em.getCriteriaBuilder();
      CriteriaQuery<User> cq = cb.createQuery(User.class);
      Root<User> user = cq.from(User.class);
      cq.select(user).where(cb.equal(user.get("username"), "john"));
      List<User> results = em.createQuery(cq).getResultList();
    • 2차 캐시 지원: 2차 캐시(Second-Level Cache)를 지원하여 엔터티를 메모리에 캐싱하고 데이터베이스 접근을 최소화할 수 있는 기능 추가.
    • 매핑 기능 개선:
      • 맵(Map) 컬렉션 매핑: 컬렉션 매핑에 있어 맵 타입을 지원.
      • Embeddable 타입: 중첩된 클래스를 데이터베이스 테이블과 매핑할 수 있도록 지원.
      • OneToOne, OneToMany 관계의 Cascade 옵션 강화: 관계 설정 시 데이터의 전파 방식을 더 세밀하게 제어 가능.
    • Locking 메커니즘: Optimistic Locking과 Pessimistic Locking을 지원하여 동시성 문제를 해결하는 데 도움이 됨.
    • Bean Validation 통합: JPA와 Bean Validation(JSR 303)이 통합되어 엔터티 필드에 대해 유효성 검증을 할 수 있게 됨.
  • 한계점:
    • Criteria API는 타입 안전성과 동적 쿼리 작성을 가능하게 했지만, 코드 가독성이 떨어지는 문제가 발생.

3. JPA 2.1 (2013년)

  • 출시 배경: Java EE 7의 일부로 발표되었으며, 개발자들의 피드백을 반영하여 기존 기능의 개선과 함께 새로운 기능들이 추가되었습니다.
  • 주요 특징:
    • Stored Procedure 지원: JPA에서 데이터베이스의 저장 프로시저(Stored Procedure)를 호출할 수 있는 기능이 추가됨.
      StoredProcedureQuery query = em.createStoredProcedureQuery("procedure_name");
      query.registerStoredProcedureParameter("param1", Integer.class, ParameterMode.IN);
      query.setParameter("param1", 100);
      query.execute();
    • Entity Graph API: @NamedEntityGraph를 사용해 엔터티의 페치 전략을 사전에 정의하고 사용할 수 있는 기능 제공. 이는 Lazy/Eager Loading을 보다 유연하게 제어할 수 있도록 도와줌.
      EntityGraph<User> graph = em.createEntityGraph(User.class);
      graph.addAttributeNodes("orders");
      Map<String, Object> hints = new HashMap<>();
      hints.put("javax.persistence.fetchgraph", graph);
      User user = em.find(User.class, 1L, hints);
    • 속성 변환기(Attribute Converter): 엔터티의 속성을 데이터베이스와 변환할 때 커스텀 로직을 적용할 수 있는 기능 제공.
      @Converter
      public class BooleanToStringConverter implements AttributeConverter<Boolean, String> {
          public String convertToDatabaseColumn(Boolean value) {
              return value ? "Y" : "N";
          }
          public Boolean convertToEntityAttribute(String value) {
              return "Y".equals(value);
          }
      }
    • DML 지원: JPA가 기존의 JPQL 기반 쿼리 외에도 데이터 조작 언어(DML)를 직접 실행할 수 있는 기능 제공.
    • 더 많은 캐시 제어: 2차 캐시에 대한 더 세밀한 제어가 가능해졌으며, 캐시 관련 메서드들이 추가됨.
  • 한계점:
    • JPA 2.1은 성숙한 기능을 제공하지만, 일부 복잡한 데이터베이스 연산에 있어 여전히 네이티브 SQL을 사용해야 하는 상황이 존재.

4. JPA 2.2 (2017년)

  • 출시 배경: Java EE 8의 일부로 발표되었으며, 주로 사소한 기능 개선과 최신 Java 표준과의 호환성 향상에 중점을 두었습니다.
  • 주요 특징:
    • Java 8의 Date/Time API 지원: java.time.LocalDate, java.time.LocalDateTime, java.time.Instant와 같은 새로운 Java 8 날짜/시간 API 타입을 엔터티 필드에 사용할 수 있게 됨.
      @Entity
      public class Event {
          private LocalDateTime eventTime;
      }
    • Java 8의 Stream API 지원: JPA 쿼리 결과를 Stream으로 반환할 수 있도록 기능 제공.
      Stream<User> userStream = em.createQuery("SELECT u FROM User u", User.class).getResultStream();
      userStream.forEach(System.out::println);
    • Optional 지원: 엔터티 필드에 대해 Optional<T> 타입을 사용할 수 있게 되어, 필드가 null일 수 있는 상황을 안전하게 처리할 수 있게 됨.
    • Repeatable Annotations: Java 8의 반복 가능 어노테이션을 JPA에서도 사용할 수 있게 되어, 하나의 엔터티에 동일한 어노테이션을 여러 번 적용할 수 있게 됨.
  • 한계점:
    • JPA 2.2는 주로 Java 8의 새로운 기능과의 호환성을 강화했지만, 근본적인 기능 개선은 제한적이었음.

5. Jakarta Persistence (JPA 3.0) (2020년)

  • 출시 배경: JPA는 Java EE에서 Jakarta EE로 이관되었으며, 그 과정에서 javax.persistence에서 jakarta.persistence로 패키지가 변경되었습니다. Jakarta EE 9의 일부로 발표된 JPA 3.0은 패키지 네임스페이스의 변경 외에는 큰 변화가 없었습니다.
  • 주요 특징:
    • 패키지 네임 변경: javax.persistence.*에서 jakarta.persistence.*로 변경됨.
    • API 자체에 대한 기능적인 변화는 거의 없었으며, 기존 JPA 2.2의 기능을 유지하면서, 패키지 변경에 따른 호환성 이슈를 처리하는 것이 주요 목적이었습니다.

6. Jakarta Persistence 3.1 (예정)

  • 발전 방향: Jakarta EE 10에서 발표될 것으로 예상되는 Jakarta Persistence 3.1은 최신 Java 버전과의 호환성을 강화하고, 현대적인 개발 요구에 맞춘 추가 기능을 제공할 예정입니다. 주요 예상 기능은 성능 최적화, JSON 데이터 처리, 비관적 락킹의 개선 등이 있을 수 있습니다.

요약

JPA 버전 주요 특징
JPA 1.0 기본적인 ORM 매핑, JPQL, CRUD 연산 제공
JPA 2.0 Criteria API, 2차 캐시 지원, 관계 매핑 및 캐스케이딩 기능 강화
JPA 2.1 Stored Procedure 지원, Entity Graph API, 속성 변환기 추가
JPA 2.2 Java 8 날짜/시간 API 및 Stream 지원, Optional 지원
JPA 3.0 패키지 네임 변경(javax.persistence  jakarta.persistence)

 

각 버전은 JPA의 기능을 확장하고 최적화하여, 점점 더 강력하고 유연한 ORM 솔루션으로 발전해 왔습니다.

 

반응형