본문 바로가기
타입스크립트

Typescript 공부하기 9일차 (2022.10.24)

by 개발자A입니다 2022. 10. 25.

0. Node.js에서의 타입스크입트

1. node.js 웹앱 프레임워크 Express소개

1) express(가장 널리쓰임)란?

   - Node.js 기반의 웹 어플리케이션 프레임워크

   - 웹 어플리케이션을 만들기 쉽게 해주는 기능과 구조를 제공

   - 이외에도 fastify(퍼포먼스 우수)나 koa 등 다양한 웹 어플리케이션 프레임워크 존재

 

  2) express: 예제

// src/app.js

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
	res.send('Hello World');
});

app.listen(port, () => {
	console.log('Example app listening at http://localhost:${port}');
});

 

3) express: Router

   - REST API에서의 URI: 웹 리소스 또는 인터페이스의 경로 표현

   - express에서의 라우터는 애픙이케이션 앤드 포인트(URI)를 정의하고

   - 클라이언트가 어떤 경로로 요청했느냐에 따라 다른 코드를 실행

 

4) express: Middleware

   - express의 미들웨어는 함수

   - 요청과 응답 사이에서 요청이나 응답을 변경

   - 에러가 났을 때 에러 응답을 보내거나 응답을 종료

   - 미들웨어는 요청과 응답 사이에 존재(그래서 next를 사용해야 함)

 

5) express 아키텍쳐: 3계층 설계

   - [1] > [2] > [3]

   - [1]: controller layer - 들어오는 요청을 service 클래스에 라우팅

   - [2]: service layer - 비즈니스 로직을 갖고 있는 서비스 클래스 CLI와 같은 스탠드얼론(독립형) 어플리케이션에서는 독자적으로 쓰일 수 있음

   - [3]: persistent layer - DB나 웹/앱 스토리지 같이 영구히 데이터를 저장할 수 있는 계층

   - 나누어야하는 이유: controller layer나 persistent layer가 다른 것으로 변경되어도 서비스 레이어의 비즈니스 로직이 그대로라면 변경된 레이어만 교체해주면 되기 때문

 

2. 자바스크립트 + Express로 커피 주문 앱 개발하기

1) 프로젝트 구조

   - [src]

      ㅏ app.js : 서버를 시작하는 메인 파일

      ㅏ [middlewares]

       |   ㄴ errorMiddleware.js : 에러를 핸들링하는 미들웨어

      ㅏ [routers] : app으로 들어오는 요청을 라우팅해주는 파일

       |.  ㅏmenuRouter.js 

       |    ㄴ orderRouter.js

       ㄴ [services] : 라우팅되는 요청들을 핸들링하는 코드

            ㅏ CoffeeMenuService.js

             ㄴ OrderServide.js

 

3. 자바스크립트에서 타입스크립트로 마이그레이션

1) 마이그레이션 순서

   - [1] 트랜스파일링할 디렉터리 정하기

   - [2] tsconfig.json 작성하기

   - [3] babel을 사용한 es6 이상의 문법 지원

   - [4] 확장자명을 *.js -> *.ts로 변경

   - [5] 오류제거: 타입 추가하기

   - * 만약 src 외에 다른 폴더가 있다면, 그리고 서로 다른 트랜스 파일 결과가 필요하다면 각폴더에 tsconfig.json 위치시키기

   - [6] tsconfig.json 파일 생성

      ㄴ npm i -g typescript

      ㄴ tsc --init

 

2) babel과 함께 사용

   - babel vs tsc

   - tsc: 타입스크립트 파일과 트랜스파일링될 자바스크립트 파일이 타이핑되는 것을 빼고는 동일

   - (ECMAScript 버전 신경 안쓰고 common.js방식의 require/export방식 사용 등)

   - babel: 자바스크립트 파일을 원하는 형태로 트랜스파일링

   - (esm방식의 import/export, 개발시에는 es6 이상의 자바스크립트 버전을 사용하고 결과물은 es5 버전을 원할 때 등)

 

3) babel과 함게 사용하기: 패키지 설치

   - 프로그램이 실행되기 전 컴파일 단걔에서 사용될 라이브러리들이므로 devDependencies로 설치

   - @babel/cli: cli에서 babel 명령어를 사용할 때 필요

   - @babel/core: 트랜스파일링 하는데 사용되는 주요 코드들이 담긴 라이브러리

   - @babel/plugin-transform-runtime: 폴리필이 필요할 때 바벨 내부의 헬퍼 함수 사용하게 해주는 라이브러리

   - @babel/preset-env: 바벨 플러그인들을 합쳐놓은 번들파일

   - @babel/preset-env-typescript: 타입스크립트 환경을 위함 플러그인들을 합친 번들 파일

 

4) babel과 함게 사용하기: babel.config.js 파일 작성

   - tsconfig.jspn의 compilerOption에서 isolatedModules옵션을 true로 설정

   - 타입을 export해서 값처럼 쓰는 등, babel이나 swc등의 트랜스파일러를 사용했을 때 트랜스 파일러가 잘못 사용되는 것을 방지

4. Node.js 프레임워크 Nest.js소개

1) nest.js 소개

   - express나 fastify에서 사용가능한 platform agnostic(플랫폼 비종속적) 프레임워크

   - 다양한 서버 개발가능(graphQL, REST, CLI, MVC)

   - Angular에 영향을 받은 깔끔하고 견고한 아키텍쳐

   - TS, jest, lint, code generator cli지원

   - 다양한 플러그인(testing, swagger, etc)

 

2) nest.js 구조

   - 모듈을 조칩 추가할 수 있음

   - 모듈끼리 의존할 수 있으며, 전체 모듈을 아우르는 모듈을 만들 수도 있음

 

3) nest.js 설계 패턴

   - Dependency injection

   - 의존하는 클래스를 자신의 생성자 함수에서 생성하지 않고, 외부에서 인스턴스를 주입받는 형태로 변경

   - 여러 인스턴스가 생기지도 않고, 주입하기 전 인스턴스화 할 때만 변경된 생성 로직을 작용하면 됨

 

4) 데코레이터(injectable, inject)

   - nest.js에서는 dependency injection을 데코레이터를 통해서도 가능

   - 데코레이터를 사용함으로써 생성 로직을 작성하는데 드는 비용을 절감

 

5. Nest.js로 커피 주문앱 개발하기

1) 프러젝트 생성 & 실행

   - [1] nest.js cli 설치 - npm i -g @nestjs/cli

   - [2] 프로젝트 생성 - nest new 프로젝트이름

   - [3] 프로젝트 실행 - yarn start

 

2) 프로젝트 구조

   - ㅏ README.md

      ㅏ nest-cli.json : nest-cli에 대한 설정파일

      ㅏ package.json

      ㅏ [src]

       |   ㅏ app.controller.spec.js : 

       |   ㅏ app.controller.js : AppModule에 들어오는 요청을 라우팅

       |   ㅏ app.module.js : 

       |   ㅏ app.service.js : 라우팅되는 요청을 핸들링하는 코드, 비즈니스 로직이 들어가는 코드

       |   ㅏ main.js : 서버를 시작하는 메인 파일

      ㅏ [test]

       |   ㄴ app.e2e-spec.ts

       |   ㄴ jest-e2e.json

      ㅏ tsconfig.build.json : nest에서 코드를 build할 때 사용하는 tsconfig 설정 파일. 없으면 nest에서 build할 때 오류 발생

      ㅏ tsconfig.json

       ㄴ yarn.lock

 

3) express와 차이점

   - 아키텍쳐에 대한 고민들 하지않아도 된다.

   - 의존성 주입이 간편

   - ts 지원, jest, eslint, prettier 등 기본설정이 다 되어있다.

   - espress 또는 fastify를 유연하게 선택할 수 있다.

 

6. Nest.js에서 타입스크립트를 유용하게 사용하기

1) 파라미터 데토레이터로 validation

   - nest.js의 custom decorator로 간편하게 구현 가능

   - ts에서 파라미터 벨리데이션을 하려면 reflect-data라이브러리를 사용하여 parameter decorator와 method decorator를 정의하여 함께 사용했어야한다.

 

2) custom provider: non-class-based provider tokens

   - interface를 만들어서 class에서 implements하고 해당 interface를 주입하고 싶은 경우 사용

   - interface는 js파일로 트랜스파일링 되면 없어지는 타입

   - 값으로 쓰일수 있는 토큰(문자열, 심볼)을 사용해 대신 주입