본문 바로가기

JavaScript 개발자를 위한 TypeScript 입문: 타입 시스템과 활용법

M:D 2024. 4. 19.

TypeScript는 Microsoft에서 2012년에 개발한 오픈 소스 프로그래밍 언어로, JavaScript의 확장된 정적 타입 문법을 추가한 것이 특징입니다. TypeScript는 코드 유지 보수성을 향상시키고 개발 생산성을 높이는 데 도움이 대규모 SI 프로젝트에서 자주 사용되며, 개발자들 사이에서 높은 인기를 끌고 있습니다. 이번 글을 통해서 TypeScript의 특징, 장,단점, 활용 등을 통해 TypeScript을 써야 할지 한번 고려해보시기 바랍니다.

JavaScript 개발자를 위한 TypeScript 입문: 타입 시스템과 활용법
JavaScript 개발자를 위한 TypeScript 입문: 타입 시스템과 활용법

JavaScript 말고 TypeScript

JavaScript는 인터넷만큼 오래되었습니다.
90년대에 대화형 웹 페이지를 만들기 위해 Netscape(Mozilla의 조상) 사람들은 Java와 유사한 구문을 사용하는 새로운 객체 지향 해석 언어를 만들었는데, 바로 이것이 JavaScript입니다. JavaScript는 지금도 웹 브라우저의 표준 프로그래밍 언어이고 퍼블리셔가 기본적으로 다루는 html, css 와 함께 사용됩니다. 하지만 JavaScript는 동적 타입의 언어이기 때문에 코드를 실행하는 동안 타입 오류를 찾을 수 없고 런타임에 발생할 수 있는 오류가 많으며 호환성의 문제가 있어서 대안이 불가피 했습니다. Microsoft 개발자들은 대규모 웹 애플리케이션을 더 빠르게 작성하기 위한 솔루션을 원했고, 이들의 노력으로 2012년에는 TypeScript 컴파일러를 사용하여 일반 JavaScript로 컴파일(또는 트랜스컴파일)할 수 있는 새로운 언어인 TypeScript가 출시되었습니다.

TypeScript는 JavaScript가 실행되는 모든 곳에서 작동하며, JavaScript로 컴파일 되어 브라우저, Node.js, 또는 어떤 JavaScript 엔진에서도 실행할 수 있기 때문에 최근 개발자들 사이에서 더욱 사랑 받는 언어로 자리매김하고 있습니다.

 

TypeScript의 주요 특징

  • 정적 타입 언어: TypeScript는 변수와 함수의 매개변수, 객체의 속성 등에 타입을 명시적으로 선언 합니다.
  • JavaScript와의 호환성: TypeScript는 JavaScript의 모든 기능을 지원하며, JavaScript 코드와 함께 사용할 수 있으며 컴파일러를 제공하여 TypeScript 코드를 JavaScript 코드로 변환해줍니다.
  • 대규모 프로젝트에 적합: 객체 지향 프로그래밍을 위한 클래스, 인터페이스, 다양한 라이브러리와 프레임워크를 지원하여 대규모 애플리케이션 개발에 유용합니다.
  • 고급 타입 시스템: 제네릭, 유니언 타입, 인터섹션 타입, 튜플 등 고급 타입을 지원하여, 복잡한 타입 조합을 표현할 수 있습니다.
  • ES6 기능: 람다 함수(화살표 함수), 비구조화 할당, 모듈 등 최신 ECMAScript 기능을 사용할 수 있습니다.
  • 개발 도구 지원: TypeScript는 자동 완성, 코드 리팩토링, 타입 검사 등을 지원하는 다양한 개발 도구를 개발자의 생산성을 향상시킵니다. Visual Studio Code, WebStorm 등의 IDE에서는 TypeScript를 기본적으로 지원하며, TypeScript 전용 에디터도 존재합니다.

 

TypeScript의 장점

  • 가독성 및 유지 보수성: 명시적인 변수와 함수의 타입 정의를 통해 코드의 가독성을 높이고 유지 보수성을 향상시킵니다. 이를 통해 다른 개발자들이 코드를 이해하기 쉬워지며, 협업이 용이해집니다.
  • 에러 방지: 타입 검사를 통해 런타임에 발생하는 예기치 못한 에러를 사전에 방지할 수 있습니다. 이는 개발자가 코드를 작성하는 동안 발생 가능한 에러를 미리 파악하여 디버깅 시간을 절약해줍니다.
  • IDE 지원 강화: 정적 타입을 통해 IDE에서 더 나은 자동 완성, 리팩토링, 오류 검출 기능을 제공합니다. 이는 개발 효율성을 크게 향상시킵니다.
  • 대규모 프로젝트에 적합: 정적 타입과 강력한 도구 지원으로 인해 대규모 프로젝트의 관리가 용이해집니다. 코드의 안정성과 유지보수성이 향상됩니다.
  • 인터페이스와 제네릭: TypeScript는 인터페이스와 제네릭을 지원하여 객체 지향 프로그래밍 및 함수형 프로그래밍의 기능을 풍부하게 사용할 수 있습니다. 이를 통해 코드의 재사용성을 높이고 유연성을 제공합니다.
  • 강력한 개발 도구 지원: TypeScript는 Visual Studio Code를 비롯한 다양한 통합 개발 환경에서 강력한 지원을 받습니다. 코드 완성 기능, 타입 체크, 디버깅 도구 등을 제공하여 개발 생산성을 높여줍니다.
  • 개발 속도 향상: 다양한 라이브러리와 프레임워크를 지원하며, 이를 활용하여 개발 속도를 높일 수 있습니다. 또한, TypeScript는 컴파일러를 제공하여 코드를 미리 검증하기 때문에 개발 시간을 단축할 수 있습니다.
  • ES6+ 기능으로 최신 기술 활용: 최신 JavaScript 기능을 모두 지원하여 개발자가 최신 기술을 활용할 수 있습니다.
  • 커뮤니티 지원: 활발한 커뮤니티와 지속적인 기능 업데이트로 문제 해결이 빠르게 이루어집니다

 

TypeScript의 단점

  • 학습 곡선: JavaScript에 비해 추가적인 개념과 문법을 위한 학습이 필요하며, 타입 시스템과 관련된 복잡성이 증가할 수 있고, 동적 타입언어에 익숙한 개발자에게는 처음에 익숙하지 않을 수 있습니다.
  • 초기 설정의 복잡성: TypeScript는 독자적인 언어가 아니므로, 컴파일을 위한 초기 설정이 필요하며, 때로는 까다로울 수 있습니다.
  • 컴파일 시간 소요: TypeScript는 컴파일 과정을 거쳐 JavaScript로 변환해야 하기 때문에 큰 프로젝트의 경우 컴파일 시간이 오래 걸릴 수 있습니다.
  • 타입 정의의 번거로움: TypeScript에서는 타입 정의를 명시적으로 작성해야 하기 때문에 코드의 양이 증가할 수 있고 TypeScript를 처음 시작하는 개발자에게는 부담이 될 수 있습니다.
  • 타입 오버헤드: 타입 정의를 사용하면 코드의 길이가 늘어나고 복잡성이 증가할 수 있습니다. 때로는 타입을 정의하는 것이 오히려 코드의 가독성을 저하시킬 수 있습니다.
  • 라이브러리와의 호환성 문제: 일부 JavaScript 라이브러리나 프레임워크와의 호환성 문제가 발생할 수 있으며, 타입 정의 파일을 추가로 관리해야 할 수도 있습니다.
  • 일부 브라우저 미지원: 일부 브라우저에서는 TypeScript를 지원하지 않을 수 있습니다. 따라서 TypeScript를 사용할 때는 해당 브라우저의 지원 여부를 확인해야 합니다.

TypeScript 활용 방법

· 타입 정의와 유연한 개발

실제 프로젝트에서는 TypeScript의 강력한 타입 시스템을 활용하여 코드의 안정성을 높일 수 있습니다. 타입 정의를 통해 함수나 클래스의 매개변수 및 반환 값의 타입을 명시함으로써 코드를 이해하기 쉽고 예상치 못한 에러를 방지할 수 있습니다.

function calculateTotal(price: number, quantity: number): number {
    return price * quantity;
}

let totalPrice: number = calculateTotal(10, 5);

 

 

· 인터페이스와 클래스 활용

실제 프로젝트에서는 객체 지향 프로그래밍의 장점을 살려 인터페이스와 클래스를 적극적으로 활용할 수 있습니다. 인터페이스를 사용하여 객체의 형태를 정의하고 클래스를 사용하여 구현할 수 있습니다.

interface Product {
    id: number;
    name: string;
    price: number;
}

class ShoppingCart {
    items: Product[] = [];

    addItem(item: Product) {
        this.items.push(item);
    }

    getTotal(): number {
        return this.items.reduce((total, item) => total + item.price, 0);
    }
}

let cart = new ShoppingCart();
cart.addItem({ id: 1, name: "Keyboard", price: 50 });
cart.addItem({ id: 2, name: "Mouse", price: 30 });

let total = cart.getTotal();
console.log("Total Price:", total);

 

 

· 제네릭 활용

제네릭을 사용하여 함수나 클래스를 보다 유연하게 작성할 수 있습니다. 제네릭을 활용하면 재사용 가능한 컴포넌트를 만들거나 다양한 타입의 데이터를 다룰 수 있습니다.

function reverse<T>(items: T[]): T[] {
    return items.reverse();
}

let numbers: number[] = [1, 2, 3, 4, 5];
let reversedNumbers = reverse(numbers);

let strings: string[] = ["apple", "banana", "cherry"];
let reversedStrings = reverse(strings);

console.log("Reversed Numbers:", reversedNumbers);
console.log("Reversed Strings:", reversedStrings);

 

 

· TypeScript와 라이브러리의 결합

실제 프로젝트에서는 다양한 라이브러리를 활용하여 개발을 진행합니다. TypeScript는 이러한 라이브러리와 함께 사용할 수 있으며, 타입 정의 파일을 통해 라이브러리의 타입 정보를 활용할 수 있습니다.

예를 들어, React와 TypeScript를 함께 사용하기도 하는데, JavaScript의 약한 타입으로 인한 오류를 줄이고, IDE 지원 부족 문제를 해결하기 위해 TypeScript를 React 프로젝트에 사용합니다.
React 프로젝트에서는 @types/react 패키지를 설치하여 React 라이브러리의 타입 정보를 제공받을 수 있습니다.

npm install @types/react


그리고 TypeScript 파일에서 React를 사용할 때 다음과 같이 타입을 지정할 수 있습니다.

import React, { useState } from 'react';

interface Props {
    initialValue: number;
}

const Counter: React.FC<Props> = ({ initialValue }) => {
    const [count, setCount] = useState<number>(initialValue);

    const increment = () => setCount(count + 1);
    const decrement = () => setCount(count - 1);

    return (
        <div>
            <button onClick={increment}>Increment</button>
            <button onClick={decrement}>Decrement</button>
            <p>Count: {count}</p>
        </div>
    );
};

export default Counter;

 

 

추가 고려 사항

  • 라이브러리와 프레임워크: 사용 중인 JavaScript 라이브러리나 프레임워크가 있다면, 해당 라이브러리의 TypeScript 타입 정의를 찾거나 직접 작성해야 할 수 있습니다.
  • 빌드 도구 설정: TypeScript를 사용하는 경우, Webpack, Rollup 등의 빌드 도구와 함께 사용하는 것이 일반적입니다. 이러한 도구를 설정하여 TypeScript 파일을 컴파일하고 번들링하는 과정을 자동화할 수 있습니다.

 

TypeScript 적용 프로젝트

  • 금융 서비스 애플리케이션: TypeScript의 정적 타입 시스템은 사용자의 민감한 금융 정보를 처리하는 코드의 안전성을 높이는 데 도움이 됩니다. 예를 들어, 사용자 잔액 정보를 다루는 클래스에 타입 가드를 적용하여 외부에서의 무분별한 수정을 방지할 수 있습니다.
  • 교육 플랫폼: 학생들이 실제 프로젝트 코드를 분석하고 가변성 문제를 타입 가드로 해결하는 방법을 배울 수 있는 교육 과정에서 TypeScript를 활용합니다. 이를 통해 학생들은 다양한 상황에서 타입 가드를 적용하는 방법을 배우게 됩니다.
  • 웹 및 데스크톱 애플리케이션: TypeScript는 웹 애플리케이션뿐만 아니라 데스크톱 애플리케이션 개발에도 사용됩니다. 예를 들어, Microsoft는 Outlook Web의 개발에 TypeScript를 사용하여 개발 생산성을 향상시켰으며, Slack은 TypeScript를 사용하여 크로스 플랫폼 웹 및 데스크톱 앱을 개발했습니다.
  • 프론트엔드 및 백엔드 개발: TypeScript는 Angular, React, Vue.js와 같은 프론트엔드 프레임워크뿐만 아니라 Node.js를 포함한 백엔드 개발에도 널리 사용됩니다. 이를 통해 개발자는 코드의 명확성과 유지관리를 향상시킬 수 있습니다.
  • 대규모 애플리케이션 개발: TypeScript의 정적 타입 지정과 객체 지향 프로그래밍 기능은 대규모 애플리케이션의 개발 및 유지보수에 매우 유용합니다. 코드의 구조를 체계적으로 관리할 수 있으며, 오류를 사전에 발견하고 수정할 수 있어 개발 효율성이 증가합니다.

참조(Reference)

댓글