ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바스크립트같은 약타입 언어에 강한 컨벤션을 강제하는 건 쓸데없는 짓일까? 그럴거면 다른거 쓰지
    개발/자바스크립트로의 깊은 잠수 2026. 4. 8. 21:36

    객체 리터럴, 그 참을 수 없는 가벼움

    객체 리터럴이라는 것이 있습니다.

    자바스크립트에서 객체를 만드는 가장 쉽고 간편한 방법입니다.

     

    // 그냥 이렇게 하면 객체 인스턴스가 만들어집니다. 클래스 정의가 필요없습니다.
    const kimMinji = {
      name: "김민지",
    };
    
    // 심지어 기존에 없는 프로퍼티도 만들어 넣을 수 있습니다.
    kimMinji.birthYear = 2004;

     

    이렇게 객체를 생성하는 행위는 강타입 언어에서는 말도 안되는 짓입니다.

    강타입 언어인 C#의 예시를 보면...

     

    // 먼저 클래스를 정의하고...
    public class Person
    {
        public string Name { get; set; }
        public int BirthYear { get; set; }
        
        public int Age()
        {
            return DateTime.Now.Year - BirthYear + 1;
        }
    }
    
    // 클래스의 인스턴스를 new 키워드로 만들어야 합니다.
    var kimMinji = new Person
    {
        Name = "김민지",
        BirthYear = 2004,
    };
    
    // 이런건 말도 안됨
    var kimMinji = {
        Name = "김민지",
    }
    kimMinji.BirthYear = 2004;

     

    이렇게 복잡하게 많은 코드를 작성해야 합니다.

     

    강타입 언어의 장점은, 이렇게 빡빡한 컨벤션이 언어 레벨에서 강제되기 때문에 오류가 컴파일 타임에 잡힌다는 것입니다.

    반대로 단점은 코드를 좀 많이 작성해야 한다는 점이 있죠.

     

    약타입 언어는 반대입니다.

    코드가 유연하고 심플해지는 장점이 있지만,

    컴파일 타임에 에러를 거의 잡지 못합니다.

     

    근데 자바스크립트는 원래 그렇게 쓰는 언어잖아요?

    웹브라우저에서 간단히 사용하기 위해 만들어진 "스크립트" 언어다보니,

    매번 타입을 정의하고 클래스를 정의하려면 비효율적이니까

    객체 리터럴 같은 상큼한 방식으로 객체 인스턴스를 생성할 수 있도록 한거죠.

     

    문제는 이제 자바스크립트가 그리 간단한 용도로만 쓰이지 않는다는 사실입니다.

     

    타입스크립트

    자바스크립트를 서버 구동에도 쓰고 싶어서 node.js 라는 것이 생깁니다.

    웹 생태계가 커지면서 온갖 곳에서 자바스크립트가 쓰입니다.

    모바일 개발에도, 데스크탑 앱 개발에도 자바스크립트가 쓰이게 되었습니다.

    그리고 심지어 웹 개발 자체도 예전에 비하면 복잡도가 엄청나게 높아졌습니다.

     

    복잡한 코드일수록, 약타입의 장점은 끔찍한 단점이 되기 시작합니다.

    // 어딘가에서 이런 함수를 만들었습니다.
    function calculateAge(person) {
      return new Date().getFullYear() - person.birthYear + 1;
    }
    
    // 6개월 뒤, 다른 개발자가 이 함수를 호출합니다.
    // 인자로 넣어야 하는 person이 뭔데?
    // 알 수 없습니다. 함수 내부 구현을 직접 열어봐야 합니다.
    calculateAge({ name: "김민지" }); // NaN. 에러도 안 남. 그냥 조용히 망함.

     

    이게 100줄짜리 토이 프로젝트면 상관없습니다. 직접 눈으로 훑으면 되니까요.

    근데 10만 줄이면? 50명이 동시에 작업하는 코드베이스면?

    아무도 person에 뭐가 들어가야 하는지 기억하지 못합니다. 주석을 열심히 달아도, 주석은 거짓말을 합니다. 코드는 바뀌는데 주석은 안 바뀌거든요.

    그래서 타입스크립트가 등장합니다.

     

    타입스크립트: 자바스크립트에 안전벨트를 달다

    타입스크립트는 2012년, 마이크로소프트에서 만들었습니다. 핵심 설계자는 C#을 만든 바로 그 사람, 아네르스 하일스베르(Anders Hejlsberg)입니다. 강타입 언어를 설계해본 사람이, 약타입 언어의 고통을 해결하러 온 겁니다.

    타입스크립트의 철학은 심플합니다.

    자바스크립트의 유연함은 유지하되, 타입 시스템을 얹자.

     

    중요한 건 "얹자"라는 표현입니다. 타입스크립트는 자바스크립트를 대체하는 언어가 아닙니다.

    자바스크립트의 슈퍼셋(superset) 입니다.

    // 아까 그 코드, 타입스크립트로 다시 써보면...
    class Person {
      name: string;
      birthYear: number;
    
      constructor(name: string, birthYear: number) {
        this.name = name;
        this.birthYear = birthYear;
      }
    
      age(): number {
        return new Date().getFullYear() - this.birthYear + 1;
      }
    }
    
    // birthYear 없이 만들려고 하면? 빨간 줄이 그어집니다. 컴파일도 안 됩니다.
    const kimMinji = new Person("김민지");
    // ❌ Expected 2 arguments, but got 1.
    
    // 제대로 만들면 age()를 바로 쓸 수 있습니다.
    const kimMinji = new Person("김민지", 2004);
    kimMinji.age(); // 23

     

    에러가 코드를 작성하는 순간 잡히니까 에러를 사전에 검출할 수 있습니다!

    그리고 또 강력한 것이 있어요.

    자동완성입니다.

    person.을 찍는 순간 IDE가 name과 birthYear를 제안해줍니다. 더 이상 함수 내부 구현을 열어볼 필요가 없습니다. 인터페이스가 곧 문서이고, 그 문서는 코드와 항상 동기화됩니다. 주석과 달리 거짓말을 할 수 없습니다.

     

    그러면 그냥 C# 쓰면 되잖아

    합리적인 질문입니다. 강타입이 그렇게 좋으면 처음부터 강타입 언어를 쓰면 되는 거 아닌가?

    문제는 생태계입니다.

    웹 브라우저는 자바스크립트를 실행합니다. C#을 실행하지 않습니다. Java도, Go도, Rust도 실행하지 않습니다. (WASM이라는 게 있긴 한데, 아직은 메인스트림이 아니에요)

     

    프론트엔드 개발을 하려면 자바스크립트를 피할 수 없습니다. 이미 많이 쓰이는, React, Vue, Svelte 같은 라이브러리가 이미 전부 자바스크립트 생태계 위에 있습니다. npm에는 200만 개가 넘는 패키지가 있죠.

    이 거대한 생태계를 버리고 다른 언어로 갈아타는 건 "이 동네 치안이 안 좋으니까 나라를 옮기자"라고 말하는 것과 비슷합니다. 불가능하지는 않지만, 현실적이지 않죠.

    타입스크립트가 현명한 건 이 현실을 인정했다는 점입니다.

    • 모든 자바스크립트 코드는 유효한 타입스크립트 코드입니다.
    • 기존 JS 프로젝트에 .ts 확장자만 바꿔도 일단 돌아갑니다.
    • 타입을 점진적으로 추가할 수 있습니다. 전부 다 한번에 바꿀 필요 없습니다.
    • 컴파일 결과물은 그냥 평범한 자바스크립트입니다.

    기존과의 호환성을 최대화하고 점진적으로 생태계를 먹는 전략을 폈죠.

    그리고 이게 꽤 효과적이었던 것 같습니다.

     

    숫자가 말해주는 것

    2024년 Stack Overflow 개발자 설문조사에서 타입스크립트는 가장 사랑받는 언어 상위권에 올라 있습니다. GitHub에서 가장 빠르게 성장하는 언어 중 하나이기도 합니다.

    Angular는 타입스크립트를 공식 언어로 채택했고, Deno와 Bun 같은 차세대 런타임은 타입스크립트를 네이티브로 지원합니다. 심지어 Node.js도 실험적으로 타입스크립트 직접 실행을 지원하기 시작했습니다.

    이제 새로운 프로젝트를 시작하면서 타입스크립트를 쓰지 않을 이유를 찾는 게 더 어려운 상황이 됐습니다.

     

    다시 처음 질문으로

    약타입 언어에 강한 컨벤션을 강제하는 건 쓸데없는 짓일까?

     

    아닙니다. 자바스크립트가 처음 만들어졌을 때의 용도와 지금의 용도가 완전히 다르기 때문입니다.

    10일 만에 만들어진 브라우저 스크립트 언어가 전 세계에서 가장 널리 쓰이는 범용 프로그래밍 언어가 되어버렸고, 그 과정에서 태생적 한계가 드러났고, 타입스크립트는 그 한계를 생태계를 부수지 않으면서 메꾸는 방법이었습니다.

     

    "그럴 거면 다른 거 쓰지"라는 말은 이론적으로는 맞지만, 현실에서는 "이 언어를 더 안전하게 만들자"가 훨씬 실용적인 답이었고, 실제로 그렇게 됐습니다.

    타입스크립트는 자바스크립트를 부정하지 않습니다. 자바스크립트를 인정한 위에서, 부족한 부분만 채워줍니다.

    그리고 그게 바로, 약타입 언어에 컨벤션을 "강제"하는 것이 아니라 선택지를 제공하는 것의 힘입니다.

    쓰고 싶으면 쓰고, 급하면 any를 쓰면 됩니다. 하지만 대부분의 경우, 타입을 쓰는 쪽이 미래의 나를 살립니다.

    결론은 간단합니다.

    자바스크립트를 사랑한다면, 타입스크립트를 쓰세요. 그게 자바스크립트를 더 오래, 더 건강하게 쓰는 방법입니다.

    댓글

Copyright 2022. ProdYou All rights reserved.