[노마드코더 챌린지 / Typescript로 블록체인 만들기] - day1

Teasan·2022년 6월 27일
0

typescript

목록 보기
5/13
post-thumbnail

1.5 Why not JavaScript


왜 사람들은 자바스크립트를 버리고 타입스크립트로 넘어오는 걸까? 그건 바로 타입스크립트의 안정성 때문이다. 더 정확히 말하자면 '타입 안정성' 때문이다.

타입 안정성 덕분에

우리는 타입스크립트의 타입 안정성 덕분에 코드에 일어날 버그를 줄일 수 있다. 그리고 타입 안정성 덕분에 런타임 에러가 줄어들고, 타입 안정성 덕분에 생산성도 늘어나게 된다. 결론적으로는 타입 안정성이란 타입스크립트가 제공하는 가장 큰 장점이라 말할 수 있다.

자바스크립트가 타입 안정성이 없는 언어인 이유

만약 런타임 에러가 무엇인지, 그것이 왜 최악의 에러인지에 대해서 알지 못한다면 타입 안정성이 왜 중요한지 이해하지 못할지도 모른다. 그러니 타입스크립트가 등장하기 전의 자바스크립트에 대해서 먼저 이해할 필요가 있다. 분명 이 예시를 경험한다면 타입 안정성이 왜 중요한지 금방 이해하게 될 지도 모르니까 말이다.

자바스크립트는 유연한 언어이다

자바스크립트에 대해서 가장 먼저 알아야할 것은 이 자바스크립트는 매우 유연한 언어라는 것이다. 아무리 말도 안되는 코드를 작성하더라도 자바스크립트는 최대한 유연하게 그것을 이해하고 받아들인다는 뜻이다.

[1, 2, 3, 4] + false;
// '1,2,3,4false'

위의 예시를 보자. 숫자를 담고 있는 배열에 false를 더하려고 한다면(말도 안되는 일이다!) 두 가지 일이 일어난다. 첫 번째로 배열이 완전히 사라지고 그냥 문자열로 변환된 것을 볼 수 있다. 두 번째는 boolean 타입인 false 역시 문자열로 변환되어 합쳐진 걸 볼 수 있다. 누가 봐도 말이 되지 않는 코드인데, 자바스크립트는 이것을 기꺼이 허용하고 있는 것이다. 그리고 이것이 자바스크립트의 가장 큰 단점이 된다. 당연히 에러가 나야하는 지점(타입과 맞지 않는 이상한 코드)조차 이해하고 받아들이고 있으니 말이다.

이상적으로 생각해봤을 때 우리가 타입과 맞지 않는 이상한 코드를 작성한다면, 자바스크립트가 개발자에게 뭔가가 잘못되어 가고 있다고 알려주는 게 좋을 것이다. 하지만 아쉽게도 현재의 자바스크립트는 이러한 이상적인 기능을 지원해주고 있지 않다.

function divide(a, b) {
	return a / b;
}

divide(2, 3); // 0.66666666666666...

또 다른 예시 코드를 보자. divide 라는 함수는 ab 라는 매개변수를 받아서 그것을 나눠주고 있다. 이상적으로 생각한다면, divide(2, 3) 와 같이 매개변수의 갯수와 타입(숫자)이 제대로 작성되었을 때에만 실행되어야만 한다. 하지만 여기서 자바스크립트의 가장 큰 문제가 드러난다. 자바스크립트가 divide 함수를 올바르게 사용하도록 강제하지 않는다는 것이다.

function divide(a, b) {
	return a / b;
}

divide("xxxxx"); // NaN

divide 라는 함수에 매개변수의 갯수와 타입(숫자)과는 맞지 않는 문자열 값을 전달했다. 하지만 분명히 뭔가가 잘못되었음에도 불구하고 코드 실행을 막아주거나, 에러를 띄우지 않고 NaN 이라는 값을 반환하고 있다. 그리고 NaN 이라는 값을 반환한다는 것은 어쨌든 이 코드가 그대로 실행되고 있다는 뜻이다.

자바스크립트는 확인 과정을 거치지 않는다.

divide 라는 함수에 두개의 인자가 들어갈 것이라고 우리는 이미 알고 있지만, 자바스크립트는 이를 확인하지 않는다. 그리고 문제는 바로 거기에 있다. 자바스크립트는 이런 확인 과정을 거치지 않고 있다는 것 말이다. divide 라는 함수의 ab 매개변수가 무엇인지 자바스크립트는 전혀 알지 못한다. 그 말인 즉슨, divide 라는 함수를 호출하기 위해서는 ab 두개의 매개변수가 필수 입력 값인지 선택 사항인지 아무 것도 모른다는 뜻이다.

런타임 에러는 최악의 에러다

런타임 에러는 콘솔 안에서 일어나는 에러를 말한다. 이런 에러는 유저의 컴퓨터에서 코드가 실행될 때만 일어나는 에러일 수도 있다.

const teasan = { name : "teasan"};

teasan.hello() // 🚨 error!

예시 코드를 보자. teasan 이라는 객체에 담긴 속성의 이름이 아닌 존재하지 않는 것에 접근하여 hello() 함수를 실행했다. 이는 코드를 실행하기 전에 최소화시킬 수 있는 에러 중에 하나이다. 하지만 자바스크립트는 이것이 에러가 날 것이라는 걸 애초에 알지 못했고, 그대로 실행시켰다. 그리고 런타임 에러가 발생되었다.

이상적으로는 코드가 실행되기 전에 자바스크립트가 자체적으로 teasan 이라는 객체에는 hello() 라는 함수가 존재하지 않는다는 사실을 알려줘야만 한다. 하지만 자바스크립트는 그러지 않았다. 게다가 우리가 저 잘못된 존재하지도 않는 함수를 실행시키고 나서 발생하는 에러는 유저의 컴퓨터에서 코드가 실행되었을 때에 나타나는 에러이다. 그리고 이것은 절대로 좋은 프로그래밍 방식이 아닐 것이다. 왜냐하면, 자바스크립트가 잘못된 코드로 인한 에러를 발생시켰을 때는 이미 유저가 코드를 실행했을 때야 비로소 그 에러가 나타나기 때문이다.

정리

앞서 설명한 자바스크립트의 문제점을 보완하기 위해 등장한 것이 타입스크립트이고, 이 때문에 개발자들은 타입스크립트로 넘어오게 되었다. 타입스크립트를 사용하면 자바스크립트에서 발생한 많은 문제들에 대한 걱정을 할 필요가 없기 때문이다.


참조


노마드 코더 ✧ 타입스크립트로 블록체인 만들기 ✧ 챌린지

profile
일단 공부가 '적성'에 맞는 개발자. 근성있습니다.

0개의 댓글