(NestJS-기초강의) 4. Typescript

앞 선 글과 마찬가지로 NestJS를 배우기에 앞서 사전지식을 학습하는 포스팅입니다.

Nest 는 Typescript를 기본 언어로 채택하고 있습니다. 따라서 nestjs를 통해 개발을 시작하기 전에 Typescript 문법에 대한 기본적인 이해가 필요합니다. 본 포스팅을 통해 Typescript의 개요와 기본적인 문법에 대해 알아보고 Decorator를 통해 어떻게 코딩하는지도 알아 봅시다.

Typescript란?

개요

Typescript는 Microsoft에서 개발한 언어로 Javascript의 SuperSet입니다.

Javascript 코드에 타입 시스템을 확장하여 코드의 런타임 에러 가능성을 정적 분석을 통해 찾아줍니다.

이러한 정적분석을 통해 컴파일 하지 않아도 VS Code 같은 IDE에서는 코드상의 오류를 표시해줍니다.

장점

  1. 정적 타입 지원: TypeScript는 JavaScript에 없는 강력한 정적 타입 시스템을 제공합니다.
    이는 코드의 안정성을 향상시키고 에러를 사전에 방지할 수 있습니다.
  2. 유연성과 확장성: JavaScript의 모든 기능을 포함하면서, 추가적인 기능들을 제공하여 유연성과 확장성을 높여줍니다.
  3. 개발 생산성 향상: 타입 시스템을 이용하여 코드 작성 시 오류를 빠르게 발견하고 수정할 수 있어 개발 생산성을 향상시킵니다.
  4. 큰 커뮤니티와 지원: TypeScript는 큰 커뮤니티와 다양한 지원을 받고 있어, 문제 발생 시 해결책을 찾기 쉽습니다.
  5. 자동 완성 및 코드 어시스트: 강력한 IDE 지원으로 자동 완성 기능과 코드 어시스트를 통해 개발자의 작업을 도와줍니다.

단점

  1. 러닝 커브: JavaScript에 비해 TypeScript의 학습 곡선이 높을 수 있습니다.
    특히, 처음 사용하는 개발자들에게는 익숙해지는데 시간이 걸릴 수 있습니다.
  2. 추가 작업: TypeScript를 사용하면서 타입 정의에 추가적인 작업이 필요할 수 있습니다.
    코드 작성 시 타입을 명시적으로 지정해야 하는 경우가 있어 추가 작업이 필요합니다.
  3. 프로젝트 규모: 작은 규모의 프로젝트에서는 TypeScript의 이점을 충분히 누리기 어려울 수 있습니다.
    특히, 간단한 웹 페이지나 작은 프로젝트에서는 추가적인 타입 정의가 부담스러울 수 있습니다.
  4. 성능 문제: Typescript 컴파일 과정에서 추가적인 변환 작업이 필요하므로 런타임 성능에 영향을 줄 수 있습니다.

Typescript 기본 문법

코딩 컨벤션

StyleCategory
UpperCamelCaseclass / interface / type / enum / decorator / type parameters / component functions in TSX / JSXElement type parameter
lowerCamelCasevariable / parameter / function / method / property / module alias
CONSTANT_CASEglobal constant values, including enum values. See Constants below.
#identprivate identifiers are never used.

타입 (Types)

각종 Type들은 typeof 키워드를 이용하여 Instance의 타입을 확인할 수 있습니다

Primitive Types

다음 Primitive 타입들을 지원합니다.

typeof 결과설명할당 가능값
number숫자모든 숫자
string문자열모든 문자열
boolean불리언true, false
null값이 없음null
undefined값이 할당되지 않음undefined
array배열임의의 배열
tuple튜플고정된 길이와 타입의 배열
enum열거형열거형 값
any모든 타입모든 값
void값이 없음undefined
never절대 발생하지 않는 값없음
object객체객체
function함수함수
사용자 정의 타입

다음과 같이 interface와 사용자 정의 타입을 만들 수 있습니다.

interface User {
    name: string;
    age: number;
}

type Calculator = (x: number, y: number) => number; // Custom Type

let user: User = { name: 'Alice', age: 30 }; // Use interface
let add: Calculator = function(x, y) { return x + y; }; // Use Custom Type
Union 타입

여러 타입을 조합하여 타입을 정의할 수 있습니다.

type WorkStatus = "Plan" | "Working" | "Done";

변수 (Variable)

아래 형식으로 변수를 선언 및 정의 합니다.

[선언 키워드] [변수 이름]: 타입 = 값

선언 키워드는 다음과 같습니다.

키워드설명
let값이 재할당 가능한 변수를 선언합니다.
const한 번 할당된 값은 변경할 수 없는 상수를 선언합니다.
var이전 버전의 JavaScript에서 사용되었으나, ES6 이후에는 let과 const가 권장됩니다.
함수 범위를 가지고 있습니다.

함수 (Function)

아래와 같이 함수를 선언 및 정의합니다.

function functionName(arg1: type, arg2: type, ...): returnType {
    // implement of this function
    return returnValue;
}

매개변수는 변수이름 뒤에 ?를 붙여서 선택적으로 넘겨줄수도 있고, 타입 뒤에 = value 를 통해 기본 값을 넣어줄 수 도 있으며, 매개변수 앞에 ...을 붙여서 가변적인 수의 매개변수를 배열형태로 받을 수 있다.

클래스(Class)

다음과 같이 Typescript에서 Class를 선언하여 사용할 수 있습니다.

class ClassName {
    a: type;

    constructor(b: type) {
        this.a = b;
    }

    mothodName() {
        // implement of mthodName()
    }
}

모듈 및 의존성 주입 (DI)

모듈

코드를 구성하는 각 부분을 분리하고 재사용 가능한 요소로 만드는 것으로 모듈을 사용하면 코드를 논리적으로 나눌수 있고, 필요한 곳에서 모듈을 불러와 사용할 수 있습니다.

의존성 주입 (DI, Dependency Injection)

의존성 주입은 코드 내에서 객체가 직접 생성하는 대신, 외부에서 필요한 객체를 주입받아 사용하는 디자인 패턴입니다. 이로써 모듈성과 유연성이 향상되며, 코드 테스트가 더 수월해집니다.

예제

export interface User {
  id: number;
  name: string;
  email: string;
}

export function getUserByID(id: number): User {
  // 여기에서 실제로 데이터베이스에서 사용자 정보를 가져오는 코드가 있을 수 있습니다.
  const user: User = {
    id: insfamworld,
    name: 'denv',
    email: 'devitworld@example.com'
  };
  return user;
}

NestJS에서의 DI는 DI Container를 사용함에 있어 다소 차이가 있지만 이는 이후에 다루도록 하겠습니다.

제네릭(Generic)

함수, 클래스, 인터페이스 등을 정의할 때 타입을 파라미터화하는 방법입니다.

이를 통해 여러 종류의 타입에 대해 작업할 수 있는 코드를 작성할 수 있습니다.

타입을 동적으로 지정하면서 코드의 재사용성과 유연성을 높일 수 있습니다.

예제)

function identity<T>(arg: T): T {
    return arg;
}

let output = identity<string>('hello'); // 제네릭 함수 호출

참고링크

Leave a Comment