Search

2. Nest CLI로 프로젝트 생성하기

1. 프로젝트 구상

일반 JSON 파일에 문자열을 저장하고 검색하는 백엔드 서버 구축해보자!
어떤 경로가 필요할까?
1.
우리가 저장한 모든 메시지를 나열하는 경로
2.
ID를 이용해서 메시지를 상세 검색하는 경로
3.
메시지를 생성하는 경로
이 각각의 경로에 대해 일련의 다이어그램들을 거치고, 그 각각의 경로들을 제공하기 위해 어떤 유형의 클래스가 필요한지 생각해보자.

1.1. 전체 메시지 조회

GET localhost:3000/messages
메시지 리스트를 받아서 요청자에게 반환하는 API
필요한 클래스
1.
Controller → 라우팅
2.
Service → 리스트를 받기 위한 약간의 논리
3.
Repository → 메시지 리스트 조회

1.2. 메시지 생성

POST localhost:3000/messages
새로운 메시지를 생성하는 API
// Body {"content": "hi there"}
JSON
복사
필요한 클래스
1.
Pipe → 데이터를 검증하고, 콘텐츠 속성이 문자열인지 확인
2.
Controller → 라우팅
3.
Service → 메시지 생성을 위한 약간의 논리
4.
Repository → 메시지 저장

1.3. 상세 메시지 조회

GET localhost:3000/messages/:id
특정 메시지를 검색해서 요청자에게 반환하는 API
필요한 클래스
1.
Controller → 라우팅
2.
Service → 리스트를 받기 위한 약간의 논리
3.
Repository → 메시지 리스트 조회

2. Nest CLI로 파일 생성하기

우리는 앞 장에서 프로젝트를 손수 만들어보았다.
Nest CLI를 쓰면 더 간편하게 프로젝트를 생성할 수 있다.
Nest CLI: NestJS 프로젝트를 빠르고 효율적으로 시작할 수 있도록 도와주는 도구

2.1. Nest CLI 설치

먼저, Nest CLI를 설치해야 한다. 터미널에서 아래 명령어를 실행하여 설치할 수 있다.
npm install -g @nestjs/cli
Bash
복사

2.2. 프로젝트 생성

Nest CLI를 설치한 후, 새로운 NestJS 프로젝트를 생성하려면 다음 명령어를 입력한다.
nest new 프로젝트명
Bash
복사
이 명령어를 실행하면, 프로젝트 생성 과정이 시작되며, 몇 가지 기본 설정을 입력하라는 메시지가 나타난다.
npm, pnpm 등을 어떤 패키지 매니저를 사용할지 고르라는 선택창이 나올텐데 npm을 선택해주면 된다.

2.3. ESLint 비활성화 (선택)

Nest는 기본값으로 ESLint를 사용한다.
ESLint는 명령줄 도구로서 자동으로 우리의 코드를 확인하고 발생 가능한 오류나 이슈를 하이라이트 해주는 역할을 한다.
강사님은 TypeScript가 다양한 오류들을 잡아주기 때문에 ESLint를 비활성화 해도 크게 상관이 없다고 하셨다. (ESLint를 사용하면 짜증이 난다고..)
그래서 비활성화를 하고 싶다면 ESLint 파일 안의 내용을 전부 주석 처리 해주면 된다.
더보기

2.4. App 파일 삭제

우리는 Messages와 관련된 모듈, 컨트롤러, 서비스를 만들 것이기 때문에 기존의 App 모듈 파일들은 삭제해준다.
src/ ├── app.controller.spec.ts ├── app.controller.ts ├── app.module.ts ├── app.service.ts
Bash
복사
그런 다음, Nest CLI의 generate 명령어를 사용하여 Messages 모듈을 생성한다.
nest generate moudle messages
Bash
복사
이 때, 주의할 점은 messagesmodule 로 파일 이름을 설정하면 안된다.
main.tsAppModule 임포트 구문을 삭제하고 새로 만든 MessagesModule로 대체해준다.
// main.ts import { NestFactory } from '@nestjs/core'; import { MessagesModule } from './messages/messages.module'; async function bootstrap() { const app = await NestFactory.create(MessagesModule); await app.listen(3000); } bootstrap();
TypeScript
복사

2.5. 컨트롤러 생성

Nest CLI를 사용해서 컨트롤러를 생성해보자.
nest generate controller messages/messages --flat
Shell
복사
그러면 다음과 같은 프로젝트 구조를 가지게 된다.
messages/ ├── messages.controller.spec.ts ├── messages.controller.ts ├── messages.module.ts
Shell
복사
컨트롤러 생성 명령어를 조금 더 살펴보자.
messages/messages
생성된 컨트롤러의 경로를 지정한다.
여기서는 messages 폴더 안에 messages.controller.ts 파일을 생성하겠다는 의미이다.
—flat (선택)
이 옵션은 새로 생성되는 파일을 하위 폴더 없이 현재 디렉토리에 바로 생성하라는 의미이다.
만약 이 옵션을 빼면 messages라는 폴더 안에 자동으로 Controllers라는 이름의 새 폴더를 생성하고 폴더 안에 파일을 추가할 것이다.
우리 경우에는 messages 폴더 안에 파일이 많지 않기 때문에 이 안에서 파일들을 더 세분하는 건 그다지 필요하지 않다고 생각하기 때문에 —flat 옵션을 추가한다.
컨트롤러가 생성됐다면, @Get 데코레이터와 @Post 데코레이터를 임포트하여 요청 핸들러를 구성하자.
컨트롤러 안에서 경로를 설정하는 방법은 크게 두 가지가 있다.
방법1
import { Controller, Get, Post } from '@nestjs/common'; @Controller() export class MessagesController { @Get('/messages') listMessages() {} @Post('/messages') createMessage() {} @Get('/messages/:id') getMessage() {} }
TypeScript
복사
방법2
import { Controller, Get, Post } from '@nestjs/common'; @Controller('messages') export class MessagesController { @Get() listMessages() {} @Post() createMessage() {} @Get('/:id') getMessage() {} }
TypeScript
복사
코드의 재사용성, 유지보수성, 가독성, 확장성을 고려했을 때 방법 2가 더 좋은 선택이다.