본문 바로가기

모카 스터디/Nest

Nest JS 기본 [John Ahn]

Nest JS 소개

Nest JS ?

Nest (NestJS)는 효율적이고 확장 가능한 Node.js 서버 측 애플리케이션을 구 축하기위한 프레임 워크입니다.

프로그레시브 JavaScript를 사용하고 TypeScript로 빌드되고 완벽하게 지원하며 (개발자가 순수 JavaScript로 코딩 할 수 있음) OOP (Object Oriented Programming), FP (Functional Programming) FRP (Functional Reactive Programming) 요소를 사용할수있 게 해줍니다

 

 

Nest JS 는 내부적으로 어떻게 구성되었나요?
내부적으로 NestExpress (기본값)와 같은 강력한 HTTP 서버 프레임 워크를

사용하며 선택적으로 Fastify를 사용하도록 구성 할 수도 있습니다!

 

Nest JS 의 철학

Node (및 서버 측 JavaScript)를 위한 훌륭한 라이브러리, 도우미 및 도구가 많 이 존재하지만

이들 중 어느 것도 아키텍처의 주요 문제를 효과적으로 해결하지 못합니다.

Nest는 개발자와 팀이 고도로 테스트 가능하고 확장 가능하며 느슨하게 결합되 고 유지 관리가 쉬운 애플리케이션을 만들 수있는

즉시 사용 가능한 애플리케이 션 아키텍처를 제공합니다.

이 아키텍처는 Angular에서 크 영감을 받았습니다.

 

 

Nest JS 기본 요소

NestCLI로 생성한 프로젝트 기본구조

새 프로젝트 디렉터리가 생성되고 초기 핵심 Nest 파일 및 지원 모듈로 디렉터 리가 채워져 프로젝트의 기존 기본 구조가 생성됩니다.

(sudo) npm i -g @nestjs/cli

nest new project-name

 

nest -version명령어를 이용하여 잘 설치 된지 확인한다.

 

기본 구조에서 살펴보는 Nest 로직 흐름

 

NestJS Module

 

Nest JS 모듈이란 ?
모듈은 @Module () 데코레이터로 주석이 달린 클래스입니다.

@Module () 데코레이터는 Nest가 애플리케이션 구조를 구성하는 데 사용하는 메타 데이터를 제공합니다.

각 응용 프로그램에는 하나 이상의 모듈 (루트 모듈)이 있습니다.

루트 모듈은 Nest가 사용하는 시작점입니다.

모듈은 밀접하게 관련된 기능 집합으로 구성 요소를 구성하는 효과적인 방법입니다.

(기능별로 만듭니다) ex) 유저 모듈, 주문 모듈, 챗 모듈...

 

같은 기능에 해당하는 것들은 하나의 모듈 폴더안에 넣어서 사용합니다.

(UserController, UserService, UserEntity 다 같은 기능이기에 UserModule안에 넣습니다.)

모듈은 기본적으로 싱글 톤이므로 여러 모듈간에 쉽게 공급자의 동일한 인스턴스를 공유 할 수 있습니다.

소스 코드를 이용해서 모듈을 만드는 방법은 ?

게시글을 위한 BoardModule안에 BoardControllerBoardService를 모듈안에 아래 와 같이 넣어주시면 됩니다. 우선은 간단하게 이렇게 되는 것이구나만 보고 가겠습니 다

 

모듈 생성하기

 

방금 생성한 boardModule을 사용하기 위해서는 루트 모듈인 app.module.ts에 등록해주어야 합니다.

이건 board 모듈을 생성할 때 자동으로 등록이 됩니다.

 

 

 

NestJS Controller

Controller ?
컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환합니다.

콘트롤러는 @Controller 데코레이터로 클래스를 데코레이션하여 정의 됩니다.

Handler ?

핸들러는 @Get, @Post, @Delete 등과 같은 데코레이터로 장식 된 컨트롤러 클래스 내의 단순한 메서드입니다.

 

NestJS Proviers, Service

Providers ?

 

대부분의 기본 Nest 클래스는 서비스, 리포지토리, 팩토리, 헬퍼등 프로바이더로 취급될 수 있습니다. 

프로바이더의 주요 아이디어는 종속성으로 주입(다른 기능을 사용할수 있게 한다.) 할 수 있다는 것입니다. 

즉, 객체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 "연결"하는 기능은 대부 분 Nest 런타임 시스템에 위임될 수 있습니다.

 

Service ?
서비스는 소프트웨어 개발내의 공통 개념이며, NestJS, Javascript에서만 쓰이는 개념이 아닙니다.

@Injectable 데코레이터로 감싸져서 모듈에 제공되며, 이 서비스 인스턴스는 애플리케이션 전체에서 사용 될 수 있다.

서비스는 컨트롤러에서 데이터의 유효성 체크를 하거나 데이터베이스에 아이템을 생성하는 등의 작업을 하는 부분을 처리합니다.

 

ServiceController에서 이용할 수 있는 방법( Dependency Injection)

위를 보면 BoardsServiceContructor 클래스에서 가져오고(Injected) 있습니다. 그런 후 Private 문법을 사용하고 있습니다.

이렇게 해서 boardsService를 정의해서 Controller안에서 사용할수 있게 만들었습니다.

이렇게 할 수 있는 이유는 타입스크립트의 기능을 이용해서 종속성을 타입으로 해결할수 있기떄문입니다.

 

Provider 등록하기

Provider를 사용하기 위해서는 이것을 Nest에 등록해줘야지 사용할 수가 있습니다.

등록하기 위해서는 module 파일에서 할 수 있습니다.

module 파일에 providers항목 안에  해당 모듈에서 사용하고자 하는 Provider 를 넣어주시면 됩니다.

CLI를 이용해서 Service를 생성하면  boards.service.ts 파일이 생성됩니다.
 Injectable 데코레이터가 있으며  NestJS는 이것을 이용해서  다른 컴포넌트에서 이 서비스를 사용 할 수있게(Injectable)만들어줍니다.

그리고 CLIService 생성시에는 module에도 자동으로 Service가 추가됩니다.

 

접근 제한자를 이용해서 소스 간단하게 하기

접근 제한자(public, protected, private)을 생성자(constructor) 파라미터에 선언 하면

접근 제한자가 사용된 생성자 파라미터는 암묵적으로 클래스 프로퍼티로 선언됩니다

 

1. boardsService 파라미터에 BoardsService 객체를 타입으로 지정해줍니다. 

2. 이 boardsService 파라미터를 BoardsController 클래스 안에서 사용하기 위해서 

     this.boardsService 프로퍼티에 boardsService 파라미터를 할당해줍니다. 

3. 하지만 타입스크립트에서는 선언한 값만 객체의 프로퍼티로 사용가능하기 때문에  boardsService: BoardsService로 선언해줍니다.

 4. 이렇게 갖게된 boardsService 프로퍼티를 이용해서 BoardsController 클래스 안에서 활용을 할수가 있습니다.

 

즉, 파라미터가 프로퍼티로 된다.