끄적이는 개발노트
NestJS 설치 및 구조이해 본문
이번 포스트에서는 이전에 소개한 NestJS를 설치하고 구조이해를 하는 시간을 가져본다.
1. NestJS 설치
NestJS 사용을 위해 @nestjs/cli를 설치한다.
설치 완료 후 nest 명령어를 통해 확인한다.
$> npm i @nestjs/cli -g
$> nest
2. 프로젝트 생성
nest new 프로젝트명 으로 프로젝트를 생성해준다.
실행되면 다음과 같이 어떤 설치 패키지를 이용할지 묻는다.
$> nest new project name
npm을 이용하여 생성한다.
완료가 되면 다음과 같이 성공 메세지가 뜬다.
좌측 탐색기를 보면 nest-project 폴더가 생성되어 있는 것을 확인할 수 있다.
이를 열어보면 설치와 프로젝트 생성만으로 NestJS를 위한 백엔드 기본 구조가 만들어져 있다.
3. 구조 이해
main.ts 파일을 열어보면 다음과 같이 되어 있다.
NestJS 어플리케이션은 이 main.ts 파일에서 시작한다.
코드를 보면 AppModule이라는 하나의 모듈에서 어플리케이션이 생성되는 것을 확인할 수 있다.
AppModule을 import하는 app.module.ts 파일을 살펴보면 다음과 같이 되어 있다.
AppModule은 모든 것의 Root Module이다.
즉, 각각의 기능을 담당하는 여러 Module들이 AppModule에 모여 하나의 모듈로써 main.ts 파일에 import 되는 것이다.
여기서 중요한 개념은 controller와 provider 이다.
Controller
controller는 기본적으로 url을 가져오고 함수를 실행하는 역할을 한다. Express의 router와 같은 역할이다.
app.controller.ts 파일을 열어보면 다음과 같다.
여기서 @Get 데코레이터는 express의 get 라우터와 같은 역할을 한다.
express에서는 app.get을 통해 하던 라우터를 세팅해주지만 NestJS에서는 데코레이터 get만을 통해 자동으로 가능하게 되는 것이다.
여기서 하나 의문점이 생긴다.
return this.appService.getHello(); 대신에 return 'Hello';와 같이 출력 혹은 기능을 수행하면 안될까?
물론 가능하다. 하지만, NestJS는 controller와 비즈니스 로직을 구분짓는 것을 요구한다.
즉, controller에서는 url을 가져오고 함수를 리턴하기만 한다.
실제 함수가 돌아가는 곳은 service인 것이다.
Provider
provider는 현재 모듈에서 공유될 @Injectable() 데코레이터가 달린 클래스이다.
앞서 말한, service가 @Injectable() 데코레이터를 통해 provider가 되는 것이다.
그렇다면 Injectable이 무엇을 뜻하는 것일까?
바로, DI(Dependency Injection)개념이 사용된 것이다.
Dependency Injection(의존성 주입)
하나의 객체가 다른 객체의 의존성을 제공하는 기술.
두 객체 간, 클래스 레벨에서는 의존관계가 고정되지 않지만, 런타임 시에 관계가 주입된다.
DI는 IOC(Inversion of Control)의 약어로 역제어 기술의 한 패턴이다.
즉, 서비스를 사용하려는 객체로 전달하는 것을 의미한다.
이를 통해, 종속성이 감소하고, 재사용성이 증가하는 등, 코드 관리에 있어 많은 장점이 발생한다.
(처음 접하는 개념을 이해한대로 설명하다보니 다소 부족할 수도 있다. DI에 대한 자세한 사항은 의존성 주입을 통해 참고)
의존성 주입 - 위키백과, 우리 모두의 백과사전
소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. "의존성"은 예를 들어 서비스로 사용할 수 있는 객체이다. 클라이언트가
ko.wikipedia.org
다시 코드로 돌아와보면 service에는 실제 사용되는 함수가 정의되는 곳으로 필요하다면 DB 쿼리문이 실행되는 곳이다.
그런 함수들을 @Injectable() 데코레이터를 통해 controller에서 service의 타입을 지정해주는 것만으로 Nest Injector가 appService 변수를 사용가능하게끔 만들어주는 것이다. 이렇게 강력한 기능이 도입될 수 있었던 이유는 TypeScript를 통해 type 비교가 쉽게 가능해졌기 때문이다.
이렇게 자동 생성된 파일들을 통해 NestJS의 기본적인 개념을 이해해보았다.
우리는 앞으로 이 구조에 맞춰서 코딩을 하기만 하면 근사한 Node.js 백엔드를 설계할 수 있다.
다음 포스트에서 직접 controller와 service를 코딩하며 간단한 프로젝트를 만들어본다.
'JavaScript > NestJS' 카테고리의 다른 글
NestJS 연습 프로젝트(Movie) - DTO와 유효성검사 (0) | 2021.10.01 |
---|---|
NestJS 연습 프로젝트(Movie) - 전체코드(CRUD) (0) | 2021.10.01 |
NestJS 연습 프로젝트(Movie) - Service 기본 사용법 (0) | 2021.10.01 |
NestJS 연습 프로젝트(Movie) - Controller 기본 사용법 (0) | 2021.09.30 |
NestJS 소개 (0) | 2021.09.30 |