몇몇 게임서비스에서 mysql 5.7 을 쓰고 있다. 5.7이 EOS가 된 상황이라 mysql8 로 업그레이드를 준비했다.
쿼리나 스키마 마이그레이션 이런것들은 냅두고, java 어플리케이션 관점에서만 얘기해보려 한다.
jdbc
가장 골치아픈게 jdbc 였다. 왜냐면 인프라 환경 별로 (개발 환경, 운영 환경) mysql 서버 버전이 다르게 구성되는 시점이 존재했기 때문이다. 개발 환경은 mysql8 인데, 운영환경은 mysql 5.7 으로 다른 버전이 동시에 존재하는 시기가 있었다. 소스코드를 각 환경에 맞게 브랜치를 나눌수도 있겠지만, DB 변경 일정이 롤백을 비롯해서 계획이 꽤나 복잡했었고, 심지어 mysql 업그레이드 계획과 동시에 병렬로 운영환경의 버그도 수정해야했다. 그래서 두 버전이 호환되는 버전이 혹시나 있으려나 하고 알아봤다.
결론부터 말하면 mysql 8.2.0 을 쓰면 된다. 왜냐면 8.2.0 이 5.7을 지원하는 마지막 버전이면서 8.x 도 지원하는 드라이버이기 때문이다.
mysql jdbc 의 버저닝은 해괴하기 짝이 없기로 유명하다. 왜냐면 mysql 6 버전은 존재하지도 않는데, 놀랍게도 mysql jdbc 6 도 있다. maven centarl repo 에서 mysql 이라 검색하면 2개의 mysql 드라이버가 검색이 된다.
https://mvnrepository.com/search?q=mysql
mysql-connector-java 는 mysql-connector-j 로 프로젝트가 옮겨졌다는 안내가 적혀 있다. 프로젝트를 옮긴 까닭은 mysql 에 대한 오라클 인수와 연관이 있다. 이에 대해서는 따로 알아보면 되고, 오라클에 인수가 되면서 mysql 내부 프로젝트가 드랍되고 mysql 6,mysql 7 이 무산되면서 jdbc 버전도 꼬여버리게 되었다. 그래서 버전도 되찾을겸 리팩토링도 할겸 프로젝트가 옮겨졌다. 옮긴 이후부터는 mysql jdbc 버전명은 mysql jdbc 의 메이저버전과 mysql 서버의 버전과 같다는 단순한 전략으로 되었다. 자세한 것은 공식블로그 https://dev.mysql.com/blog-archive/simplified-client-and-connector-versioning/ 글을 참고
To address these issues beginning with the 8.0 server GA release, all of our connectors will synchronize the first digit of their version number with the server. This means that MySQL Server 8.0 will go GA alongside 8.0 versions of each of our connectors. https://dev.mysql.com/blog-archive/simplified-client-and-connector-versioning/
그런데 새로운 mysql jdbc 는 5.x 버전이 없다. 최소가 8.0 부터 시작인데, 그러면 5.7 드라이버는 어디에서 구해야하나? 새로만들어진 드라이버에서도 mysql 5.7을 함께 지원한다고 명시는 되어있다.
MySQL Connector/J is the official JDBC driver for MySQL. MySQL Connector/J 8.0 and higher is compatible with all MySQL versions starting with MySQL 5.7. Additionally, MySQL Connector/J 8.0 and higher supports the new X DevAPI for development with MySQL Server 8.0 and beyond.
https://dev.mysql.com/downloads/connector/j/
내 경험상 레거시 코드를 계속 유지보수한다는 것은 매우 어려운 일이다. 그러니 mysql 에서 레거시 지원을 그만두고 싶을 것이라 생각했다. 그래서 버전 릴리즈 노트를 다 뒤져봤고, 실질적인 지원은 8.2.0 을 마지막으로 8.3.0 부터는 지원이 중단되었다는 것을 알게 되었다. https://dev.mysql.com/doc/relnotes/connector-j/en/news-8-x.html
릴리즈 노트 8.2.0 을 마지막으로 5.7 에 대한 언급이 있었고, 다음 노트인 8.3.0 부터는 5.7 언급이 사라졌다.
This release can be used against MySQL Server version 5.7 and later. https://dev.mysql.com/doc/relnotes/connector-j/en/news-8-2-0.html
아래는 8.3.0
This release can be used against MySQL Server version 8.0 and later. -https://dev.mysql.com/doc/relnotes/connector-j/en/news-8-3-0.html
jdbc의 java 과의 관계는 아래의 공식문서에서 알수있다.
JRE versions: Connector/J 9.3 supports JRE 8 or higher. -https://dev.mysql.com/doc/connector-j/en/connector-j-versions.html
jdbc 의 공식 문서에서는 TLS1.3에 대한 구현 얘기가 살짝 나온다. 이건 또 뭐냐면 같은 java 8 을 설치하였더라도 java8 마이너버전이 무엇이냐에 따라서 jdbc 를 못 쓸 수 있다. 최신 mysql 에서는 TLS 1.3 지원을 요구하는데, java8 8u261 버전에서 부터 TLS1.3 이 지원되었음으로 java8 8u261 버전을 써야 한다. Oracle JDK 를 사용한다면 TLS 1.3 지원은 포기해라. oracle JAVA 라이센스 정책이 바뀌면서 oracle jdk 8u211 을 마지막으로 무료 java 버전이 중단되었기 때문에 TLS1.2 까지 밖에 지원안한다.
8u211 지원 마지막에 대한 내용은 여기서 찾으면 된다.(https://www.oracle.com/kr/java/technologies/javase/javase8u211-later-archive-downloads.html)
oracle jdk 를 쓴다면 이제 사용을 그만두던가 아니면 oracle 의 비싼 유지보수 지원 모델을 구매하던가 해야한다. 당연히 그럴 일은 없을테니, zulu jdk 나 ms jdk 나 뭐 openjdk 든 다른 jdk 를 찾아보도록 하자.
나는 뭐 zulu jdk 를 쓰고 있기 때문에 사실상 상관이 없어서 그냥그러려니 한다. 결론적으로 java8 8u261 버전 이상이라면 현재 mysql jdbc 9 버전을 쓰는 데에 문제가 없다.
아래는 프로젝트 참여 구성원에게 공유하기 위해 정리했던 도표이다. 도표는 https://dev.mysql.com/doc/relnotes/connector-j/en/news-8-x.html 릴리즈 노트를 기준으로 작성했다.
JDBC Version | 지원 Java 버전 | 지원 MySQL 서버 버전 | 비고 / Note |
---|---|---|---|
mysql-connector-j 8.0.x | Java 8 이상 | 5.7 ~ 8.0 | MySQL 8.0까지만 지원 |
mysql-connector-j 8.1.x | Java 8 이상 | 5.7 이상 | |
mysql-connector-j 8.2.x | Java 8 이상 | 5.7 이상 | |
mysql-connector-j 8.3.x | Java 8 이상 | 8.0 이상 | MySQL 5.7 지원 중단 |
mysql-connector-j 8.4.x | Java 8 이상 | 8.0 이상 | |
mysql-connector-j 9.0.x | Java 8 이상 | 8.0 이상 | |
mysql-connector-j 9.1.x | Java 8 이상 | 8.0 이상 | |
mysql-connector-j 9.2.x | Java 8 이상 | 8.0 이상 |
레퍼런스