본문 바로가기

개발

Hibernate 6.0 Final 릴리즈!!

https://in.relation.to/2022/03/31/orm-60-final/

 

Hibernate 6.0 Final - In Relation To

It has been years in the making, but ORM 6.0 Final has finally been released! This announcement will discuss the major changes, as well as give insight into why certain choices were made. We will also be following up with a series of more focused posts tar

in.relation.to

 

하이버네이트(Hibernate) 6.0 Final 이 릴리즈됐다. 이번 버전 들어서면서 많은게 바뀌었다.

 

APIs and SPIs

호환성과 관련된 얘기다. https://hibernate.org/community/compatibility-policy/  이 글을 참고하는 게 큰 도움이 될 것 같다.
하이버네이트 코드를 세 가지로 대강 나누면 "API" "SPI" "internal"로 나눌 수 있다.
API 는 Application 에 노출되는 인터페이스다. Version Upgrade 는 아무 문제가 없지만, Version Downgrade 는 보장하지 않는다. 예를 들어 4.0.0 -> 5.0.0 은 가능하지만 5.0.0 베이스로 개발한 Application 은 Hibernate 4.0.0 에서 동작하지 않을 수 있다.
SPI 는 Hibernate 를 third-party library 를 비롯한 약간은 외부솔루션? 과 통합하기 위한 인터페이스이다. minor version 만 호환된다. 예를 들면 4.0.0 과 4.0.1은 호환되지만 4.1.0은 호환되지 않을 수도 있다. 
Internal 은 Hibernate 내부적으로만 사용되는 코드다. 그래서 언제든 삭제될 수 있고 어떠한 호환도 보장하지 않는다.
 

Compatibility policy - Hibernate

Your application interacts with Hibernate libraries, and those in turn interact with third-party software: JDBC drivers, other libraries, or even REST APIs (Elasticsearch/OpenSearch). When any of these components changes its API, there is a risk that it be

hibernate.org

이러한 호환 같은걸 잘 보장하기 위해 SPI 가 수정되고 있고, 앞으로도 그럴 예정이다.

 

Jakarta Persistence

Java Persistence 가 Jakarta Persistence 로 변환된 지가 좀 됐다. 법률적으로 네임스페이스랑, type hint 이런 것도 전부 Java 에서 Jakarta 로 변환해야하는데 이게 여간 큰 일이 아니었다. 다행히 Transformer 가 있어서 쉽게 마이그레이션이 가능하다. 

 

Read-by-position

기존엔 하이버네이트가 JDBC 의 ResultSet에서 데이터를 읽어올 때 Read By Name 으로 읽어왔다. 이제는 Read by Position 방식으로 읽어온다. 우선 속도가 빨라진다. 그리고 이전엔 Name 기반으로 읽어왔기 때문에 다소 우스꽝스러운 Alias 가 많이 붙었는데 이제 조금 더 가독성이 높아진 SQL 을 만날 수 있다. 마지막으로 생성하는 SQL 문이 더 적어지기 때문에 네트워크 대역폭을 절약할 수 있다. 이게 6.0 버전에서 가장 큰 변화다.
 
 

Mapping Model

Read by Position 으로 변경되면서 Mapping Model 이 조금 더 개선됐다.
  • support positional processing of attributes
  • make it object-oriented
  • make it user friendly
(이 세 가지를 얘기하긴 하는데 정확히 뭐가 어떻게 개선됐는지는 잘 모르겠다. 예시라도 주던지!)
 
 

Semantic Query Model

HQL 은 SQM 으로 translation 되는데, 여기에 변화가 좀 있다. 
 
 

HQL

이전 버전은 HQL translation 에 Antlr2 를 썻는데, 굉장히 낡은 친구다. 이번에 Antlr4 로 바꿨다. 속도도 빨라지고 유지보수성도 좋아졌다.
 

Criteria

Criteria API 는 하이버네이트의 레거시였는데, 이번에 완벽히 제거됐다. 이전까지는 Deprecated 상태였다면 이번엔 정말로 작별하게 되었다. Criteria Query 는 Jakarta persistence API 를 통해서만 제공받을 수 있다. 

Criteria -> HQL -> translated HQL 로 바꾸느라고 성능 저하가 있었는데 이제는 저 과정을 통해 생성되지않으므로 더 좋은 성능을 기대할 수 있다. 

 

SQL as AST

6.0 버전은 Modeling Query 를 트리로 만드는 것에 심혈을 기울였다. 이제는 SQL 쿼리도 트리구조를 띄고있다.
이 트리는 AST 를 JDBC call 로 바꿀 때 Dialect 가 더 강력한 영향을 미칠 수 있도록 한다. AST 는 HQL(Hibernate Query Language)를 파싱하는 Antlr 기반의 파서다. 우리는 아까 이 Antlr 이 Hibernate 6.0 으로 오면서 버전 4 로 업그레이드 됐던 걸 봤다. 
 

Dialect initialization

Hibernate 6.0 이전 버전을 사용하다보면 같은 Dialect 인데 다양한 버전이 모두 있는 걸 확인할 수 있다. 6.0 부터는 사용중인 드라이버, 데이터베이스의 버전에 따라 Dialect 를 초기화할 수 있게 된다.

 

@Incubating

변할 수 있으니까 조심해서 쓰라(책임은 너의 것) 이라는 의미의 어노테이션이 추가됐다.