티스토리 뷰

이번에 5.0.0 버전이 release 되었는데 어떤 변경사항이 있었는지 살펴보겠습니다. 😀

먼저 가장 큰 변화는 자바 8버전 미만은 이제 지원하지 않는 것 인데요, 자바 7버전 이하를 사용하는 분들은 4.x.x 버전을 계속 사용해야 합니다.

그리고 joda-time과 google의 guava 런타임 dependency를 제외하였습니다.

이번 업데이트는 약 2년만에 이루어진 메이저 업데이트로 그동안 github에 남겨진 이슈 중 비중있는 것들 위주로 처리했다고 합니다.

큼지막 한 것들은 간단히 소개했으니 내부 기능 변화를 자세히 살펴보겠습니다.

새로운 기능들

  • Java 8 소스 레벨을 대상으로 성능과 코드 개선
  • Stream<T>를 반환하는 Fetchable#stream() 추가
    • try-with-resources를 사용하여 Stream을 항상 close 해주는 것을 권장하고 있습니다.
    • 단순히 forEachcollection으로 다 읽어버리는 것 만으로는 충분하지 않으니 꼭 다 쓴 자원을 반환하는 것을 권장합니다.
  • guava dependency 제거
    • guava를 따로 추가해서 사용하시다가 충돌이 발생했던 경험이 있다면 이제는 걱정하실 필요 없습니다.
  • joda-time dependency 제거
    • Java 8버전의 java.time 패키지에 이미 포함되어있어 제거하였습니다.
  • Document API를 통한 MongoDB 4 지원
  • ECJ를 컴파일러로 사용하여 com.querydsl.core.alias.Alias.* 패키지가 JRE에서 사용되도록 허용
  • Jetbrains 애너테이션을 위해 JSR305 교체
  • JPA 2.1Treated path expression을 생성하기위한 JPAExpression#treat 추가
  • JPA에서 지원하지 않는 쿼리 기능을 사용할 때 좀 더 자세한 에러 메시지 표시
  • querydsl-collections에서 NullsLast ordering 제공
  • querydsl-spatial에서 JTS/Geolatte 업그레이드
  • HibernateDomainExporterJPADomainExporter에서 공간 지원 사용 가능
  • 새로운 Jakarta EE 릴리즈에 대한 jakarta.* 패키지 지원
  • nullif 및 병합 메서드에서 형식화된 표현식을 반환
  • 코틀린 코드 제너레이터 지원
  • 자바 레코드 지원

버그 수정

  • JPASQLQuery에서 카운트 쿼리 생성
  • Alias.*의 동시성 문제를 수정(thread-safe)
  • in-memory 계산을 사용하여 having 절이 있는 쿼리에서 AbstractJPAQuery#fetchResultsAbstractJPAQuery#fetchCount 문제 해결
  • in-memory 계산을 사용하여 표현식 별로 여러 group by가 사용된 쿼리에서 AbstractJPAQuery#fetchResultsAbstractJPAQuery#fetchCount 문제 해결
  • InsertClauseJPA 구현 문제를 수정
  • TemplateFactory에서 메모리 누수를 수정
  • ExtendedBeanSerializertoString 메소드를 두 번 생성하는 것을 방지
  • HQL의 레거시 위치 매개변수 대신 JPA 색인 매개변수 사용
  • 잘못된 인수 바인딩 인덱스로 생성된 JPA 쿼리 수정
  • Hibernate 사용자 정의 유형의 잘못된 매개 변수 수정
  • JPQL 생성에서 상수를 재사용하면 Hibernate 쿼리 캐싱 문제 발생하던 버그 수정

주요 변경 사항

  • 최소 요구 사항: 자바 8버전
  • JavaSE6SQLExceptionWrapper와 자바 7 이전 버전 예외처리와 관련된 부분 삭제
  • 레거시 API의 이전 버전과의 호환성을 위해 있던 브리지 메서드를 제거
  • guava 의존성 제거
    • guava의 제거로 인해 ImmutableList를 매개변수로 받은 모든 메서드는 이제 대신 List 사용
    • 기존에 사용하던 com.google.common.base.Function 대신 java.util.function.Function으로 제공해야 함
  • javax.inject.Provider를 사용하던 생성자는 이제 java.util.function.Supplier를 대신 사용
    • 대부분의 경우 인수를 provider::get으로 바꿀 수 있음
  • 이번 releaseHibernate 5.2를 대상으로 하므로 Hibernate 4.xdialect를 사용해야 하는 경우 Hibernate5Templates 대신 HQLTemplates 사용
  • 다양한 deprecated 메서드 제거
  • MDC의 키를 구분할 때 점(.) 대신 언더스코어(_) 사용
    • querydsl.query -> querydsl_query
  • geolatte-geom 업그레이드로 인해 querydsl-spatialquerydsl-sql-spatial에서 PolyHedralSurface 제거
  • com.querydsl.apt.Extensioncom.querydsl.codegen으로 이동되었으며 이제 querydsl-codegen 모듈에 존재
  • com.querydsl.apt.SpatialSupportcom.querydsl.spatial.apt.SpatialSupport로 이동되었으며 이제 querydsl-spatial 모듈에 존재
  • com.querydsl.sql.codegen.SpatialSupportcom.querydsl.sql.spatial.SpatialSupport로 이동되었으며 이제 querydsl-sql-spatial 모듈에 존재
  • querydsl-sql-spatialSQLServerGeometryReaderorg.geolatte.geom.codec.db.sqlserver.*를 위해 제거
  • querydsl-sql-spatialPGgeometryConverterorg.geolatte.geom.codec.Wkt를 위해 제거
  • querydsl-sql-spatialJGeometryConverterorg.geolatte.geom.codec.db.oracle.*을 위해 제거
  • querysql-jpa-codegen에서 HibernateDomainExporter 제거
  • HibernateDomainExporterHibernate 4 버전만 지원하므로 JPADomainExporter 사용
  • ComparableExpression#coalesce(및 subtypes)는 더 이상 mutable Coalesce expression을 반환하지 않고 typed expression을 반환
    • Coalesce Builder가 필요한 경우 대신 new Coalesce<T>().add(expression)를 사용
  • OSGi 데이터는 더 이상 매니페스트에 포함되지 않음

사용 중단 (Deprecations)

  • AbstractJPAQuery#fetchResultsAbstractJPAQuery#fetchCount는 이제 여러 group by가 존재하는 쿼리에 대해 더 이상 사용되지 않음
    • 순수 JPA에서 지원할 수 없고 대신 메모리 내에서 계산되기 때문
    • totalCount가 필요하지 않은 경우 항상 AbstractJPAQuery#fetch를 대신 사용
    • 복잡한 쿼리 내에서도 페이징 사용을 원한다면 Blaze-Persistence QueryDSL integration 사용
  • getConstantToLabel 사용 중단

참조

댓글