Java11으로 가는 길
사내에서 Java8에서 11으로 업그레이드 한 후 성능 향상에 대해 공유된 적이 있다. 유의미한 수준의 성능 개선을 확인할 수 있었다. 그 동안 Java 업그레이드 관련해서 언젠가 해야하겠다는 정도만 생각하고 있었는데, 실행해야겠다고 생각하는 계기가 되었다.
무엇보다 차세대 LTS 버전이 존재하는데 계속 이전 세대의 JDK를 유지하고 있으면 유지보수에도 불리하기 때문에 업그레이드가 필요하다는게 팀원들 대부분의 의견이기도 했다.
작업을 시작하기에 앞서 사내의 사례를 찾아봤는데, LINE Shop의 케이스가 먼저 보였다.
1년 전에 작업 후 자바 유저 그룹에서 발표까지 한 내용이 있었고, 사내의 위키에는 좀 더 자세한 내용들도 있어서 좋은 참고 자료가 되었다. 라인 메신저에 관련된 백엔드 대부분이 비슷한 인프라를 사용하고 있고 내부 구조도 거의 동일하기 때문에 shop의 케이스는 우리에게도 큰 수정 없이 적용할 수 있을 것이라 판단했다.
일단 간단하게 마이그레이션 작업을 측정하기 위해서 다음의 사항을 진행해보기로 한다.
- 메인 개발 장비인 IMac은 업무 대응에 사용해야 하므로 Macbook Pro에 JDK11을 설치한다
- 실패할 경우를 고려해서 SDKMAN으로 설치를 진행
- 로컬에서 프로젝트를 빌드할 수 있도록 작업
- unittest가 모두 성공할 수 있도록 작업
- Integration Test가 모두 성공할 수 있도록 작업
- 프로젝트가 정상적으로 기동하도록 작업
- 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을 대치하기로 결정하였다.
향후 진행 과정을 여기에 하나씩 정리해볼 계획이다.
댓글 없음:
댓글 쓰기