Java는 "안 바꿔도 되는 안정성"을, Kotlin은 "항상 최신이어야 하는 민첩성"을 선택했다. 두 언어의 릴리스 정책은 설계 철학만큼이나 다르다. 이 글에서는 Oracle의 Java LTS 모델과 JetBrains의 Kotlin 릴리스 모델을 비교하고, 프로덕션 환경에서 어떤 의미를 갖는지 정리한다.
1. 왜 LTS 정책이 중요한가
프로덕션 서비스를 운영하는 입장에서 언어 버전 정책은 곧 운영 비용이다.
- 새 버전이 나올 때마다 올려야 하는가, 아니면 몇 년간 현재 버전에 머물러도 되는가?
- 보안 취약점이 발견되면 현재 버전에 패치가 나오는가, 아니면 최신 버전으로 강제 이동해야 하는가?
- 버전 업그레이드 시 기존 코드가 깨질 가능성은 얼마나 되는가?
이 질문에 대한 답이 Java와 Kotlin에서 완전히 다르다.
2. Java: Oracle의 LTS 모델 — "안 바꿔도 됩니다"
릴리스 구조
Java는 2017년(Java 9)부터 6개월 주기 릴리스를 채택했다. 매년 3월과 9월에 새 버전이 나온다. 하지만 모든 버전이 동등하지는 않다.
Java 21 (LTS) ─── 2023.09 출시, 2031년까지 지원
Java 22 ─── 2024.03 (non-LTS, 6개월 지원)
Java 23 ─── 2024.09 (non-LTS, 6개월 지원)
Java 24 ─── 2025.03 (non-LTS, 6개월 지원)
Java 25 (LTS) ─── 2025.09 출시, 2033년까지 지원 예정
LTS(Long-Term Support) 버전은 2년마다 지정되며, Oracle 기준 최소 8년간 보안 패치와 버그 수정이 제공된다. non-LTS 버전은 다음 버전이 나오면 6개월 만에 지원이 종료된다.
지원 주체가 다양하다
Java의 가장 큰 강점은 OpenJDK라는 오픈소스 거버넌스 위에 복수의 벤더가 존재한다는 점이다.
배포판 제공사 LTS 지원 기간
| Oracle JDK |
Oracle |
8년 (유료 Extended는 그 이상) |
| Eclipse Temurin |
Adoptium (Eclipse 재단) |
최소 4년 |
| Amazon Corretto |
AWS |
최소 4년 |
| Microsoft Build of OpenJDK |
Microsoft |
최소 4년 |
| Azul Zulu |
Azul Systems |
최소 4년 (유료 연장 가능) |
| Red Hat OpenJDK |
Red Hat |
RHEL 수명과 동일 |
| SAP Machine |
SAP |
SAP 내부 + 커뮤니티 |
Oracle이 Java를 포기하더라도(현실적으로 가능성은 극히 낮지만), Amazon, Microsoft, Red Hat 등이 독립적으로 OpenJDK를 유지할 수 있다. 단일 회사 의존 리스크가 사실상 없는 구조다.
프로덕션에서의 의미
Java 21 LTS를 쓰고 있다면:
- 2031년까지 보안 패치를 받을 수 있다.
- 그 사이 Java 22, 23, 24가 나와도 업그레이드 의무가 없다.
- 팀이 원할 때, 준비가 됐을 때 다음 LTS(Java 25)로 이동하면 된다.
- 업그레이드 주기를 팀의 역량과 일정에 맞출 수 있다.
금융, 공공, 대기업 SI에서 Java를 선호하는 핵심 이유 중 하나가 바로 이 예측 가능한 장기 지원이다.
3. Kotlin: JetBrains의 롤링 모델 — "최신이 곧 안정입니다"
릴리스 구조
Kotlin은 LTS 개념이 없다. 릴리스 타입은 세 가지다:
Kotlin 2.2.0 ─── 언어 릴리스 (6개월 주기, 주요 기능 추가)
Kotlin 2.2.20 ─── 툴링 릴리스 (언어 릴리스 3개월 후, 도구 개선/버그 수정)
Kotlin 2.2.21 ─── 버그 수정 릴리스 (비정기)
문제는 이전 버전에 대한 지원 약속이 명확하지 않다는 점이다. Kotlin의 endoflife.date 기준으로, 보통 최신 버전만 활발히 개발되고 버그 및 보안 수정을 받는다. Kotlin 2.3이 나오면, 2.2에 심각한 버그가 발견되더라도 별도 패치가 나온다는 보장이 없다.
지원 주체: JetBrains 단독
이것이 Java와의 결정적 차이다.
항목 Java Kotlin
| 명세 거버넌스 |
JCP (Java Community Process) |
JetBrains 단독 (KEEP 제안은 받지만 결정권은 JetBrains) |
| 구현체 수 |
다수 (Oracle, Adoptium, Corretto 등) |
사실상 1개 (JetBrains Kotlin 컴파일러) |
| LTS 정책 |
명확 (2년 주기, 8년 지원) |
없음 (최신 버전만 지원) |
| 회사 의존도 |
낮음 (OpenJDK 멀티벤더) |
높음 (JetBrains 단일 의존) |
| 최악의 시나리오 |
Oracle 철수 시 다른 벤더가 계속 유지 |
JetBrains 철수 시 커뮤니티 포크에 의존 |
Kotlin은 Apache 2.0 라이선스 오픈소스이므로 이론적으로 누구나 포크할 수 있다. 하지만 Kotlin 컴파일러의 복잡도를 감안하면, JetBrains 없이 커뮤니티가 유지하기는 현실적으로 매우 어렵다.
프로덕션에서의 의미
Kotlin 2.2를 쓰고 있다면:
- 6개월 후 Kotlin 2.3이 나오면, 2.2의 보안 패치가 계속 나온다는 보장이 없다.
- 즉, 보안 지원을 받으려면 사실상 6개월마다 버전 업그레이드를 해야 한다.
- Kotlin 메이저 업그레이드 시 컴파일러 동작 변경, deprecation, Gradle 플러그인 호환성 이슈가 발생할 수 있다.
- 이를 소화할 수 있는 엔지니어링 역량이 전제된다.
4. 실제 업그레이드 부담 비교
Java LTS → LTS 업그레이드
Java 21에서 Java 25로 넘어갈 때:
- 주기: 2년에 한 번 (원하면 4년, 6년 미룰 수도 있음)
- 영향 범위: 보통 제거 예정(deprecated) API가 실제 삭제되는 수준. 대부분의 코드는 변경 없이 동작.
- 테스트 범위: CI에서 새 JDK로 빌드+테스트 돌려보고, 깨지는 부분만 수정.
- 소요 시간: 일반적인 MSA 프로젝트 기준 수일~2주.
Kotlin 버전 업그레이드
Kotlin 2.2에서 2.3으로 넘어갈 때:
- 주기: 6개월마다 (미루면 보안 패치 공백 발생)
- 영향 범위: 컴파일러 동작 변경, 새로운 경고/오류 추가, Gradle 플러그인 버전 동기화 필요.
- 자주 발생하는 이슈: Kotlin Gradle Plugin 버전과 Gradle 자체 버전 호환성 충돌, IDE 플러그인 업데이트 필요, 코루틴/직렬화 등 kotlinx 라이브러리 호환성 확인 필요.
- 소요 시간: 단순한 프로젝트는 수시간, 복잡한 멀티모듈 프로젝트는 수일.
6개월마다 이 작업이 반복된다는 게 핵심이다. Java LTS 모델에서는 2~3년에 한 번이면 되는 작업을 Kotlin에서는 매년 2번 해야 한다.
5. 그럼에도 Kotlin을 선택하는 이유
리스크가 있는데도 토스, 카카오페이, 라인, 쿠팡 같은 국내 주요 테크 기업들이 Kotlin을 적극 도입한 이유가 있다.
Google의 Android 공식 언어
2017년 Google이 Kotlin을 Android 공식 언어로 채택한 이후, Kotlin의 생존은 사실상 보장되었다. Google이 Android를 포기하지 않는 한, JetBrains에 대한 간접적 지원이 계속된다. 실제로 Google은 Kotlin 재단(Kotlin Foundation)의 공동 설립자이며, Kotlin 컴파일러 개발에도 직접 기여하고 있다.
JetBrains의 사업 모델과 Kotlin
JetBrains에게 Kotlin은 단순한 사이드 프로젝트가 아니다. IntelliJ IDEA, Android Studio(Google 협업), Fleet 등 JetBrains 제품 생태계의 핵심 차별점이다. Kotlin을 포기하는 것은 JetBrains의 핵심 경쟁력을 포기하는 것과 같으므로, 사업적으로 Kotlin 유지에 대한 인센티브가 매우 강하다.
언어 자체의 생산성
LTS 정책과 별개로, Kotlin이 제공하는 개발 생산성은 실질적이다:
- Null safety가 컴파일 타임에 보장되어 NPE 관련 런타임 버그가 크게 줄어든다.
- data class, extension function, 스코프 함수 등으로 보일러플레이트가 대폭 감소한다.
- 코루틴을 통한 비동기 프로그래밍이 자연스럽다.
- Java와 100% 상호운용이 가능하여 점진적 도입이 쉽다.
이 생산성 이점이 6개월 주기 업그레이드 비용을 상쇄하고도 남는다고 판단하는 기업들이 Kotlin을 선택한다.
6. 현실적인 전략
금융/공공/대기업 SI 환경
안정성과 예측 가능성이 최우선인 환경에서는 Java LTS가 정답이다.
- Java 25 LTS를 기본 플랫폼으로 사용
- Virtual Thread로 경량 동시성 확보
- 필요 시 Kotlin을 일부 모듈에만 제한적으로 도입
- 버전 업그레이드 주기를 LTS 단위(2~3년)로 관리
스타트업/테크 기업 환경
빠른 개발 속도와 개발자 경험이 우선인 환경에서는 Kotlin 도입이 합리적이다.
- Kotlin + Spring Boot 조합으로 생산성 극대화
- 6개월 주기 업그레이드를 감당할 수 있는 CI/CD 파이프라인 구축
- kotlinx 라이브러리 버전을 Kotlin 버전과 동기화하는 자동화 도입
- 업그레이드 전담 스프린트를 반기마다 계획에 반영
양쪽 모두에 통하는 원칙
어떤 환경이든 Java가 기반, Kotlin은 그 위의 레이어라는 구조는 변하지 않는다. Kotlin 코드는 결국 JVM 바이트코드로 컴파일되어 Java LTS 런타임 위에서 동작한다. Kotlin 컴파일러에 문제가 생기더라도, 이미 컴파일된 바이트코드는 Java LTS의 지원을 받는다.
[Kotlin 소스코드]
↓ (Kotlin 컴파일러 — JetBrains 의존)
[JVM 바이트코드]
↓ (JVM 런타임 — Oracle/OpenJDK LTS 보장)
[프로덕션 실행]
이 구조를 이해하면, Kotlin의 LTS 부재가 치명적 리스크는 아니라는 것을 알 수 있다. 컴파일 도구의 지원 정책과 런타임 플랫폼의 지원 정책은 별개이며, 런타임 안정성은 Java LTS가 보장하기 때문이다.
7. 정리
비교 항목 Java (Oracle) Kotlin (JetBrains)
| LTS 정책 |
명확 (2년 주기, 8년 지원) |
없음 |
| 이전 버전 패치 |
LTS는 수년간 지속 |
최신 버전만 지원 |
| 업그레이드 강제성 |
낮음 (LTS에 머물러도 됨) |
높음 (6개월마다 권장) |
| 거버넌스 |
멀티벤더 (OpenJDK) |
단일 벤더 (JetBrains) |
| 단일 회사 리스크 |
매우 낮음 |
있음 (Google 후원으로 완화) |
| 업그레이드 비용 |
2~3년에 한 번, 대체로 안전 |
6개월마다, 간헐적 호환성 이슈 |
| 적합한 환경 |
금융, 공공, 장기 운영 시스템 |
스타트업, 테크 기업, 빠른 개발 |
결국 선택은 **"안정성에 투자할 것인가, 생산성에 투자할 것인가"**의 문제다. Java LTS는 바꾸지 않아도 되는 안정성에 대한 투자이고, Kotlin은 바꿀 수 있는 역량을 전제로 한 생산성에 대한 투자다.
두 가지가 상호 배타적이지 않다는 점도 기억해야 한다. Java LTS 런타임 위에 Kotlin을 얹는 구조는, 런타임 안정성과 개발 생산성을 동시에 취하는 현실적인 절충안이다.
이 글은 Java 25 LTS (2025.09 예정)와 Kotlin 2.3.x (2025.12 출시) 기준으로 작성되었습니다. Oracle Java SE Support Roadmap, JetBrains Kotlin Release Process, endoflife.date를 참고했습니다.