개발
Hibernate 6.0 Final 릴리즈!!
우리로
2022. 4. 5. 00:55
https://in.relation.to/2022/03/31/orm-60-final/
하이버네이트(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 내부적으로만 사용되는 코드다. 그래서 언제든 삭제될 수 있고 어떠한 호환도 보장하지 않는다.
이러한 호환 같은걸 잘 보장하기 위해 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
변할 수 있으니까 조심해서 쓰라(책임은 너의 것) 이라는 의미의 어노테이션이 추가됐다.