본문 바로가기
framework/nest.js

nest install

by choi-dev 2025. 4. 23.

간단한 사이드 프로젝트 구현을 위해 지난 번에는 docker-compose를 통해 mysql 컨테이너를 빌드했다. 이후로도 접근이 잘 되고 있고 이제는 프레임워크와 직접 연결하고 간단한 스키마를 구성하면서 진행해보려고 한다.

 

# 1. Nest 설치

https://docs.nestjs.com/first-steps

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

설치는 직접 적어서 뭘 하나하나 하는거보다 그냥 공식 문서를 참고하는 것이 가장 좋다. 설치를 완료했으면 기본적으로 src 내부에 App과 관련되서 무언가 디폴트로 설치되어있을 것이다.

 

나는 디폴트로 된 것은 사용하지 않을 예정이어서 삭제했고 app.module.ts만 루트로 옮겼다. 이 모듈을 통해 전체적인 각 서비스별 모듈을 관리하여 동작할 수 있도록 만들 것이다.

 

# 2. MySQL 의존성 적용

npm install mysql2

일단 도커를 통해 빌드해둔 MySQL 컨테이너와 상호작용을 진행하기 위해서 mysql2 라이브러리를 설치했다

 

npm install dotenv

그리고 환경변수에 작성하기 위해서 dotenv 라이브러리도 설치해주었다.

 

npm install typeorm @nestjs/typeorm

나는 여기서 typeorm을 사용해서 DDL, DML 등의 질의어를 사용할 예정인데 이건 어떤 라이브러리를 사용해도 상관없다. knex, mybatis-mapper, ... 다양한 라이브러리들이 존재하니 이건 본인이 알아보고 사용할 것을 추천한다.

 

import { DataSource } from "typeorm";

import * as dotenv from 'dotenv';
dotenv.config();

export const TypeOrmConfig = new DataSource({
  type: 'mysql',
  host: process.env.DB_HOST,
  port: Number(process.env.DB_PORT),
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  entities: ['src/**/*.entity.ts'],
  migrations: ['config/database/migrations/*.ts'],
  synchronize: false,
});

그러고 이제 configuration 파일을 좀 작성해주어야 한다. 일단 기본적으로 추천하는 방식은 app.modue.ts에 직접 config를 작성하는 것이다. 하지만 나는 외부로 빼서 config 파일들을 정리하고 싶어서 뺐다.

 

TypeOrmModule.forRoot({
  ..여기에 객체를 생성
}

아마 구글링을 좀 하다보면 이런 식으로 DB를 연결하는 것도 볼 수 있는데 이거나 저거나 비슷한 맥락이다. 단, typeorm에서 Datasource라고 하는 것은 DB 연결을 직접하거나 마이그레이션 관리 등을 수행해주는 객체이다. 즉, Datasource 객체를 통해서 DB를 직접 연결하고 마이그레이션 또한 관리할 수 있도록 설정했다.

 

 

"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js",
"migration:generate": "npm run typeorm -- migration:generate -d config/database/typeorm.config.ts",
"migration:run": "npm run typeorm -- migration:run -d config/database/typeorm.config.ts",
"migration:revert": "npm run typeorm -- migration:revert -d config/database/typeorm.config.ts"

그 다음, package.json에 다음과 같이 scripts 객체 안에 넣어준다. 마이그레이션 실행 로직에 있는 -d 뒤에는 본인이 작성한 config 파일의 경로를 적으면 된다. 나는 루트에서 config/database라는 곳에 넣어두었다. 이렇게 하면 마이그레이션을 관리할 것까지 완성했다.

 

# 3. 서비스 추가 및 마이그레이션

nest g resource user

나는 이제 user라는 서비스를 추가해서 MVC 패턴을 적용하여 작성할 예정이다. 하나하나 model - view - controller를 구현해도 좋지만 간단하게 이 명령어를 사용해본다. 이렇게 하면 RestAPI, GraphQL, ... 등등에서 어떤 방식의 프로토콜을 사용할 것인지 물어보고 CRUD를 미리 작성해주냐는 질문이 나온다. 이는 본인이 편한대로 한다.

 

그러면 이런 식으로 객체로써 나누어서 파일들이 생성된다. user.entity.ts를 적어보자.

 

import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity('user')
export class User {
  @PrimaryGeneratedColumn({ type: 'bigint' })
  user_idx: number;
}

이렇게 작성했다면 이제 마이그레이션 파일을 생성해보자.

 

npm run migration:generate -- config/database/migrations/user

package.json에 어떻게 적었냐에 따라 달라지긴하지만 위의 과정과 비슷하게 적었다면 실행될 것이다.

 

이런 식으로 성공했다는 문구와 migrations 라는 디렉토리가 생성되고 내부에는 DDL이 자동으로 작성되어있는 것을 확인할 수 있다.

 

npm run migration:run

이제 마이그레이션을 실행해보자.

 

마이그레이션 내역이 다음과 같이 나오고 마지막에 COMMIT이 되었다. DB를 직접 확인해보자.

 

확인해보면 엔티티에 있던 user_idx가 자동으로 마이그레이션되었다.

 

간단하게 nest를 설치했고 이에 대한 마이그레이션 또한 적용하여 확인했다. 새로운 모듈이나 라이브러리 등을 추가하게 되면 또 게시글을 작성해보겠다.

'framework > nest.js' 카테고리의 다른 글

# Prisma vs Kysely  (0) 2025.11.23