개발자혜수 홈으로 이동개발자혜수

Hyesu's Blog

테크블로그

공부하면서 기록을 남겨요

Java 와 Kotlin 의 차이: 어떻게 같은 Spring 프레임워크에서 동작하는걸까?

2026.07.22. Java&Kotlin

Spring 으로 개발하다보면, 아니면 회사 공고를 살펴보면 Kotlin을 배워야 하나? 라는 질문을 마주하게 됩니다.

Java 와 Spring 으로 개발하던 저의 입장에서는 둘의 차이가 크지 않다고는 생각하지만 대체 어떤 부분에서 Kotlin 을 사용하는 것이고 왜 사용하는지에 대해서 알고 배워야 한다고 생각해 글을 작성하게 되었습니다.

이 글에서는 왜 Kotlin 이 등장했고 Java 와 무엇이 다른지, 그리고 Spring 에서 각각을 택했을 때 어떤 trade-off 가 있을지 현재를 기준으로 정리해보았습니다.

왜 Kotlin 이 나왔을까?


Kotlin 은 IntelliJ를 만드는 JetBrains가 2011년 처음 공개하고 2016년 릴리스한 언어입니다.

비교적 최신이죠?

Kotlin 의 목표는 명확했는데요,

를 해결하기 위함이었습니다.

2017년 구글이 안드로이드 공식 언어로 채택하게 되면서 생태계가 더 활발해졌고 이후 spring과 ios 를 포함한 멀티플랫폼으로 영역을 넓히게 되었습니다.

이에 대해 Java도 가만히 있지는 않았는데요,

var 타입 추론, record, sealed class, switch 패턴 매칭 등 Kotlin 의 아이디어를 하나씩 언어에 추가했습니다.

그래서 최신 Java 21, 25 와 Kotlin 을 비교하면 문법적 차이는 적어졌습니다.

언어의 근본적 차이


일단 가장 큰 차이점이 바로 Null 안정성 입니다.

Kotlin 은 타입 시스템 자체에서 StringString? 을 구분해서 컴파일 시점에 NPE 가능성을 차단합니다.

Java 는 @Nullable 이나 @NonNull 어노테이션을 통해서 힌트를 줄 뿐 이는 컴파일 단계에서는 강제하지는 않습니다.

다만, Spring 프레임워크 7부터는 JSpecify 어노테이션을 Spring 전반에 표준으로 채택해서 Java 에서도 null 안정성을 정적으로 검증할 수 있게 되었다고 합니다.

그러나 Kotlin 처럼 언어 차원에서 강제가 아니라 어노테이션 기반의 보조 장치일 뿐입니다.

또한 Java 에 비해서 조금 더 간결하다고 하는데요,

data class 하나로 getter/setter/equals/hashCode/toString/copy 가 자동 생성되고, 확장 함수, 스마트 캐스트, 기본 파라미터 값, when 표현식 등이 결합되면 동일 로직도 Java 대비 코드량이 더 줄어듭니다.

Java 의 Record 가 이를 대체하긴 하지만, 상속과 커스텀 로직 측면에서는 아직 제약이 있습니다.

그 외에도 최근의 뜨거운 비교 주제가 동시성 모델입니다.

Kotlin 코루틴은 suspend 키워드로 명시적 중담점을 두는 협력형(cooperative) 모델이고, Java 의 가상 스레드는 기존 스레드 API 를 그대로 쓰면서, JVM 이 경량 스레드를 관리하는 선점형 모델입니다.

2026년 벤치마크에 따르면 구조화된 동시성이 필요한 워크로드에서는 코루틴이 4~8% 정도 처리량 우위를 보이고, 단순 fire-and-fotget 워크로드에서는 가상 스레드가 동등하거나 약간 앞선다고 합니다.

그래서 코드 변경 없이 스레드가 알아서 확장되기를 원한다면 가상 스레드, 취소 및 스코프를 명시적으로 설계하는 팀이면 코루틴 이라는 구분으로 쓰인다고 합니다.

Trade-Off


Kotlin 을 택했을 때 가장 큰 장점은 컴파일 시점에 null 안정성, Java 에 비해서 더 짧은 코드, 코루틴 기반 비동기 처리 입니다.

그러나 단점도 존재하는데,

JPA 엔티티는 기본적으로 No-arg 생성자와 상속 가능성이 필요한데 Kotlin 클래스는 기본이 final 이라 kotlin-jpa 와 같은 플러그인이 필요합니다.

또한 Kotlin 에 비해서 Java 가 더 레퍼런스가 많습니다.

또 최신에는 java 가 kotlin 에서 목표로 삼았던 것을 어느정도는 해소했다고 볼 수 있습니다.

결론


spring framwork 7, spring boot 4 버전인 현재 지금, Kotlin 2.2 를 공식 베이스로 채택했다는 것에서 Kotlin 이 Java 생태계에 있는 서브 언어라기 보다는 이 둘을 동등한 지위의 언어로 다루고 있다고 볼 수 있습니다.

만약 신규 프로젝트이고 코루틴 기반 비동기 처리를 우선한다면 kotlin 이

기존 프로젝트가 java 로 운영중이거나 이전의 단점이 더 크다면 Java+가상 스레드가 더 합리적이라고 생각합니다.

목록으로 돌아가기

댓글