[Nest.js][TIL] Nest.js 입문!

Trippy·2023년 12월 7일
0

Nest.js

목록 보기
1/15
post-thumbnail

내가 배우고 있는 교육의 커리큘럼의 반 이상을 배웠다.
현재는 node 심화 부분을 배우고 있는데 이 커리큘럼의 종착지는 typescript를 이용해서 Nest.js를 사용해서 궁극적으로 계층 아키택처를 사용해서 만드는 백엔드 서버 다루기 인 것 같았다.

현재 게임 만들기 프로젝트를 개인적으로 진행하려고 하고 있는데 보니까 Nest.js를 이용해서 서버를 구현하고 있었다. 그래서 나도 사용하려고 보니까 typescript를 기반으로 사용할 수 있는 프레임워크라고 배웠기 때문에 미리 배우고자 한다.

Nest.js란?

Nest는 효율적이고 확장 가능한 Node.js서버 측 에플리케이션을 구축하기 위한 프레임 워크 이다. 프로그레시브 Javascript를 사용하고 Typescript로 빌드되고 완벽하게 지원하며 OOP(객체 지향 프로그래밍), FP(함수 지향 프로그래밍) 요소를 사용할 수 있게 해준다.

내부적으로 Nest는 Express와 같은 강력한 HTTP 서버 프레임 워크를 사용하며 선택적으로 Express보다 상대적 속도가 빠른 Fastify를 사용하도록 구성 할 수도 있다!

Nest.js 공식 문서


먼저 Nest.js를 통해서 기본 세팅 파일을 구축하는 방법과 간단한 CRUD를 구현하면서 공부를 시작한다.

향후 pipe나 여러가지 라이브러리를 사용하고 적용하는 방법은 차차 배워야 할 것 이지만 백엔드의 가장 기본적인
CRUD API를 구현하는 것이 기본 소양 중 소양이라 생각함!

Nest JS CLI로 Nest.js 시작하기

npm i -g @nestjs/cli

nest new project-test

나는 npm 을 이용할 것 이기 때문에 npm을 선택할거지만 yarn을 사용할 사람은 yarn으로 사용하면 된다.

cli로 프로젝트를 시작하면 이렇게 자동으로 Nestjs가 세팅 해준다.

Nest JS 모듈이란?

모듈은 @Module() 데코레이터로 주석이 달린 클래스이다. Nest가 애플리케이션 구조를 구성하는 데 사용하는 메타 데이터를 제공한다.

각 응용 프로그램에는 하나 이상의 모듈(루트 모듈) 이 있다. 루트 모듈은 Nest가 사용하는 시작점이다.

모듈은 밀접하게 관련된 기능 집합으로 구성 요소를 구성하는 효과적인 방법이다.(기능별로 만듬)
같은 기능에 해당하는 것들은 하나의 모듈 폴더 안에서 넣어서 사용한다.

모듈은 기본적으로 싱글 톤이므로 여러 모듈간에 쉽게 공급자의 동일한 인스턴스를 공유할 수 있다.

모듈 생성하기

nest g module boards

생성한 boardModule을 사용학 위해서는 루트 모듈인 app.module.ts에 등록해주어야 한다.
하지만 이건 board모듈을 cli로 생성할 떄 자동으로 등록이 된다.

Controller 생성하기

컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환한다.

nest g controller boards --no --spec

참고로 --no --spec은 테스트를 위한 소스 코드 생성을 안하겠다는 뜻이다.

boardModule에 컨트롤러가 잘 등록되었다.

// src/boards.controller.ts
import {
    Body,
    Controller,
    Delete,
    Get,
    Param,
    Patch,
    Post,
    UsePipes,
    ValidationPipe,
} from '@nestjs/common';
import { BoardsService } from './boards.service';
import { Board, BoardStatus } from './boards.model';
import { CreateBoardDto } from './dto/create-board.dto';

@Controller('boards')
export class BoardsController {
    constructor(private boardsService: BoardsService) {}

    // 게시글 목록 조회
    @Get()
    getAllboard(): Board[] {
        return this.boardsService.getAllBoards();
    }
    // 게시글 생성
    @Post()
    @UsePipes(ValidationPipe)
    createBoard(@Body() createBoardDto: CreateBoardDto): Board {
        return this.boardsService.createBoard(createBoardDto);
    }
    // 게시글 상세 조회
    @Get(':id')
    getBoardById(@Param('id') id: string): Board {
        return this.boardsService.getBoardById(id);
    }
    // 게시글 삭제
    @Delete(':id')
    deleteBoard(@Param('id') id: string): void {
        this.boardsService.deleteBoard(id);
    }
    // 게시글 수정
    @Patch(':id/status')
    updateBoardStatus(
        @Param('id') id: string,
        @Body('status') status: BoardStatus,
    ) {
        return this.boardsService.updateBoardStatus(id, status);
    }
}

Provider, Service 생성하기

Provider란?

프로바이더는 nest의 기본 개념이다 대부분의 기본 nest 클래스는 서비스, 레포지토리, 팩토리, 헬퍼 등 프로바이더로 취급될 수 있다. 프로바이더의 주요 아이디어는 종속성으로 주입할 수 있다는 것이다.
즉, 객체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 "연결"하는 기능은 대부분 Nest 런타임 시스템에 위임될 수 있다.

Service란?

서비스는 소프트웨어 개발내의 공통 개념이며, NestJs, Javascript에서만 쓰이는 개념이 아니다.
@injectable 데코레이터로 감싸져서 모듈에 제공되며, 이 서비스 인스턴스는 애플리케이션 전체에서 사용될 수 있다.
서비스는 컨트롤러에서 데이터의 유효성을 체크 하거나 데이터베이스에 아이템을 생성하는 등의 작업을 하는 부분을 처리한다.

nest g service boards --no-spec


CLI를 이용해서 Service를 생성하면 이렇게 boards.service.ts파일이 생성된다
이 생성된 파일 안에는 injectable 데코레이터가 있으며 이 NestJS는 이것을 이용해서 다른 컴포넌트에서 이 서비스를 사용할 수 있게 만들어준다.

그리고 마찬가지로 cli로 생성 시 자동으로moduleservice가 추가된다


import { Injectable } from '@nestjs/common';
import { Board, BoardStatus } from './boards.model';
import { v1 as uuid } from 'uuid';
import { CreateBoardDto } from './dto/create-board.dto';

@Injectable()
export class BoardsService {
    private boards: Board[] = [];
    // 게시글 목록 조회
    getAllBoards(): Board[] {
        return this.boards;
    }
    // 게시글 생성
    createBoard(createBoardDto: CreateBoardDto) {
        const { title, description } = createBoardDto;

        const board: Board = {
            id: uuid(),
            title,
            description,
            status: BoardStatus.PUBLIC,
        };
        this.boards.push(board);
        return board;
    }
    // 게시글 상세 조회
    getBoardById(id: string): Board {
        return this.boards.find((board) => board.id === id);
    }
    // 게시글 삭제
    deleteBoard(id: string): void {
        this.boards = this.boards.filter((board) => board.id !== id);
    }
    // 게시글 수정
    updateBoardStatus(id: string, status: BoardStatus): Board {
        const board = this.getBoardById(id);

        board.status = status;
        return board;
    }
}

이렇게 사용하여 CRUD를 가능토록 만들면서 Nest에 점점 친해지기 위해서 노오오오오력 한다.
이상 끝

profile
감금 당하고 개발만 하고 싶어요

0개의 댓글