본문 바로가기

node js/NestJs

[Nest Js] Nest Js 공식 문서 파헤치기 - 시작하기

 

트리스티가 Nest Js를 공부하며 남긴 기록입니다. 틀린 내용은 언제든지 말씀해주세요 ~!

 


 

 

📣 Nest Js 시작하기

 

Nest Js를 시작하는 것은 정말 간단합니다. 먼저, npm이 설치되어 있는 상태에서 nest cli를 설치를 해줍시다. 설치가 완료되었다면, 아래의 명령어를 사용해서 새로운 nest 프로젝트를 만들어 줍시다.

 

$ npm i -g @nestjs/cli
$ nest new project-name

 

 

nest 프로젝트를 만들었다면 아래의 사진처럼 지정한 프로젝트 디렉토리 하위에 노드 모듈들과 src 폴더와 test 폴더가 생성된 것을 확인하실 수 있습니다. src 폴더 하위에는 다음과 같이 controller, module, service, main 파일과 controller spec 파일이 생성되어 있습니다. 

 

 

npm run start시 아래의 사진과 같이 Hello world! 라고 출력이 된다면, Nest를 사용할 준비가 완료된 것입니다. 그럼 이제 설치된 각각의 파일들이 어떤 역할을 하는지 간단하게 하나씩 살펴보도록 하겠습니다. 여기서 각 기능을 자세히 설명하기에는 글이 너무 길어지기 때문에 다음에 하나씩 이어서 작성하겠습니다! 

 

 

 

 

💬 app.main.ts는 어떤 파일일까?

 

main.ts는 NestFactory라는 기능을 사용하여 nest 애플리케이션 인스턴스를 생성하는 애플리케이션의 엔트리 파일입니다. 즉, main.ts 파일은 Nest Js의 진입점을 담당하는 역할을 합니다. NestFactory란 Nest Js의 핵심기능을 담당하며, Nest 기반의 애플리케이션을 생성하고 구동하는 역할을 하는 클래스입니다. 아래의 그림을 보시면 @nestjs/core에서 라이브러리에서 NestFactory를 가져오고, AppModule은 아까 만들어진 app.module.ts 파일에서 가져옵니다.

 

 

여기서 bootstrap이란 함수가 async로 선언된 것을 확인할 수 있습니다. 해당 함수 내에서 NestFactory.create() 메서드가 AppModule를 인수로 받아서 Nest 어플리케이션 인스턴스를 생성하며, 생성된 Nest 어플리케이션 인스턴스에 listen() 메서드를 사용하여 3000번 포트를 사용하여 웹서버를 구동합니다. 이때, 서버가 성공적으로 구동하면 listen() 메소드가 Promise 객체를 반환하기 때문에 await를 사용한 것입니다. 그래서 main.ts의 bootstrap 함수는 기본적으로 async로 선언되어 만들어집니다.  

 

혹시나 하는데 bootstrap을 웹사이트 디자인을 쉽게 해주는 그 녀석과 헷갈리시면 안 됩니다! 여기서 bootstrap은 부팅을 의미하는 단어입니다.

 

이 bootstrap이 아닙니다!!!

 

 

 

 

💬 app.module.ts는 어떤 파일일까?

 

app.module.ts의 AppModule는 @Module() 데코레이터가 사용되는 클래스이며, @Module() 데코레이터는 Nest가 애플리케이션 구조를 구성하는 데 사용하는 메타데이터를 제공하는 역할을 합니다. 

 

 

 

여기서 @Module() 데코레이터가 imports, controllers, providers라는 세 가지 속성의 객체를 받는 것을 확인할 수 있습니다. 실제로는 exports라는 속성까지 포함해 총 네 가지 속성을 가지고 있습니다. 현재는 막 만든 따끈따끈한 nest 프로젝트이기 때문에 controllers나 providers 속성에 AppController나 AppService밖에 존재하지 않지만, 크기가 큰 프로젝트의 경우에는 각 속성의 배열 길이가 길어질 수 있습니다. 

 

 

 

 

💬 app.controller.ts는 어떤 파일일까?

 

app.controller.ts의 AppController는 @Controller() 데코레이터를 갖는 클래스입니다. nest로 새로운 프로젝트를 시작하면 이처럼 기본적으로 하나의 @Get() 데코레이터를 갖는 간단한 Controller가 생성됩니다. Controller 클래스는 Service 클래스에 의존하게 되는데, 해당 controller는 getHello() 기능을 제공해주기 위해 AppService라는 Service 클래스에 의존하고 있습니다. 따라서 constructor를 사용해 생성자 매개변수를 추가해준 것을 확인할 수 있습니다. 

 

외부에서 Get 메소드를 사용해 해당 경로로 접근하면, AppController 클래스에서는 AppService의 getHello() 기능을 제공합니다.

 

 

 

 

💬 app.service.ts는 어떤 파일일까?

app.service.ts는 @Injectable() 데코레이터를 사용하여 service 클래스로 만든 파일입니다. 해당 파일은 앞서서 소개해드렸던 app.controller.ts에서의 getHello() 메소드를 구현하는 역할을 합니다. 기본적으로 Nest 프로젝트를 만들면 이처럼 "Hello World!"라는 문자열을 출력하는 간단한 getHello() 메소드가 들어있습니다. 

 

 

 

 

💬 app.controller.spec.ts 어떤 파일일까?

spec이라고 붙은 파일은 테스트용 파일입니다. Nest js에서는 jest라는 테스트 프레임 워크를 사용할 수 있는데, 만약 테스트 코드를 작성하지 않을 것이라면 삭제해도 웹 서버를 실행하는 데는 아무런 지장이 없습니다. 다만, 테스트 코드를 작성하지 않는다면 여러 가지 불편함이 있으니 이왕이면 작성해 보는 것을 추천드립니다. 테스트 코드 작성도 여기서 소개하기에는 너무 글이 길어지기 때문에 나중에 소개해보도록 하겠습니다.

 

 

 

 

 

📣 간단하게 Nest cli를 사용해 보자!

 

Nest js에서는 Nest cli라는 Nest 애플리케이션 초기화, 개발, 유지 관리하는데 도움을 주는 인터페이스 도구를 제공합니다. 아래의 명령어를 입력해주면 그림과 같이 다양한 명령어가 나오는 것을 확인할 수 있습니다.

 

$ nest

혹은 

$ nest --help

 

 

express에서는 어떤 controller나 service 등을 추가할 때 일일이 파일을 생성해서 작성을 해야 하는 불편함이 있었지만, Nest js에서는 그것들을 cli 명령어로 해결할 수 있습니다. 간단하게 controller, module, service를 추가해 보도록 하겠습니다. 

 

 

 

먼저 controller를 추가해보도록 하겠습니다. 원래는 nest generate controller study라고 작성해야 하지만 친절하게도 약자를 사용할 수 있기 때문에 약자로 작성해 보겠습니다. 

 

$ nest g co study

 

 

명령어가 성공적으로 수행되었다면, 다음과 같이 src 폴더 하위에 study라는 폴더와 함께 study controller와 테스트 파일이 생성됩니다.

 

 

 

 

아래와 같이 작성하면 한 번에 원하는 파일을 생성할 수 있습니다. 한번 service와 module 파일을 생성해보겠습니다.

$ nest g s study | nest g mo study

 

 

한 번에 생성된 것을 확인할 수 있습니다. cli로 service를 생성하게 되면 controller 처럼 spec 파일이 자동으로 생성되게 됩니다. 이 또한 테스트 전용 파일이기 때문에 테스트 코드를 작성하지 않는다면 필요 없어서 삭제해도 상관은 없습니다.

 

 

 

 

 

 

이렇게 새롭게 study라는 이름으로 controller와 service, module을 생성하고 나면, 맨 처음에 생성됐던 app.module.ts의 속성이 다음과 같이 바뀌게 됩니다. 

 

 

 

 

 

npm run start를 하고 아무 오류도 없이 localhost:3000으로 접속이 잘 된다면, study controller, service, module를 제대로 추가한 것입니다. 다음 시간에는 Controller에 대해 자세히 다뤄보도록 하겠습니다.

 

 

짜잔! 성공적으로 추가 완료~