명품콜센터-인디고홀덤 전문
24시간 직통 : 010 9315 8976

명품콜센터-인디고홀덤 전문
24시간 직통 : 010 9315 8976

인디고게임-해외홀덤사이트에서 타입스크립트로…마이그레이션 실전 가이드

인디고게임-해외홀덤사이트가 자바스크립트의 타입 안전 대안으로 점차 인기를 얻고 있다. 자바스크립트 코드베이스르를 강한 타입의 타입스크립트로 점진적으로 전환하는 방법을 알아보자.

인디고게임-해외홀덤사이트의 변형인 타입스크립트는 강한 타입 정보를 제공하며, 버그를 최소화하고 엔터프라이즈 환경에서 자바스크립트 프로그램을 더 쉽게 구축할 수 있게 해주는 강력한 개발 툴이다. 자바스크립트가 실행되는 모든 환경에서 동작하며 그 자체가 자바스크립트로 컴파일된다. 또한 기존의 모든 자바스크립트 프로그램은 타입스크립트가 제공하는 타입 정보만 없을 뿐, 이미 유효한 타입스크립트이기도 하다.

즉, 기존 자바스크립트 프로그램을 타입스크립트로 전환할 수 있다. 한꺼번에 할 필요도 없다. 기존 자바스크립트 코드를 전부 치우고 처음부터 다시 시작할 필요 없이 기존 자바스크립트 코드베이스를 조금씩 마이그레이션하면 된다. 물론 원한다면 아예 새로 시작해서 타입스크립트로 바로 코드를 작성해 모든 타입 검사 기능을 활용하는 것도 가능하다.

타입스크립트 컴파일러 설정
타입스크립트는 자바스크립트와는 완전히 별개의 프로젝트이므로 타입스크립트가 제대로 작동하도록 하기 위해서는 자체 컴파일러를 포함해야 한다.

타입스크립트를 설정하려면 Node.js와 npm이 필요하다.

npm install -g typescript
자바스크립트 생태계의 다른 프로젝트를 타입스크립트와 함께 사용할 수도 있다. 예를 들어 번(Bun)은 타입스크립트 컴파일러를 자동으로 번들로 포함하므로 따로 설치할 필요가 없다. 데노(Deno) 런타임 역시 타입스크립트를 기본적으로 지원한다. 만일 이러한 프로젝트로 전환하려고 이미 생각 중이었다면 더더욱 타입스크립트를 사용하지 않을 이유가 없다.

타입스크립트를 자바스크립트로 컴파일하기
기존 자바스크립트를 타입스크립트로 컴파일하는 가장 기초적인 방법은 자바스크립트 코드에 대해 그냥 타입스크립트 컴파일러를 실행하는 것이다.

tsc myfile.ts
타입스크립트 파일은 파일 확장자로 .ts를 사용한다. 컴파일러를 거치면 같은 위치에서 같은 이름의 .js 파일로 변환된다.

이 방법은 일회성 작업에는 괜찮지만 실제로는 전체 프로젝트 디렉토리의 파일을 컴파일해야 하는 경우가 대부분이다. 이 작업을 번거롭지 않게 수행하려면 타입스크립트 컴파일러에서 작동하도록 프로젝트를 위한 간단한 구성 파일을 작성해야 한다.

타입스크립트의 구성 파일은 일반적으로 tsconfig.json이라는 이름으로 프로젝트의 루트 디렉토리에 위치한다. 간단한 tsconfig.json의 예를 들면 다음과 같다.

{
“compilerOptions”: {
“outDir”: “./jssrc”,
“allowJs”: true,
“target”: “es6”,
“sourceMap”: true
},
“include”: [“./src/*/“]
}
첫 번째 섹션인 compilerOptions은 컴파일러에 컴파일된 파일을 출력할 위치를 알려준다. “outDir”: “./jssrc”는 생성된 모든 .js 파일이 jssrc라는 디렉토리에 저장된다는 뜻이다(jssrc는 “JavaScript source”를 나타내지만 자신의 프로젝트 레이아웃에 맞는 아무 이름이나 사용하면 됨). 또한 일반 자바스크립트 파일을 입력으로 허용한다고 명시돼 있으므로(“allowJs”: true) src 폴더에서 자바스크립트와 타입스크립트 파일을 자유롭게 혼합해 사용할 수 있다.

outDir을 지정하지 않으면 자바스크립트 파일은 소스 디렉토리에 있는 상응하는 타입스크립트 파일과 나란히 저장되는데, 여러가지 이유로 이러한 구조를 피하고 싶을 수도 있다. 예를 들어 쉽게 정리할 수 있도록 별도의 디렉토리에 생성된 파일을 보관하고자 할 수 있다.

어떤 ECMAScript 표준으로 컴파일할 것인지도 구성 파일에 정의할 수 있다. “target”: “es6″은 ECMAScript 6을 사용한다는 의미다. 현재 대부분의 자바스크립트 엔진과 브라우저가 ES6를 지원하므로 기본값으로 괜찮다. “sourceMap”을 true로 지정하면 모든 자바스크립트 파일과 함께 디버깅을 위해 .js.map 파일이 생성된다.

마지막으로, include 섹션은 처리할 소스 파일을 찾을 위치에 대한 glob 패턴을 제공한다.

tsconfig.json에는 이 외에도 많은 옵션이 있지만 위에 언급한 몇 가지만으로도 실행하기에는 충분할 것이다.

tsconfig.json을 설정하고 나면 프로젝트 루트에서 tsc를 실행하고 outDir에서 지정한 디렉토리에 파일을 생성할 수 있다.

지금 사용 중인 자바스크립트 기반 프로젝트의 복사본을 만들어 하나 이상의 .ts 확장자 파일을 포함해 직접 설정해 볼 것을 권한다. 다른 요소와 충돌하지 않는 outDir을 지정해야 한다. 이렇게 하면 컴파일러에 의해 빌드된 변경된 파일이 기존 파일을 건드리지 않으므로 기존 작업을 손상시키지 않고 실험할 수 있다.

기존 코드에 타입스크립트 타입 주석 추가하기
컴파일러를 설정했다면 그 다음으로 할 일은 기존 코드를 타입스크립트로 마이그레이션하는 것이다.

기존의 모든 자바스크립트 파일은 이미 유효한 타입스크립트이므로 기존 .js 파일의 이름을 .ts로 바꾸는 방식으로 한 번에 한 파일씩 점진적으로 진행할 수 있다. 자바스크립트 파일에 타입 정보 또는 기타 타입스크립트 관련 구문이 없으면 타입스크립트 컴파일러는 해당 파일에 대해 아무 작업도 수행하지 않으며, 코드에 타입스크립트에 해당하는 요소가 있는 경우에만 코드를 면밀히 살펴보기 시작한다.

타입스크립트 주석을 시작하는 방법 중 하나는 함수 시그니처와 반환 타입에 주석을 추가하는 것이다. 다음은 타입 주석이 없는 자바스크립트 함수로, .firstName과 .lastName 속성이 있는 객체를 기반으로 해서 성이 앞에 오는 형식으로 사람 이름을 생성한다.

function lastNameFirst(person) {
return ${person.lastName}, ${person.firstName};
}
타입스크립트에서는 무엇이 허용되고 반환되는지에 대한 부분을 훨씬 더 명시적으로 설정할 수 있다. 여기서는 인수와 반환 값에 대한 타입 주석만 제공한다.

function lastNameFirst(person: Person): string {
return ${person.lastName}, ${person.firstName};
}
이 코드는 이전 코드에서 정의된 Person이라는 객체 타입이 있다고 가정한다. 또한 자바스크립트와 타입스크립트 모두에서 기본적으로 제공되는 string 타입을 활용한다. 이러한 주석을 추가함으로써 이제 이 함수를 호출하는 모든 코드는 반드시 Person 타입의 객체를 제공해야 한다는 것을 보장하게 된다. 코드에서 이 함수를 호출하고 Person이 아닌 DogBreed를 제공한다면 컴파일러에서 다음과 같은 오류가 발생한다.

error TS2345: Argument of type ‘DogBreed’ is not assignable to parameter of type ‘Person’.
Type ‘DogBreed’ is missing the following properties from type ‘Person’: firstName, lastName
이 오류에 포함된 세부 정보의 좋은 점 중 하나는 단순히 올바른 타입이 아니라는 경고만이 아니라 특정 인스턴스에서 그 타입이 왜 작동하지 않는지에 대한 정보도 얻을 수 있다는 것이다. 당면한 문제를 해결하는 방법을 안내할 뿐만 아니라 사용 사례에 맞게 타입의 폭을 더 넓히거나 좁힐 방법에 대해서도 생각해 볼 수 있게 해준다.

인터페이스 선언
어떤 대상에 사용 가능한 타입을 설명하는 또 다른 방법은 인터페이스 선언을 통한 방법이다. 인터페이스는 어떤 대상을 완전히 정의하지 않고도 그 대상에서 무엇을 기대할 수 있는지를 설명한다. 예를 들면 다음과 같다.

interface Name {
firstName: string;
lastName: string;
}

function lastNameFirst(person: Name): string {
return ${person.lastName}, ${person.firstName};
}
이와 같은 경우 .firstName과 .lastName 속성을 갖고 있고 타입이 string이라는 조건을 충족한다면 어느 타입이든 원하는 대로 lastnameFirst()에 제공할 수 있다. 이 방식은 객체가 특정 타입인지 여부가 아니라 객체의 타입 형태(type shape)를 기반으로 타입을 만들 수 있게 해준다.

사용할 타입스크립트 타입 결정하기
자바스크립트 코드에 주석을 달아 타입스크립트를 생성할 때 적용하는 타입 정보는 대부분 개발자에게 익숙하다. 애초에 자바스크립트 타입에서 유래됐기 때문이다. 그러나 이와 같은 타입을 적용할 위치와 방법에 대해서는 신중한 판단이 필요하다.

일반적으로 리터럴에 대한 주석은 자동으로 추론이 가능하므로 제공할 필요가 없다. 예를 들어 name: string = “Davis”;는 중복적이다. 리터럴에 대한 할당에서 name이 string이 될 것임이 명확하기 때문이다(많은 익명 함수의 타입도 이 방식으로 추론이 가능).

프리미티브 타입(string, number, boolean)은 변수가 그 타입을 사용하고 자동으로 타입을 추론할 수 없을 때 변수에 적용할 수 있다. 타입 배열의 경우 타입 뒤에 []를 사용할 수 있다(예를 들어 숫자 배열의 경우 number[]). 또는 Array 구문을 사용할 수도 있다(이 경우 Array).

고유한 타입을 정의하려면 다음과 같이 type 키워드를 사용하면 된다.

type FullName = {
firstName: string;
lastName: string;
};
이는 다시 해당 타입 형태와 일치하는 객체를 생성하는 데 사용할 수 있다.

var myname:FullName = {firstName:”Brad”, lastName:”Davis”};
그러나 다음과 같은 경우에는 오류가 발생한다.

var myname:FullName = {firstName:”Brad”, lastName:”Davis”, middleName:”S.”};
오류의 원인은 middleName이 타입에 정의되어 있지 않다는 것이다.

| 연산자를 사용해서 어떤 대상의 타입이 가능한 여러 타입 중 하나일 수 있음을 나타낼 수 있다.

type userName = Fullname | string;

// or we can use it in a function signature …

function doSomethingWithName(name: Fullname|string) {…}
기존 타입을 합성해서 새로운 타입(“교차” 타입)을 만들려면 다음과 같이 & 연산자를 사용하면 된다.

type Person = {
firstName: string;
lastName: string;
};
type Bibliography = {
books: Array;
};

type Author = Person & Bibliography;

// we can then create an object that uses fields from both types:

var a: Author = {
firstName: “Serdar”, lastName: “Yegulalp”, books:
[“Python Made Easy”, “Python Made Complicated”]
};
타입을 사용해서 이 작업을 할 수 있지만, 이와 비슷한 작업을 인터페이스를 통해서 하고 싶다면 다른 접근 방식을 사용해야 한다. 예를 들어 다음과 같이 extends 키워드를 사용한다.

interface Person {
firstName: string;
lastName: string;
}

interface Author extends Person {
penName: string;
}
자바스크립트 클래스도 타입으로 인정된다. 타입스크립트에서는 타입 주석을 사용해서 클래스를 있는 그대로 사용할 수 있다.

class Person {
name: string;
constructor(
public firstName: string,
public lastName: string
) {
this.firstName = firstName;
this.lastName = lastName;
this.name = ${firstName} ${lastName};
}
}
타입스크립트에는 다른 경우를 처리하기 위한 특수 타입도 몇 가지 있다. any는 말 그대로 어느 타입이든 허용된다는 것을 의미한다. null과 undefined의 의미는 일반 자바스크립트에서 사용될 때와 동일하다. 예를 들어 string|null을 사용해서 문자열 또는 null 값이 되는 타입을 나타낼 수 있다.

또한 타입스크립트는 기본적으로 ! 후위 연산자를 지원한다. 예를 들어 x!.action()은 타입스크립트에서 x가 null 또는 undefined가 아닌 한 x에서 .action()이 호출될 것을 보장한다.

타입 표현식에 대해 특정 시그니처가 있는 함수를 참조하려면 “호출 시그니처”를 사용하면 된다.

function runFn(fn: (arg: number) => any, value: number): any {
return fn(value);
}
runFn은 하나의 숫자를 인수로 받아서 임의의 값을 반환하는 함수를 허용한다. runFn은 이러한 함수와 숫자 값을 받은 다음 해당 값으로 함수를 실행한다.

참고로 메인 함수 시그니처에서 콜론을 사용하는 것과 달리, 여기서는 전달된 함수가 무엇을 반환하는지를 나타내기 위하 화살표 주석을 사용한다.

타입스크립트 프로젝트 빌드하기
자바스크립트 생태계의 많은 빌드 툴이 이제 타입스크립트를 인식한다. 예를 들어 tsdx, 앵귤러, 네스트와 같은 프레임워크는 타입스크립트 코드베이스를 자바스크립트 코드로 알아서 변환할 수 있다. 이 과정에서 사람의 개입이 필요한 경우는 거의 없다.

바벨(Babel), 웹팩(webpack) 등의 빌드 툴에서도 타입스크립트 처리를 확장 기능으로 설치하거나 수동으로 활성화하면 타입스크립트 프로젝트를 다룰 수 있다. 예를 들어 웹팩의 경우 npm을 통해 ts-loader 패키지를 설치한 다음 webpack.config.js 파일을 설정해서 .ts 파일을 포함하도록 하면 된다.

기존 자바스크립트 프로젝트를 타입스크립트로 옮기기 위한 핵심은 한 번에 한 단계씩 접근하는 것이다. 한 번에 하나의 모듈, 그 다음에는 한 번에 하나의 함수를 마이그레이션한다. 타입스크립트는 일반 자바스크립트와 공존할 수 있으므로 모든 부분을 한꺼번에 마이그레이션할 필요가 없다. 프로젝트 코드베이스에서 사용할 최적의 타입을 시간을 두고 천천히 알아보면 된다.

Share the Post:

관련기사보러가기

대한민국 NO.1 홀덤사이트를 소개하는 명품콜센터입니다.

저희 명품콜센터는 검증되고 안전한 사이트만을 소개하는 곳입니다