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.ts의 AppModule 임포트 구문을 삭제하고 새로 만든 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가 더 좋은 선택이다.