본문 바로가기

내일배움캠프_개발일지/nest.js 연습

nest.js 연습 <1> - 2

________________________________________________________________________

 

  1. 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