01. Nest CLI 및 NestJS 구조
NestJS가 무엇인지는 여기를 참조하세요.
Nest CLI 설치
Node.js가 설치되어있지 않다면 https://nodejs.org/ 여기에서 다운로드 하세요.
Node.js 설치 후 터미널에서 아래 명령어를 실행하세요
npm i -g @nestjs/cli
nest info #버전 확인을 통해 설치 확인
NestJS 프로젝트 생성
프로젝트 생성을 원하는 폴더에 들어가서 아래 명령어 실행하세요.
nest new board-app
위 명령어를 실행하면 패키지 매니저를 선택하라고 뜨는데, 잘 모르면 npm을 고르고, 잘 알면 자기가 원하는거 선택하세요.
NestJS 프로젝트 실행
프로젝트 생성이 끝나면 아래 명령어를 실행하세요.
cd board-app
npm run start
서버가 실행되면 웹 브라우저에 주소창에 http://localhost:3000/를 입력해 들어가세요.
Hello World!가 뜨면 프로젝트가 정상적으로 생성 및 실행된겁니다.
웹 서버의 동작 원리
웹 서버는 요청에 따라 데이터를 처리한 후 결과를 응답하는 구조로 이루어져 있습니다.
아래 순서를 거쳐 Hello World!를 볼 수 있었습니다.
1. http://localhost:3000로 NestJS에 요청
2. NestJS 서버에서 요청에 대한 응답으로 Hello World! 반환
3. 브라우저에서 결과를 보여줌.
NestJS의 요청 처리 과정
NestJS 내부에서는 어떤 방식으로 요청이 처리될까요?
1. 컨트롤러에서 사용자의 요청에 따라 어떻게 처리해야할지 결정합니다.
2. 서비스에서 데이터를 처리하고, 결과를 반환합니다.
NestJS 구조
Nest CLI로 생성한 NestJS 프로젝트는 아래의 구조로 이루어져있습니다.
루트 폴더
- .gitignore : git 연동 시 무시하는 파일 및 폴더 규칙을 관리하는 파일
- .prettierrc : 코드를 정리해주는 prettier라는 라이브러리의 설정 파일
- .eslintrc.config.js : 코드 규칙을 강제하는 ESLint라는 라이브러리의 설정 파일
- nest-cli.json : NestJS 프로젝트의 구성을 관리하는 파일
- package.json : 프로젝트에서 사용하는 라이브러리들과 명령어를 관리하는 파일
- README.md : 프로젝트의 정보를 설명하는 파일
- tsconfig.build.json : 프로젝트 배포를 위한 빌드 시 제외해야 하는 폴더와 파일들을 관리하는 파일
- tsconfig.json : 프로젝트에서 타입스크립트 사용 시 어떤 규칙을 사용할 것인지 설정하는 파일
src 폴더
- main.ts : 최상위 모듈인 AppModule을 실행시키는 파일
- app.controller.spec.ts : AppModule의 단위 테스트를 위한 파일
- app.controller.ts : AppModule의 라우팅을 담당하는 파일
- app.module.ts : AppModule의 구성 요소를 명시하는 파일
- app.service.ts : AppModule의 비즈니스 로직이 들어있는 파일
test 폴더
- app.e2e-spec.ts : End to End 테스트를 하기 위한 파일
- jest-e2e.json :End to End 테스트의 설정을 담당하는 파일
npm start를 실행하면 발생하는 일
1. npm start 명령어 실행
npm start 명령어를 실행하면 main.ts 파일이 실행됩니다.
2. main.ts 파일 실행
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
main.ts 파일은 bootstrap() 함수를 실행합니다.
bootstrap() 함수는 NestFactory.create() 메서드를 실행시킵니다.
NestFactory.create() 메서드는 AppModule을 실행시키는 거라고만 알아두세요. 자세한건 여기를 참고하세요.
3. AppModule의 내부
NestJS에서 모듈은 여러 기능을 하나로 묶는 역할을 합니다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
실제로 AppModule의 코드를 보면 클래스의 구현은 없습니다.
어떤 컨트롤러를 사용하고, 어떤 서비스를 사용하는지만 나와있죠.
AppModule은 AppController와 AppService로 이루어져있습니다.
AppController에서 요청을 받아 AppService에 처리를 위임하고, 처리한 결과를 사용자에게 반환합니다.