2019년 12월 4일 수요일

20191204 Java11으로 가는 길


Java11으로 가는

사내에서 Java8에서 11으로 업그레이드 성능 향상에 대해 공유된 적이 있다. 유의미한 수준의 성능 개선을 확인할 있었다. 동안 Java 업그레이드 관련해서 언젠가 해야하겠다는 정도만 생각하고 있었는데, 실행해야겠다고 생각하는 계기가 되었다.

무엇보다 차세대 LTS 버전이 존재하는데 계속 이전 세대의 JDK 유지하고 있으면 유지보수에도 불리하기 때문에 업그레이드가 필요하다는게 팀원들 대부분의 의견이기도 했다.

Oracle Java SE Su ort Roadma 
Release 
6 
7 
9 (non-LTS) 
10 (non-LTS) 
It (LTS) 
12 (non-LTS) 
13 (non-LTS) 
GA Date 
December 
2006 
July 2011 
March 2014 
September 
2017 
March 2018 
September 
2018 
March 2019 
September 
2019" • 
Extended Support 
Premier Support Until 
December 2015 
July 2019 
March 2022 
March 2018 
September 2018 
September 2023 
September 2019 
March 2020 
Until 
December 2018 
July 2022 
March 2025 
Not Available 
Not Available 
September 2026 
Not Available 
Not Available 
Sustaining 
su 
Indefinite 
Indefinite 
Indefinite 
Indefinite 
Indefinite 
Indefinite 
Indefinite 
Indefinite


작업을 시작하기에 앞서 사내의 사례를 찾아봤는데, LINE Shop 케이스가 먼저 보였다



1 전에 작업 자바 유저 그룹에서 발표까지 내용이 있었고, 사내의 위키에는 자세한 내용들도 있어서 좋은 참고 자료가 되었다. 라인 메신저에 관련된 백엔드 대부분이 비슷한 인프라를 사용하고 있고 내부 구조도 거의 동일하기 때문에 shop 케이스는 우리에게도 수정 없이 적용할 있을 것이라 판단했다.

일단 간단하게 마이그레이션 작업을 측정하기 위해서 다음의 사항을 진행해보기로 한다.
  1. 메인 개발 장비인 IMac 업무 대응에 사용해야 하므로 Macbook Pro JDK11 설치한다
  2. 실패할 경우를 고려해서  SDKMAN으로 설치를 진행
  3. 로컬에서 프로젝트를 빌드할 있도록 작업
  4. unittest 모두 성공할 있도록 작업
  5. Integration Test 모두 성공할 있도록 작업
  6. 프로젝트가 정상적으로 기동하도록 작업
  7. E2E 테스트가 모두 성공할 있도록 작업

일단 위의 내용들이 모두 성공하면 마이그레이션이 가능하다고 판단할 있다고 생각한다. 이후 필요한 작업들은 마이그레이션 계획을 수립해서 팀에 공유하고 Beta -> Staging -> Release 환경으로 차근차근 진행하는 것이 필요하다고 생각한다.


첫날에 진행한 작업은 다음과 같다.

JDK11 설치 개발환경 세팅

먼저 맥북에 JDK11 설치했다. SDKMAN 이전에 설치해두었기 때문에 `sdk use` 명령으로 11 기본으로 사용하도록 하였고, IntelliJ에서 프로젝트 기본 SDK 11 사용하도록 수정했다.

컴파일 문제 해결

컴파일 과정에서 먼저 확인된 문제가 @Resource 어노테이션의 클래스를 찾을 없다는 문제였다. 해결방법을 찾아보니 dependency 추가해줘야 한다는 것을 있었다.

javax.annotation:javax.annotation-api

위의 dependency gradle 적당히 넣어주고 문제는 해결 있었다.

Unittest 문제 해결

Unittest 실행해보니 열개 조금 넘는 실패가 있었다. 첫번째로 문제를 확인한 것은 powerMock에서 에러가 발생하는 것이었는데 bytecode 조작에 사용되는 ASM 6.x 버전을 JDK11에서 지원하지 않아서 발생하는 것이었다. 해결책은 두가지가 있는데, 첫번째는 ASM7 사용하도록 하는 것이고 두번째는  powerMock을 제거하는 것이다.

예전부터 powerMock 필요한 상황은 아니라고 생각하고 있었기 때문에 이번 기회에 Mockito JUnit 기능들을 사용해서 powerMock 대치하기로 결정하였다.


향후 진행 과정을 여기에 하나씩 정리해볼 계획이다.




댓글 없음:

댓글 쓰기

Man of Month를 마치며

벌써 2020년 1월 14일이다. 19년의 마지막 달에 Man of Month라는 팀의 제도를 시작한다고 했었는데, 12월이 지나고 그 다음 달도 거의 절반이 흐른 것이다. MoM을 시작하면서 하겠다고 계획했던 것들도 실제 한 것들과 비교해보니...