________________________________________________________________________
- Nest.js 에 대해 간단히 알아보자
폴더 : kimminsoo -> NomadCoders -> nest_js -> hi-nest
1.
nest.js 는 main.ts 파일을 src 폴더 안에 가진다. 무조건 이 이름이어야 해. 바꾸지 마.
——
// src -> main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
——
=> bootstrap 이라는 이름의 함수가 있는데, 이 놈 이름은 달라져도 상관 없어.
——
const app = await NestFactory.create(AppModule);
——
이게 뭐하는 녀석인가.
AppModule 이라는 녀석을 인자로 받는 create 라는 함수가 NestFactory 라는 거 안에 속해 있는데,
이 구문을 통해서 const app = express() 와 같은 효과를 보는 거지.
——
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
——
=>
const app = await NestFactory.create(AppModule) 의 AppModule 는 app.module.ts 파일에서 export 된 클래스야.
main.ts 에서는 AppModule 이 클래스를 루트 모듈로서 사용하여, nest.js 어플리케이션 인스턴스를 생성하고는
listen() 함수를 호출하여 서버 포트를 여는 거지.
AppModule 클래스는 Module 라는 데코레이터를 가지고 있어.
이 데코레이터는 함수인데, 데코레이터의 역할은 해당 데코레이터가 붙은 클래스 / 함수 등의 기능이 어떤 역할을 수행하는지
nest.js 가 알려주고, 또 그 수행을 도와주는 역할을 해준다고.
마치 밀크 쉐이크에 딸기 시럽을 넣는 것과 같지. 같이 먹으면 맛있잖아?
어쨌든 main 에서 app.module 에 있는 AppModule 이라는 클래스를 모듈로서 불러와서 인스턴스를 생성하고 있는거야.
@Module 는 ClassDecorator 를 반환해. 이게 무슨 뜻인가. AppModule 클래스의 프로토타입을 변형 시킨다는 것.
AppModule 이 가지고 있는 프로토 타입중 imports, controllers, providers 에 임의의 값을 할당해 주고 있어. 하나씩 살펴보자.
imports
=> 해당 모듈(AppModule 클래스를 뜻함. 데코레이터가 이 클래스는 모듈 역할을 한다고 명시) 에서 필요한
모듈의 집합을 뜻해. 여기에 들어가는 모듈은 프로바이더(서비스)를 노출하는 모듈.
가장 흔하게 임포트를 하는 모듈 중 하나는 HttpModule(API 호출 모듈).
또한, 나중에 배우게 되는 TypeOrmModule을 이용하여 참조할 리포지토리를 가져오기도.
controllers
=> 해당 모듈에서 사용하는 컨트롤러를 정의.
providers
=> 해당 모듈에서 사용하는 서비스를 정의
exports
=> 해당 모듈에서 노출시킬 서비스를 정의해.
다른 모듈에서 해당 모듈의 서비스를 사용하기 위해서는 exports로 노출을 해야 사용할 수 있어.
2.
Nestjs 어플리케이션은 main.ts 부터 시작한다.
main.ts 가 모든 걸 시작해.
——
// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
——
=> const app = await NestFactory.create(AppModule);
하나의 모듈에서 어플리케이션 인스턴스를 생성한다.
앱 모듈은 모든 것의 루트 모듈.
모듈이 무엇인가.
애플리케이션의 일부분. 한 가지 역할을 하는 앱.
AppModule 을 쫓아서 app.modules.ts 로 가보자.
——
// app.modules.ts
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
——
=> nestJs 에서 @Module 데코레이터는 해당 클래스가 모듈의 기능을 가지고 있다고 설명해주고 있는 것과 같아.
이 @Module 데코레이터에 대해서 우리가 알아야 할 것은 우선 controllers 와 providers 야.
** 컨트롤러가 하는 일은 기본적으로 url 을 가져오고 함수를 실행하는 것.
즉 express 로 치자면 router 같은 거지. router.use() 이거 있잖아.
——
// app.controllers.ts
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
——
=> @Get() 이라는 데코레이터가 보이지?
이게 express 로 치자면, router.use(“/“, getRouter) —> router.get(“/“, (req, res) => {}) 여기서
“ router.get “ 이걸 의미하는 거지.
참고로, @Get()
이거는 “/“ 이거와 같아. 즉 이 경우 localhost:3000/ 이거와 같아. 메인 페이지인 거지. 그럼 다음과 같이 작성도 가능해.
——
@Get("/hello")
sayHello(): string {
return "Hello Everybody";
}
——
=> localhost:3000/hello
로 접속하면 “Hello Everybody” 라는 글자가 보이겠지?
컨트롤러의 역할은 사실 이게 다야.
url 을 가져와서, 함수로 매핑. 그럼 /hello 가 sayHello 를 실행하는 거지.
바꿔 말하면, nestJs 가 알아서 라우터를 설정해 준다는 거지.
우리는 @Get 데코레이터 하나만으로 get 리퀘스트를 얻을 수 있는 거고.
3.
app.service.ts 에 대해서.
컨트롤러를 다시 살펴보자.
——
// app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
@Get("/hello")
sayHello(): string {
return "Hello Everybody";
}
}
——
=> app.service 에서 AppService 를 가져와서 AppController 클래스에 주입해서 사용하고 있어.
그리고 getHello() 는 this.appService.getHello 이렇게 서비스단의 함수를 호출하고 있지.
즉, 바꿔 말하면 컨트롤러는 서비스에게 의존하고 있다.
어째서 서비스가 필요한가.
바로 구조와 아키텍처 때문에.
nestJs 는 컨트롤러를 비지니스 로직과 구분짓고 싶은거야. 3 레이어 처럼!
——
// app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
——
=> 서비스 클래스는 걍 간단한 함수만 가지고 있지. 컨트롤러에서 해당 함수를 호출할 테고.
'내일배움캠프_개발일지 > nest.js 연습' 카테고리의 다른 글
nest.js 연습 <1> - 1 (1) | 2023.02.21 |
---|