1. JPA 3.0 개요
JPA 3.0은 Jakarta EE 9 및 10과 함께 출시되면서, 기존 Java EE 기반에서 Jakarta EE 네임스페이스로 변경되었습니다. 또한, 불필요한 기능을 제거하고, 더 많은 ORM 관련 기능을 강화하여 JPA를 더욱 효율적으로 사용할 수 있도록 개선되었습니다.
2. 주요 변경 사항 및 새로운 기능
(1) 패키지 변경 (javax.persistence → jakarta.persistence )
기존 Java EE 기반이었던 javax.persistence 패키지가 jakarta.persistence로 변경되었습니다.
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
기존 코드 (javax.persistence)는 JPA 3.0에서 더 이상 지원되지 않으므로, 최신 버전으로 마이그레이션할 경우 변경이 필요합니다.
(2) Criteria API 개선 – setParameter의 동적 타입 지원
기존 JPA의 Criteria API에서는 setParameter()에 명확한 타입을 지정해야 했으나, JPA 3.0에서는 동적 타입을 지원하여 더욱 유연한 코드 작성이 가능해졌습니다.
기존 코드 (JPA 2.x)
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
Root<Member> root = query.from(Member.class);
query.select(root).where(cb.equal(root.get("name"), cb.parameter(String.class, "nameParam")));
TypedQuery<Member> typedQuery = entityManager.createQuery(query);
typedQuery.setParameter("nameParam", "John");
변경된 코드 (JPA 3.0)
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
Root<Member> root = query.from(Member.class);
query.select(root).where(cb.equal(root.get("name"), cb.parameter(String.class, "nameParam")));
TypedQuery<Member> typedQuery = entityManager.createQuery(query);
typedQuery.setParameter("nameParam", "John", String.class); // 동적 타입 지원
이제 setParameter에서 동적 타입을 명확하게 설정할 수 있습니다.
(3) JPQL에서 RETURNING 키워드 지원
JPA 3.0에서는 일부 데이터베이스(예: PostgreSQL)에서 지원하는 RETURNING 키워드를 활용하여 INSERT, UPDATE, DELETE 후 값을 반환하는 기능이 추가되었습니다.
예제: RETURNING 사용
Query query = entityManager.createQuery("UPDATE Member m SET m.status = 'INACTIVE' WHERE m.age > 30 RETURNING m.id");
List<Long> updatedIds = query.getResultList();
이제 특정 조건으로 업데이트된 엔티티의 ID를 바로 조회할 수 있습니다.
(4) Entity Graph의 향상된 지원
JPA 3.0에서는 EntityGraph를 더 강력하게 활용할 수 있도록 개선되었습니다.
예제: Named Entity Graph 적용
@Entity
@NamedEntityGraph(name = "Member.withTeam", attributeNodes = @NamedAttributeNode("team"))
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private Team team;
}
EntityGraph<?> entityGraph = entityManager.getEntityGraph("Member.withTeam");
Map<String, Object> hints = new HashMap<>();
hints.put("jakarta.persistence.loadgraph", entityGraph);
Member member = entityManager.find(Member.class, 1L, hints);
이제 Entity Graph를 활용하면 복잡한 쿼리를 줄이면서도 연관된 엔티티를 효율적으로 로딩할 수 있습니다.
(5) @Converter를 활용한 더 나은 데이터 변환
JPA 3.0에서는 @Converter를 활용하여 더 많은 유형의 변환을 지원합니다.
예제: Boolean → String 변환
@Converter(autoApply = true)
public class BooleanToStringConverter implements AttributeConverter<Boolean, String> {
@Override
public String convertToDatabaseColumn(Boolean attribute) {
return (attribute != null && attribute) ? "Y" : "N";
}
@Override
public Boolean convertToEntityAttribute(String dbData) {
return "Y".equals(dbData);
}
}
이제 Boolean 값을 "Y" 또는 "N"으로 변환하여 저장할 수 있습니다.
3. JPA 3.0으로 마이그레이션 시 고려할 점
- javax.persistence → jakarta.persistence 네임스페이스 변경 필요
- 기존 JPQL 및 Criteria API를 사용할 경우 동적 타입 지원을 활용 가능
- RETURNING 키워드, Entity Graph, @Converter 등의 새로운 기능을 활용하여 성능 최적화 가능
4. 결론
JPA 3.0은 기존 JPA 2.x의 기능을 개선하면서도 더 강력한 ORM 기능을 제공하는 버전입니다. 특히 Jakarta EE 네임스페이스 변경과 함께, Criteria API 개선, RETURNING 키워드 지원, Entity Graph 향상 등이 포함되어 더욱 효율적인 ORM 환경을 제공하고 있습니다.
JPA 3.0으로 마이그레이션할 경우 주요 변경 사항을 숙지하고, 새로운 기능을 활용하여 성능 최적화를 고려하는 것이 중요합니다.
'Back-End > JPA' 카테고리의 다른 글
JPA 엔티티 설계 시 VO(Value Object) 패턴 적용하기 (0) | 2025.03.09 |
---|---|
JPA와 NoSQL: MongoDB와 함께 사용 (0) | 2025.03.09 |
JPA에서 지연 로딩과 즉시 로딩의 차이 및 활용법 (0) | 2025.03.09 |
JPA 트랜잭션 관리와 @Transactional의 동작 방식 (0) | 2025.03.09 |
JPA랑 Hibernate (0) | 2025.03.09 |