IT Study/JavaScript

[NestJS] Nest.js 시작하기

짹짹체유 2024. 1. 7. 15:03

 

Nest JS란?

 

Node.js 기반의 Express와 같은 서버 개발 프레임워크 중 하나이다.

Nest.js는 Express 위에 구축된 프레임워크로, Express의 기능을 확장해서 체계적이고 모듈화된 구조를 제공한다.

Express는 정해진 아키텍처가 없어서 개발자마다 다른 구조로 작성하는 경우가 많았다.

다른 사람들이 분석하는데 어려움이 있고 아키텍처부터 파악을 해야해서 코드의 가독성이 떨어진다.

또한 Nest.js는 TypeScript 언어 기반으로 작성이 되어있어서 정적 타입 검사, 객체지향 프로그래밍 등의 기능을 제공한다.

따라서 개발 단계에서의 버그들을 사전에 방지하고 코드의 재사용성과 유지 보수성을 높여준다.

 

Nest.js 시작

1. Nest.js 설치하기

npm i -g @nestjs/cli

 

 

2. project 생성 및 이동하기

nest new [project-name]

cd [project-name]

 

프로젝트를 생성할 때, shell에 npm, yarn ? 중에서 선택하라고 뜬다. -> 자유롭게 선택

(npm 선택한 경우) 실행할 때는 npm run start:dev

 

 

프로젝트를 생성하면 자동으로 기본 설정 파일들이 생성된다.

  • eslintrc.js: 개발자들이 특정 규칙을 가지고 코드를 깔끔하게 짤 수 있게 도와주는 라이브러리. 타입스크립트를 쓰는 가이드 라인, 문법에 오류 나면 알려주는 역할 등을 함
  • prettierrc: 코드 형식 맞추는데 사용. 작은 따옴표 or 큰 타옴표 / Indent 값 2 or 4 등. 에러를 찾는 것이 아닌 코드 포맷터 역할을 함
  • nest-cli.json: 기본적인 설정들
  • tsconfig.json: 어떻게 타입스크립트를 컴파일할지 설정
  • tsconfig.build.json: tsconfig.json의 연장선상의 파일. build 할 때 필요한 설정들을, “excludes”에는 빌드할 때 필요 없는 파일들을 명시

 

 

3. 모듈 / 컨트롤러 / 서비스 파일 생성하기

nest g module [module-name]

nest g controller [module-name] --no-spec

nest g service [module-name] --no-spec

 

--no -spec은 테스트를 위한 소스 코드를 생성하지 않겠다는 것이다.

 

Module

@Module ( ) 데코레이터로 주석이 달린 클래스.

각 응용 프로그램에는 하나 이상의 모듈(루트 모듈)이 있다.

루트 모듈은 Nest가 사용하는 시작점이다.

모듈은 밀접하게 관련된 기능 집합으로 구성 요소를 구성하는 효과적인 방법(기능별로 만듬)이다.

같은 기능에 해당하는 것들은 하나의 모듈 폴더 안에 넣어서 사용하고 공통된 모듈은 서로 공유 가능하다.

 

Controller

들어오는 요청을 처리하고 클라이언트에 응답을 반환

@Controller( ) 데코레이터로 클래스

Handler: @Get, @Post, @Delete 등과 같은 데코레이터로 장식 된 컨트롤러 클래스 내의 단순한 메서드

 

Service

@Injectable 데코레이터로 감싸져서 모듈에 제공한다.

서비스 인스턴스는 애플리케이션 전체에서 사용될 수 있다.

서비스는 컨트롤러에서 데이터의 유효성 체크를 하거나 DB에 아이템을 생성하는 등의 작업을 하는 부분을 처리한다.

 

 

 

4. TypeORM 설치하기

npm install pg typeorm @nestjs/typeorm --save

 

 

TypeORM을 사용할 때는 DB 테이블로 변환되는 Class로 클래스를 생성하고 그 안에 칼럼을 정의함

@Entity() 데코레이터 클래스는 Board 클래스가 엔티티임을 나타내는데 사용 → CREATE TABLE board 부분

@PrimaryGeneratedColumn() : id 열이 Board 엔티티의 기본 키 열임을 나타내는데 사용

@Column() : Board 엔티티의 title 및 description과 같은 다른 열을 나타내는데 사용

 

import {
  BaseEntity,
  Column,
  Entity,
  PrimaryGeneratedColumn,
} from 'typeorm';

@Entity()
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

 

 

반응형