TypeScript가 Kotlin에 비해서 거지같다고 느껴지는 이유
들어가며
위 글은 Kotlin을 주 프로그래밍 언어로 사용하는 Backend개발자가 작성한 글입니다.
절대로 TypeScript대신 JavaScript를 쓰자고 하는 것이 아니며, 개인적으로 TypeScript에 대해서 개선되어야 한다고 생각하는 부분에 대해서 작성한 글입니다.
혹시라도 틀린 부분이 있다면 지적 부탁드립니다.
Web Front개발을 하게 되면 무조건 JS혹은 TS를 사용하게 됩니다.
먼저 JS는 기상천외한 작동 방식으로 개발자를 당황하게 만들기로 유명합니다.
이런 기상천외한 작동 방식의 가장 큰 이유는 JS가 동적 타이핑 언어, 약타입 언어이기 때문일 것입니다.
그리고, TS는 이런 JS에 type을 추가한 JS의 Superset언어이며, 강타입 언어입니다.
그렇다면 이런 JS에 type을 추가한 TS는 분명히 모든것이 예측 가능하고 아주 편해야 할 것입니다.
그러나 실제로 TS를 사용해 보면 무언가 불편한 점이 있고, 무언가 불쾌한 부분이 있습니다.
필자가 생각하기에 이러한 이유의 원인은 JS에서 TS코드 호출 시 빡빡한 Type Assertion을 하지 않는다는 것에 있습니다.
// util.ts
export function foo(value: number) {
const a = value + 10;
console.log(value);
}
// main.js
foo('20'); // 2010
Kotlin의 경우 java에서 호출할 때 NonNull인 곳에 null을 넘겨주면 오류가 나게 됩니다.
// Utils.kt
class Dto(value: Int)
fun foo(dto: Dto) {
println("${dto.value + 10}")
}
// Main.java
// 생략
foo(new Dto(1)); // 11
foo(null); // NullPointerException
이러하여 Kotlin은 항상 올바른 타입이라는 것이 보증이 되나, TS의 경우에는 그렇지 않습니다.
type이 있지만 반쪽짜리 타입을 가진 TS로는 이를 전부 처리하는게 귀찮으니 number | string과 같은 이상한 union type을 선언하거나, 타입 처리가 귀찮으니 any 타입을 남발하고는 합니다. 또 API 호출을 통해서 생성된 객체의 경우 실제로 객체에서 해당 값을 사용하기 전 까지는 타입이 완벽함을 보증 해 주지 않습니다.
Kotlin의 강한 type assertion은 Kotlin으로 개발할 때 마치 단단한 콘크리트 바닥에서 건물을 짓는 것과 같은 느낌을 줍니다.
그러나 TS의 반쪽짜리 type은 TS로 개발할 때 마치 진흙 위에 건물을 짓는 것과 같은 불안정한 느낌을 줍니다.
물론 이러한 것은 Linter를 통해서 프로젝트 내에서는 어느정도 해결이 가능합니다. 그러나 더 큰 문제는 이것이 package manager와 합쳐졌을때 생겨납니다.
package manager에 올리는 라이브러리/프레임워크들은 각각의 개발자가 자신만의 스타일로 TS를 사용했고, 이러한 라이브러리들 중에서는 빡빡한 type assertion을 하지 않는 라이브러리들도 많을 것입니다.
이러한 라이브러리가들이 쌓여서 커다란 생태계를 이룬다면 TS를 사용하더라도 올바른 타입으로 값이 잘 들어감을 보증할 수가 없게 됩니다.
이런 점에서 TS는 Kotlin에 비해서 거지같다고 느껴집니다.
물론 JS의 Superset언어인 TS입장에서는 좀 억울하다고 느껴질 수 있다고 생각됩니다.
Kotlin의 경우에는 애초에 Java가 강타입 언어인지라 Java->Kotlin호출 시 null safety정도만 assertion해주면 됩니다.
그러나 TS의 경우 모태가 되는 JS는 약타입 언어며 JS의 Superset의 포지션으로 개발된 언어입니다. 이러한 TS의 입장에서 js->ts 호출 시 마다 매번 빡빡한 type검사를 하는 것은 어마어마한 Overhead를 불러일으킬 수 있다고 생각이 되며, Superset으로써 지원해주기가 더욱 힘들 것이라는 생각이 듭니다.
그러나 저는 이러한 Overhead에도 불구하고 TS가 Kotlin같이 매번 type assertion을 하도록 강제해야 한다고 생각합니다.
만약 Kotlin이 Java에서 호출될 때 null값에 대한 검증을 매번 하지 않았더라면 이 부분에 대해서 거지같다고 욕을 먹는 언어가 됐지 않을까 생각합니다.
그럼에도 앞으로 이러한 문제점을 바로잡고 TypeScript의 진흙같은 부분을 잘 굳혀서 Kotlin과도 같이 단단한 기반을 만들어 개발자가 사용하기 좋은 언어로써 거듭났으면 좋겠습니다.