Lsiron

Nest.js 시작하기 본문

백엔드/Nest.js

Nest.js 시작하기

Lsiron 2024. 7. 21. 06:02

src폴더의 기본 파일중에 app.controller.spec.ts 파일을 일단 지워보자. 나중에 다시 만들어 줄 것이다.

 

터미널에 아래와 같이 명령어를 입력하여 nest.js를 실행해보자

$ npm run start:dev

 

위와 같이 터미널창에 LOG가 생성되면서 localhost:3000으로 접속하면 페이지가 나올 것 이다.

 

이제  app.service.ts로 가보자.

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

 

@nestjs/common에서 Injectable 데코레이터를 가져온다. Injectable은 이 클래스가 의존성 주입 시스템에서 사용할 수 있는 서비스임을 나타낸다.

 

@Injectable() 데코레이터는 AppService 클래스에 붙여서 이 클래스가 서비스로 사용될 수 있음을 나타낸다.

 

AppService 클래스는 @Injectable 데코레이터가 적용된 클래스이며, 외부 파일에서 사용할 수 있도록 export로 내보내준다.

 

getHello 메서드는 string 타입의 값을 반환하고, 이 메서드는 'Hello World!'라는 문자열을 반환한다. 즉, 화면에 출력되는 것은 getHello() 함수의 반환값이다.

 

AppService 단순히 "Hello World!" 문자열을 반환하는 getHello 메서드를 가진 서비스이다.

 

이 서비스는 @Injectable 데코레이터를 통해 의존성 주입 시스템에 등록되어 다른 컴포넌트에서 주입받아 사용할 수 있다.

 

다음으로 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();
  }
}

 

@nestjs/common에서 Controller와 Get 데코레이터를 가져오고, app.service.ts 파일에서 내보낸 AppService 클래스를 가져온다.

 

@Controller() 데코레이터 AppController 클래스에 붙여서 이 클래스가 컨트롤러임을 나타낸다. 기본 URL 경로가 설정되지 않으므로, 기본 경로('/')를 사용한다.

 

export class AppController { ... } AppController라는 클래스를 정의하고, 외부에서 사용할 수 있도록 내보낸다.

 

constructor(private readonly appService: AppService) {} AppService의 인스턴스를 주입받는 생성자이며, appService는 AppController 클래스의 멤버 변수로 설정되어, 이 클래스 내에서 사용할 수 있다.

 

@Get() 데코레이터 이 메서드가 HTTP GET 요청을 처리함을 나타낸다. 기본 경로('/')로 들어오는 GET 요청을 처리한다.

 

getHello(): string { ... }: getHello 메서드는 문자열을 반환한다. 이 메서드는 AppService의 getHello 메서드를 호출하여 그 반환 값을 그대로 반환한다.

 

이 코드는 NestJS 애플리케이션의 기본 컨트롤러를 정의한다. 이 컨트롤러는 기본 경로('/')로 들어오는 GET 요청을 처리하며, AppService의 getHello 메서드에서 반환된 문자열을 응답으로 보낸다.

 

AppService는 별도로 정의된 서비스로, 애플리케이션의 비즈니스 로직을 담고 있을 가능성이 크다.

 

이제 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 {}

 

@nestjs/common에서 Module 데코레이터를 가져오고, app.controller.ts 파일에서 내보낸 AppController와 app.service.ts에서 내보낸 AppService를 가져온다.

 

@Module 데코레이터는 AppModule 클래스에 붙여서 이 클래스가 NestJS 모듈임을 나타낸다.

( @module에서 @는 데코레이터 함수라고 부르는데 https://lsiron.tistory.com/97 이 사이트를 참고하자. )

 

imports는 현재 모듈에서 사용할 다른 모듈들을 임포트한다. 여기서는 빈 배열로 되어 있어 다른 모듈을 임포트하지 않는다.

 

controllers는 이 모듈에 속한 컨트롤러들을 정의한다. 여기서는 AppController가 정의되어 있다.

 

providers는 이 모듈에서 사용할 서비스들을 정의한다. 여기서는 AppService가 정의되어 있다.

 

AppModule 클래스는 빈 클래스지만, @Module 데코레이터를 통해 모듈의 메타데이터가 정의되어 있다. export를 통해 이 클래스를 외부에서 사용할 수 있게 내보낸다.

 

이 코드는 NestJS 애플리케이션의 주요 모듈을 정의하며, AppController와 AppService를 포함하고 있는 기본적인 설정을 보여준다.

 

main.ts 파일로 가보자. ( Nest.js의 main.ts 파일은 무조건 main 이름을 가져야한다. ( 바꾸면 안됨 ) )

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

 

@nestjs/core에서 NestFactory를 가져오고, app.Module.ts 파일에서 내보낸 AppModule을 가져온다.

 

async function bootstrap() { ... }는 bootstrap이라는 비동기 함수를 정의한다. 이 함수는 애플리케이션을 초기화하고 서버를 시작하는 역할을 한다.

 

const app = await NestFactory.create(AppModule);는 NestFactory를 사용하여 AppModule을 기반으로 애플리케이션 인스턴스를 생성한다. 이 작업은 비동기적으로 이루어지므로 await 키워드를 사용하여 완료될 때까지 기다린다.

 

await app.listen(3000);는 애플리케이션이 포트 3000에서 HTTP 요청을 수신하도록 서버를 시작한다. 이 작업 역시 비동기적으로 이루어지므로 await 키워드를 사용한다.

 

bootstrap();는 정의된 bootstrap 함수를 호출하여 애플리케이션을 시작한다.

( bootstrap이라는 이름을 가진 함수인데 이 함수 이름은 아무렇게나 써도 된다. )

 

이 코드는 NestJS 애플리케이션의 진입점(Entry Point)으로, 애플리케이션을 시작하고 서버를 실행시키는 역할을 한다.

 

즉, 이 코드는 NestJS 애플리케이션의 시작 스크립트이다.

 

NestFactory를 사용하여 AppModule을 기반으로 애플리케이션 인스턴스를 생성하고, 해당 인스턴스가 포트 3000에서 HTTP 요청을 수신하도록 서버를 시작한다. 이로써 NestJS 애플리케이션이 실행된다.