App setup
이번엔 이전과 다르게 Nest CLI를 이용해 프로젝트를 시작해보겠다.
새로운 디렉토리에서 시작하자. 새 폴더를 만들고 터미널에서 이동한다.
npm install -g @nestjs/cli
를 입력하자. 오류뜨면 맨앞에 sudo
를 추가한다.
설치가 끝나면 nest new {프로젝트이름}
을 입력하고 npm을 선택한다. messages라는 이름으로 짓겟다.
끝나고 나면 우리가 일일이 만들었던 저번보다 훨씬 많은 파일이 자동적으로 생성된 것을 볼 수 있다!
계획
이번에 만들 앱(모바일 X)은 일반 JSON 파일에 저장된 메시지를 검색하고 저장하는 것.
3개의 route가 예상된다. 각 route가 pipe, guard, controller, service, repository 중 무엇이 필요한지 생각해보자.
- 모든 메시지 조회
- 컨트롤러 : 메시지를 보여주는 함수로 연결
- 서비스 : DB에 접근하여 모든 메시지를 가져오는 논리
- 저장소 : 메시지를 저장하는 파일
- 메시지를 생성
- 파이프 : 생성해달라고 보내온 데이터의 유효성을 검사해야함
- 컨트롤러 ( 2개씩 만들지 않고 모든 요청을 처리할 수 있는 하나의 컨트롤러, 서비스, 저장소를 만든다.)
- 서비스
- 저장소
- ID로 메시지 조회
- 컨트롤러
- 서비스
- 저장소
따라서 서버에는
하나의 모듈(MessageModule로 이름을 짓는다.) 내에
- Pipe (메시지 생성을 위해)
- MessagesController (3가지 route를 위한 컨트롤러)
- MessagesService (3가지 route를 위한 서비스)
- MessagesRepository (3가지 route를 위한 저장소)
를 만들어야 한다.
설정
npm run start --dev
로 서버를 실행하면 프로젝트가 변경될 떄마다 서버를 재시작할 필요 없이 바로 반영된다.
위와 같은 명령어는 package.json의 scripts에서 확인할 수 있다.
.eslintrc.js는 오류를 잡아주는 모듈이다. 하지만 우린 typescript가 있으니 굳이 꼭 필요하진 않으니 이 파일의 module.exports ={내부} 의 내를 전체 각주처리한다.
(물론 안해도됌)
새로운 나의 모듈 만들기
src 디렉토리 내에 자동으로 컨트롤러, 모듈, 서비스 파일이 생성되어있다.
위에서 계획을 세운대로 만들기 위해
app.controller.spec.ts, app.controller.ts, app.module.ts, app.service.ts 4개 파일은 지운다.(이용해도 무방)
main.ts 파일을 가보면 ./app.moude 의 import가 오류가 발생한다.
터미널에
nest generate module messages
를 입력하면 src/messages 경로 내부에 messages.module.ts가 새롭게 만들어진다. 끝에 messagesmodule라고 입력하면 클래스 이름이
messagesmodulemodule로 되니 조심하자.
main.ts의 import 문을 import { MessagesModule } from './messages/messages.module'
로 바꿔주면 오류가 사라진다.
물론 밑의 AppModule도 MessageModule로 바꿔준다.
컨트롤러 만들기
터미널에 nest generate controller messages/messages --flat
을 입력해보자.
컨트롤러 파일이 만들어지고 기존의 모듈에 새로 만든 컨트롤러가 자동으로 추가된다!
nest generate {만들 클래스의 타입} {파일을둘폴더이름}/{클래스이름} 으로 만든 명령문이다.
–flat 은 controllers라는 추가적인 폴더를 만들지 말라는 옵션이다. controller 파일을 따로 묶으려면 만들어도 된다.
컨트롤러와 decorator 구성
옵션 1 : @Controller() 내에 @Get(‘/messages’), @Post(‘/messages’), @Get(‘/messages/:id’) 로 구성하기
옵션 2 : @Controller(‘/messages’) 내에 @Get(), @Post(), @Get(‘/:id’) 로 구성하기 (나의 계획)
messages.controller.ts 파일의 컨트롤러 내에 decorator와 메서드를 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
// messages.controller.ts
import { Controller, Get, Post } from '@nestjs/common';
@Controller('messages')
export class MessagesController {
@Get()
listMessages() {}
@Post()
createMessage() {}
@Get('/:id')
getMessage() {}
}
API 클라이언트 설정
postman과 VSCODE 확장 프로그램이 있는데, postman은 구글링하면 잘 나와있다.
rest client 라는 extension을 설치한 후 root 디렉토리에 requests.http 파일을 만들자.
사용법
파일에 GET http://localhost:3000/messages
를 입력하면 바로 위에 Sent Request라는 버튼이 뜬다.
버튼을 누르면 오른쪽에 창이 뜨면서 결과를 볼 수 있다. 서버 키는것 잊지 말자.
이번엔
POST http://localhost:3000/messages
content-type: application/json
{
“content”: “리빅아”
}
도 입력해보자. 빈 줄은 일부러 만든 것이다.