개발이야기/Node&Nest

Nest.js + TypeORM 을 적용해보자.

Roslyn 2024. 1. 17. 15:01
반응형

이번에는 Nest.js 프로젝트에 TypeORM을 적용해 보자.

일부 관련된 자료 또는 TypeORM 공식 홈페이지에는 TypeORM의 CLI를 이용한 프로젝트 생성방법이 거론되고 있는데, 우리는 Nest를 이용해서 프로젝트를 생성할 것임으로 굳이 TypeORM을 글로벌로 설치할 필요는 없다.

 

먼저 현재 프로젝트에 설치부터 해주자.

npm install typeorm reflect-metadata @nestjs/typeorm

 

reflect-metadata는 TypeScript에서 데코레이터 메타데이터를 사용하는 데 필요한 라이브러리입니다.
TypeScript는 데코레이터를 지원하는데, 이를 사용하면 클래스와 클래스 멤버에 메타데이터를 연결할 수 있습니다. TypeORM은 이러한 데코레이터를 사용하여 엔터티와 관련된 메타데이터를 정의하고 이를 기반으로 데이터베이스와 상호 작용합니다.

 

이제 TypeORM을 설치했으니, 이를 이용할 Entity를 만들어 봅시다.

TypeORM은 Entity단위로 데이터베이스를 핸들링하므로, TypeORM에서 사용할 Entity를 먼저 작성해 줘야 한다.

src 폴더 밑에 entities 폴더를 하나 만들고, 거기에 user.entity.ts 파일을 추가한 다음, 다음 내용을 작성해 주자.

// src/user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  age: number;
}

 

그리고 참조하는 import가 너무 방대해 지지 않고, 묶어서 호출할 수 있도록 index.ts 파일을 entities 에 하나 만들자.

import { User } from "./user.entity";
export { User}

 

이제 Entity를 만들었으니, TypeORM을 설정해보자.

먼저 app.module.ts 파일을 열어 imports에 다음 내용을 작성하자.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mssql',
      host: 'localhost',
      port: 1433,
      username: 'tester',
      password: '1q2w3e4r',
      database: 'Test',
      entities: [User],
      synchronize: true,
      extra: {
        options: {
          encrypt: false,
          TrustServerCertificate: true,
        },
      },
    }),
    TypeOrmModule.forFeature([User]),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

 

이 다음에는 controller와 service가 필요하게 되는데, nest는 CLI를 통해 손쉽게 conroller와 service 를 추가할 수 있다.

nest generate service user
nest generate controller user

 

위와 같이 generate 명령어를 써서 user 요소를 추가하면, user라는 폴더가 추가되고 그 밑으로 controller와 service가 자동으로 생성된다.

처음에는 그저 단순한 기본 코드가 다음과 같이 추가된다.

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

@Controller('user')
export class UserController {}

 

이 내용을 다음과 같이 수정해 주자.

// src/user.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from '../entities';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  async createUser(@Body() createUserDto: { name: string; age: number }): Promise<User> {
    return await this.userService.createUser(createUserDto.name, createUserDto.age);
  }

  @Get()
  async findAllUsers(): Promise<User[]> {
    return await this.userService.findAllUsers();
  }
}

 

이번에는 user.service.ts 파일을 수정해 주자.

 

// src/user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from '../entities';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private readonly userRepository: Repository<User>,
  ) {}

  async createUser(name: string, age: number): Promise<User> {
    const user = this.userRepository.create({ name, age });
    return await this.userRepository.save(user);
  }

  async findAllUsers(): Promise<User[]> {
    return await this.userRepository.find();
  }
}

 

이렇게 수정한 다음 app.module.ts 파일을 열어보면 generate 명령에 의해 추가된 코드를 확인해 볼 수 있다.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities';
import { UserService } from './user/user.service';
import { UserController } from './user/user.controller';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mssql',
      host: 'localhost',
      port: 1433,
      username: 'tester',
      password: '1q2w3e4r',
      database: 'Test',
      entities: [User],
      synchronize: true,
      extra: {
        options: {
          encrypt: false,
          TrustServerCertificate: true,
        },
      },
    }),
    TypeOrmModule.forFeature([User]),
  ],
  controllers: [AppController, UserController],
  providers: [AppService, UserService],
})
export class AppModule {}

 

보다 시피 UserController과 UserService가 자동으로 추가되어 있다.

 

이제 서버를 실행시켜 보면, Swagger에 user 테이블을 조회하는 API가 추가된 것을 볼 수 있다.

 

동작은 잘되고 있으며, 실제 DB에도 보면 테이블이 자동으로 추가된 모습을 볼 수 있다.

 

 

이로써 Nest.js에 TypeORM을 연동하는 기본 코드를 알아보았다.

반응형