우당탕탕 백엔드 입문기록(1) - nest 프로젝트 생성하기!

const job = '프론트엔드';·2024년 11월 26일
1

nest

목록 보기
1/4

NextJS 아니고, NestJS 맞습니다.


어차피 백엔드 배우고 싶었음. 오히려 좋아 럭키비키쟈나

프로젝트 만드는 것부터 차근차근 시작해 보겠슴.
참고) 구조 이해를 프론트적 사고로 할 수 있음 주의

프로젝트 생성(CLI)

$ npm install -g @nestjs/cli
$ nest new my-nest-project
$ cd my-nest-project
$ npm run start:dev

이렇게 하면 프로젝트는 성공
구조를 간단히 설명하면

main.ts

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
  • 부트스트랩 함수가 있고
  • 부트스트랩을 마지막에 호출함
  • 부트스트랩 내부에는 AppModule을 불러와서 NestFactory가 애플리케이션을 생성 그리고 3000 포트로 HTTP 요청을 받고 있음

참고) NestFactory

  • Nest 애플리케이션 인스턴스를 생성 클래스
  • create()메서드는 인터페이스를 충족하는 애플리케이션 객체를 반환

app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  • main.ts 내부에 불러오고 있는 AppModule이 있는 곳!
  • Module에 Provider를 등록해야 다른 곳에서 사용이 가능함(= Provider에 있는 함수를 다른 곳에 제공하는 역할)
  • Providers안에는 Service(함수를 구현 하는 장소)를 넣고, Controllers안에는 Controller를 넣음

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();
  }
}
  • @Controller() 데코레이터를 호출: 컨트롤러로 인식!
  • 클래스 내의 각 메서드에는 @Get()@Post()@Delete()와 같은 HTTP 방식(method)에 해당하는 데코레이터를 명시해서 사용
  • 이러한 데코레이터들은 URL 경로를 나타내는 문자열을 인자로 받음
  • 따라서 endpoint는 여기에서 만들어짐
  • 컨트롤러는 들어오는 요청을 처리 & 클라이언트에 응답을 반환

app.service.ts

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}
  • @Injectable() 데코레이터: 다른 클래스에 생성자를 통해서 주입해줄 수 있음
  • 이게 있어야 controller에서 constructor를 통해 의존 선언을 할 수 있음

의존성?

Nest의 핵심일지도!

controller와 service의 관계

Controller는 Service를 의존한다.

  • 컨트롤러는 서비스에서 함수를 가져다 쓰기 때문에 의존한다고 봄 - 따라서 서비스가 변하면 컨트롤러도 영향을 받음
  • 의존성을 주입하는 방법: 의존받을 class constructor 내부에서 외부의 class를 사용하는 것으로 구현 가능
@Controller('pur')
export class PurController {
  constructor(private readonly purServices: PurService) {}
}
  • 컨트롤러에서 ‘나는 PurService에게 의존 하겠다!’라고 constructor 내부에 선언
  • 만약 의존하지 않고, controller내부에 함수를 구현했다면? 재사용 하기가 어렵다!

그럼 일단 이 정도하고, 설치가 잘 됐는지 확인부터 해보자!

응답 값을 잘 받아오고 있음을 확인!

오, 근데 그냥 신기한 거 발견

nest g module users
  • 모듈을 만들어주는 명령어!
  • src/users/users.module.ts를 만들어줌!
import { Module } from '@nestjs/common';

@Module({})
export class UsersModule {}
  • 그리고 루트 모듈 imports에도 자동으로 추가되어 있음!
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';

@Module({
  imports: [UsersModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  • 그니깐 users module을 root module에 연동시킴!
nest g controller users
nest g service users

컨트롤러와 서비스도 다 만들 수 있음!
싱기방기 뿡뿡방기........

  • user Module은 이렇게 자동으로 바뀜!
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

실행방법

npm run start

lint와 prettier

  • 프로젝트 생성시 자동으로 설정되어 있음
# Lint and autofix with eslint
$ npm run lint

# Format with prettier
$ npm run format
profile
`나는 ${job} 개발자`

1개의 댓글

comment-user-thumbnail
2024년 11월 27일

언니 드디어 백엔드에 발을 들였구나 ^_^ 빵끗 웃으면서 들어왔자나 ^^77

답글 달기