JDK 버전 업그레이드

살다보면 오래된 JDK로 더 이상 버틸 수 없을 때가 있다.
JDK 버전을 업그레이드 하면서 Spring Boot기반 개인 프로젝트에서 변경되는 것들 정리해 봤다.
실제로는 변경 요소가 본문 보다 훨씬 더 많을 것이다.

OpenJDK 13 설치

  • JavaSE(Oracle JDK)는 약 버전 9 부터 유료 라이선스로 변경됨
  • (Windows의 경우)Java 폴더에 JDK파일 다운로드(복사) 후 Environment Variables에서 JAVA_HOME 변경
  • (Ubuntu의 경우)apt-get 으로 설치 후 기본 JDK 선택
    • PPA: https://launchpad.net/~openjdk-r/+archive/ubuntu/ppa
    • Install: https://installvirtual.com/how-to-install-openjdk-13-on-ubuntu-19/
  • 버전 확인
    $ java --version
    openjdk 13.0.2 2020-01-14
    OpenJDK Runtime Environment (build 13.0.2+8)
    OpenJDK 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
    

코드 외 부분

  • 구버전 Gradle이 지원을 하지 않음
    • 정확한 버전 지원은 모르겠으나 Gradle 버전 5 이상(또는 6 이상)만 지원
    • 버전 4 이하는 에러 표시
      $ gradle -version
      FAILURE: Build failed with an exception.
          
      * What went wrong:
      Could not determine java version from '13.0.2'.
          
      * Try:
      Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
      
    • 주의: Gradle의 plugin 중에서도 아직 지원하지 않는 경우가 존재
  • IDE 설정 필요
    • IDE에 연결되어 있는 Java home과 Gradle home 등을 바뀐 환경에 맞게 수정 필요
    • org.gson 에서 java.sql.Time class 못찾는 문제 발생
      • 왠지 모르겠지만, IDE에서 Shorten command line 값을 JAR manifest로 변경 필요
      • 참고

코드 내 부분

  • Gradle 설정 변경 필요
  • Spring Boot 버전 업그레이드 필요
    • Sprinb Boot 2.2.x 이상만 지원
    • Spring Boot 버전이 올라가면서 관련된 라이브러리 업그레이드 필요
      • redis.clients 를 3.1 이상, 참고
        • RedisOperationsSessionRepository가 deprecated됨 -> RedisIndexedSessionRepository 사용
      • Redis 관련 코드 수정 필요
        • 이유를 알 수 없지만, StringRedisSerializer 사용 시, session 값 deserialize 오류 발생(향후 원인 확인 필요)

          Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload

        • 그냥 default인 JdkSerializationRedisSerializer를 사용하면 에러는 해결되지만, 보안에 취약하므로 다른 것을 사용하기를 권장함, 참고
  • javax package가 jakarta 로 변경 됨, OpenJDK 11부터 JavaEE 삭제
    • jakarta.xml.bind-api 또는 javax.xml.bind 의존성 추가 필요
    • 참고
  • SessionId 생성관련 Warning 발생
    • org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [000] milliseconds.
    • 난수 생성시 문제
  • Jackson 관련 Warning 발생
    • JacksonAutoConfiguration$JodaDateTimeJacksonConfiguration - Auto-configuration of Jackson’s Joda-Time integration is deprecated in favor of using java.time (JSR-310)

느낀점

  • 높은 버전이 무조건 좋지는 않음
    • JDK 하위 호환성에서 문제가 발생
    • 라이브러리, 플러그인 등에서 아직 Java 9 초과는 지원 안되는 경우가 존재
  • 개선이 많이 됨
    • 개인적으로는 필요했던 Lambda 함수가 추가되어 좋음
    • StackOverflow의 최신 답변에 맞게 적용가능한 Java및 SpringBoot!
  • 어쨋든 변화에 적응 필요

참고