상세 컨텐츠

본문 제목

NestJS 기본 구조 part-1

프레임워크/NestJS

by A_D 2024. 11. 22. 15:00

본문

반응형

1 웹 프레임워크
2 Node.js
3 이벤트 루프
4 패키지 의존성 관리
    4.1 package.json

    4.2 package-lock.json

    4.3 package.json 파일 분석
5 타입스크립트
    5.1 변수 선언

    5.2 타입스크립트에서 지원하는 타입
    5.3 타입 정의하기

    5.4 타입 구성하기
6 데커레이터
    6.1 데커레이터 합성

    6.2 클래스 데커레이터

    6.3 메서드 데커레이터
    6.4 접근자 데커레이터

    6.5 속성 데커레이터

    6.6 매개변수 데커레이터
    6.7 데커레이터 요약

 

 

1 웹 프레임워크
웹 프레임워크는 서버 측 애플리케이션 개발을 도와주는 툴입니다. 개발자들이 표준화된 구조와 도구를 활용하여 빠르고 효율적으로 애플리케이션을 구축할 수 있도록 돕습니다. Express, Koa, NestJS와 같은 JavaScript 기반 웹 프레임워크는 Node.js 환경에서 사용되며, MVC 패턴, 라우팅, 미들웨어 등을 지원하여 복잡한 작업을 단순화합니다.

 

예시: Express.js를 사용한 기본 서버 설정

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

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

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});


2 Node.js
Node.js는 JavaScript를 서버 측에서 실행할 수 있게 하는 런타임 환경입니다. 비동기 이벤트 기반 모델을 채택하여 고성능 서버를 구축하는 데 적합하며, I/O 집약적인 애플리케이션에 특히 강력한 장점을 제공합니다. npm(Node Package Manager)을 통해 다양한 패키지를 설치하고 관리할 수 있어 생산성을 높입니다.

 

예시: 비동기 파일 읽기

const fs = require('fs');

fs.readFile('example.txt', 'utf-8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});



3 이벤트 루프
Node.js의 이벤트 루프는 비동기 작업을 처리하는 메커니즘입니다. 콜백 함수, 프로미스, async/await 등이 이벤트 루프의 일부로 동작합니다. 작업은 이벤트 큐에서 대기하며, 싱글 스레드에서 실행되므로 성능 효율성이 뛰어납니다. 이는 Node.js가 논블로킹(non-blocking) I/O를 구현할 수 있는 핵심 요소입니다.

 

예시: 비동기 작업과 이벤트 루프

console.log('Start');

setTimeout(() => {
  console.log('Timeout');
}, 0);

console.log('End');

출력:

Start
End
Timeout


4 패키지 의존성 관리
Node.js 프로젝트에서 패키지 의존성을 관리하는 방법으로 package.json과 package-lock.json 파일이 활용됩니다.

4.1 package.json
프로젝트의 메타데이터와 의존성을 정의한 파일입니다.
버전 정보, 스크립트, 저작자, 라이선스 등이 포함됩니다.
npm init 명령어로 생성됩니다.

 

{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}


4.2 package-lock.json
설치된 의존성의 정확한 버전 정보를 기록합니다.
팀 간 동일한 환경을 재현하는 데 유용합니다.
자동으로 생성되며, 수동으로 수정하지 않는 것이 권장됩니다.
4.3 package.json 파일 분석
dependencies: 애플리케이션이 실행되는 데 필요한 패키지.
devDependencies: 개발 시에만 필요한 패키지.
스크립트, 키워드 등 각 섹션의 역할을 세부적으로 이해해야 합니다.

 

5 타입스크립트
TypeScript는 JavaScript에 정적 타입을 추가한 언어로, 더 안전하고 유지보수 가능한 코드를 작성할 수 있습니다.

5.1 변수 선언
let, const를 사용하며, 변수의 타입을 명시적으로 선언할 수 있습니다.
타입 추론 기능도 제공하여 개발 편의성을 높입니다.

 

let age: number = 25;
const name: string = 'John';


5.2 타입스크립트에서 지원하는 타입
기본 타입: number, string, boolean 등.
복합 타입: array, tuple, enum, interface 등.

 

let numbers: number[] = [1, 2, 3];


5.3 타입 정의하기
type과 interface를 사용해 사용자 정의 타입을 작성할 수 있습니다.
재사용 가능한 구조를 정의하여 코드의 가독성과 유지보수성을 향상합니다.

 

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

const user: User = { name: 'Alice', age: 30 };


5.4 타입 구성하기
유니온 타입(|), 인터섹션 타입(&)을 사용하여 복합적인 타입을 생성합니다.
Partial, Pick과 같은 유틸리티 타입도 제공됩니다.

 

type Status = 'success' | 'error';
let response: Status = 'success';

 

6 데커레이터
데커레이터는 클래스와 클래스 멤버에 기능을 추가하는 데 사용되는 특수한 문법입니다. 메타프로그래밍을 지원하며, Angular와 NestJS 같은 프레임워크에서 필수적으로 사용됩니다.

6.1 데커레이터 합성
여러 데커레이터를 결합하여 사용합니다.
위에서 아래로 평가되고, 아래에서 위로 실행됩니다.

 

function Logger() {
  return function (target: any) {
    console.log(`Class ${target.name} was created`);
  };
}

function Timestamp() {
  return function (target: any) {
    console.log(`Timestamp: ${Date.now()}`);
  };
}

@Logger()
@Timestamp()
class MyClass {}


6.2 클래스 데커레이터
클래스 자체에 적용되는 데커레이터입니다.
예: 로깅, DI(Container) 등록.

 

function Logger(target: Function) {
  console.log(`${target.name} is loaded`);
}

@Logger
class User {}


6.3 메서드 데커레이터
클래스의 메서드에 동작을 추가합니다.
예: 메서드 실행 전후 로깅.

 

function LogExecutionTime(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function (...args: any[]) {
    const start = Date.now();
    const result = originalMethod.apply(this, args);
    console.log(`${propertyKey} executed in ${Date.now() - start}ms`);
    return result;
  };
}

class Example {
  @LogExecutionTime
  calculate() {
    // some heavy computation
    return 42;
  }
}


6.4 접근자 데커레이터
클래스 속성의 getter와 setter에 적용됩니다.
예: 데이터 유효성 검사.

 

function LogAccessor(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  console.log(`Accessor for ${propertyKey} is defined`);
}

class Example {
  private _value: number = 0;

  @LogAccessor
  get value() {
    return this._value;
  }

  set value(newValue: number) {
    this._value = newValue;
  }
}


6.5 속성 데커레이터
클래스 속성에 메타데이터를 추가합니다.
예: 데이터베이스 필드 매핑.

 

function Required(target: any, propertyKey: string) {
  console.log(`${propertyKey} is marked as required`);
}

class User {
  @Required
  name: string;
}


6.6 매개변수 데커레이터
메서드의 매개변수에 정보를 추가합니다.
예: HTTP 요청의 특정 값 바인딩.

 

function ParamLogger(target: any, methodName: string, paramIndex: number) {
  console.log(`Parameter at index ${paramIndex} in method ${methodName} is decorated`);
}

class Controller {
  getData(@ParamLogger id: number) {
    console.log(`Fetching data for ID: ${id}`);
  }
}


6.7 데커레이터 요약
데커레이터는 가독성을 높이고, 코드의 중복을 줄이는 데 도움을 줍니다.
올바른 사용법과 예제를 통해 효과적으로 사용할 수 있습니다.

반응형

댓글 영역