프로그래밍/Nest.js

Nest.js에서 TypeORM을 활용한 데이터베이스 통합 가이드

shimdh 2025. 3. 17. 10:05
728x90

Nest.js는 현대적인 웹 애플리케이션 개발을 위한 강력한 프레임워크로, TypeORM과 함께 사용하면 데이터베이스 통합이 매우 간편해집니다. 이번 포스트에서는 TypeORM의 기본 개념과 Nest.js에서의 설정 및 활용 방법에 대해 자세히 알아보겠습니다.

TypeORM 소개

TypeORM은 JavaScript 및 TypeScript를 위한 ORM(Object-Relational Mapping) 라이브러리로, SQL 기반 데이터베이스와의 상호작용을 쉽게 만들어 줍니다. TypeORM의 주요 기능은 다음과 같습니다:

  • 데이터 모델링: 클래스를 통해 데이터베이스 테이블의 구조를 정의할 수 있어, 데이터베이스 설계가 직관적이고 관리하기 쉬워집니다.
  • CRUD 작업: Create, Read, Update, Delete 작업을 간단한 메서드로 수행할 수 있어, 복잡한 SQL 쿼리를 작성할 필요가 없습니다.
  • 쿼리 빌더: 복잡한 SQL 쿼리를 작성하지 않고도 다양한 쿼리를 생성할 수 있는 API를 제공합니다.

Nest.js에서 TypeORM 설치 및 설정

Nest.js 프로젝트에 TypeORM을 추가하는 과정은 다음과 같습니다.

  1. 패키지 설치
    TypeORM과 MySQL 드라이버를 설치합니다. 아래의 명령어를 사용하세요:

    npm install --save @nestjs/typeorm typeorm mysql2
  2. 모듈 설정
    app.module.ts 파일에 TypeOrmModule을 임포트하여 데이터베이스 연결 정보를 설정합니다:

    import { Module } from '@nestjs/common';
    import { TypeOrmModule } from '@nestjs/typeorm';
    
    @Module({
      imports: [
        TypeOrmModule.forRoot({
          type: 'mysql',
          host: 'localhost',
          port: 3306,
          username: 'root',
          password: '비밀번호',
          database: 'test_db',
          entities: [__dirname + '/**/*.entity{.ts,.js}'],
          synchronize: true,
        }),
      ],
    })
    export class AppModule {}
  3. 엔티티 정의
    데이터베이스 테이블과 매핑되는 클래스를 정의합니다. 예를 들어, User 엔티티는 다음과 같이 작성할 수 있습니다:

    import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
    
    @Entity()
    export class User {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      name: string;
    
      @Column()
      email: string;
    }
  4. 서비스 및 컨트롤러 생성
    CRUD 작업을 수행하기 위해 서비스를 만들고 이를 컨트롤러와 연결합니다. 서비스는 데이터베이스와의 상호작용을 담당합니다:

    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Repository } from 'typeorm';
    import { User } from './user.entity';
    
    @Injectable()
    export class UserService {
      constructor(
        @InjectRepository(User)
        private userRepository: Repository<User>,
      ) {}
    
      create(userData): Promise<User> {
        const user = this.userRepository.create(userData);
        return this.userRepository.save(user);
      }
    
      findAll(): Promise<User[]> {
        return this.userRepository.find();
      }
    }
  5. 컨트롤러 예시
    사용자 요청을 처리하는 컨트롤러를 만듭니다. 아래 코드는 사용자 정보를 추가하고 조회하는 엔드포인트를 정의합니다:

    import { Controller, Get, Post, Body } from '@nestjs/common';
    import { UserService } from './user.service';
    
    @Controller('users')
    export class UserController {
      constructor(private readonly userService: UserService) {}
    
      @Post()
      async create(@Body() userData) {
        return await this.userService.create(userData);
      }
    
      @Get()
      async findAll() {
        return await this.userService.findAll();
      }
    }

실습 예제

이제 실제로 사용자 정보를 추가하고 조회하는 간단한 API를 구성해보겠습니다. 서버를 실행한 후, Postman 또는 Curl 등을 사용하여 POST 요청으로 사용자 정보를 추가합니다:

  • POST 요청:
    POST http://localhost:<port>/users
    {
      "name": "홍길동",
      "email": "hong@example.com"
    }

이 요청을 통해 새로운 사용자가 데이터베이스에 추가됩니다. 이후 GET 요청을 통해 모든 사용자 정보를 조회할 수 있습니다:

  • GET 요청:
    GET http://localhost:<port>/users

위 요청을 통해 등록된 모든 사용자의 목록이 반환됩니다.

결론

TypeORM은 Nest.js 애플리케이션에서 관계형 데이터베이스와 효과적으로 통신할 수 있게 해주는 강력한 도구입니다. 위에서 설명한 내용을 바탕으로 여러분의 프로젝트에 맞춰 TypeORM을 적절히 활용하실 수 있을 것입니다. 데이터베이스 통합을 통해 애플리케이션의 데이터 관리가 더욱 효율적이고 체계적으로 이루어질 수 있기를 바랍니다.

728x90