본문 바로가기

Development/nestJS

DataSource

`DataSource`는 NestJS에서 데이터베이스 연결과 관련된 작업을 처리하기 위해 사용되는 클래스이다.

이 클래스는 `@nestjs/typeorm` 패키지에서 제공되며, `typeorm` 패키지의 `Connection` 객체를 래핑하여

NestJS 애플리케이션과 데이터베이스 간의 상호작용을 쉽게 구성하고 관리할 수 있게 해준다.

 

 


DataSource 역할

1. 데이터베이스 연결 설정:

데이터베이스에 연결하고 연결 옵션을 구성할 수 있다.

이를 통해 데이터베이스 호스트, 포트, 사용자 이름, 암호 등과 같은 연결 세부 정보를 제공할 수 있다.

 

예시 코드 (TypeORM, PostgresSQL 기준)

  • type은 사용하는 데이터베이스의 유형
  • host, port, username, password, database는 데이터베이스 연결에 필요한 정보
  • entities는 엔티티 클래스들의 경로 지정
  • synchronize는 서버 시작 시 데이터베이스 스키마를 자동으로 동기화할지 여부 설정
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'your_username',
      password: 'your_password',
      database: 'your_database',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
  ],
})
export class DatabaseModule {}

위와 같이 코드를 작성 후 해당 모듈을 AppModule 또는 다른 필요한 모듈에 임포트하여 데이터베이스 연결을 설정한다.

import { Module } from '@nestjs/common';
import { DatabaseModule } from './database.module';

@Module({
  imports: [DatabaseModule],
})
export class AppModule {}



2. 트랜잭션 관리:

트랜잭션을 시작하고 커밋 또는 롤백하는 것이 가능하다. 이를 통해 여러 데이터베이스 작업을 한 단위로 묶어서 원자성을 보장하고, 데이터의 일관성과 무결성을 유지할 수 있다.

 

예시코드

@Injectable()
export class UsersService {
  constructor(private dataSource: DataSource) {}
  
  async createMany(users: User[]) {
  const queryRunner = this.dataSource.createQueryRunner();

  await queryRunner.connect();
  await queryRunner.startTransaction();
  try {
    await queryRunner.manager.save(users[0]);
    await queryRunner.manager.save(users[1]);

    await queryRunner.commitTransaction();
  } catch (err) {
    await queryRunner.rollbackTransaction();
  } finally {
    await queryRunner.release();
  }
}
}

 


3. 쿼리 실행:

데이터베이스에서 쿼리를 실행할 수 있습니다. `Connection` 객체를 사용하여 SQL 또는 ORM(Object-Relational Mapping) 쿼리를 작성하고 실행할 수 있다. 이를 통해 데이터의 조회, 삽입, 갱신, 삭제 등 다양한 데이터베이스 작업을 수행할 수 있다.

 

예시 코드

@InjectRepository(User) 데코레이터를 사용하여 User 엔티티의 레포지토리를 주입받는다.

그런 다음 findAll, findById, create, update, delete와 같은 메서드를 사용하여 쿼리를 실행한다.

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>,
  ) {}

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

  async findById(id: number): Promise<User> {
    return this.userRepository.findOne(id);
  }

  async create(user: User): Promise<User> {
    return this.userRepository.save(user);
  }

  async update(id: number, user: User): Promise<User> {
    await this.userRepository.update(id, user);
    return this.userRepository.findOne(id);
  }

  async delete(id: number): Promise<void> {
    await this.userRepository.delete(id);
  }
}



4. 데이터베이스 연결 관리:

데이터베이스 연결을 관리할 수 있습니다. 애플리케이션에서 필요한 경우에만 연결을 생성하고 유지하며, 사용이 완료된 연결을 해제할 수 있다. 이를 통해 리소스의 효율적인 사용과 동시에 연결 풀링을 지원할 수 있다.

`DataSource`는 주입되는 `Connection` 객체를 기반으로 동작하며, `typeorm` 패키지의 기능을 보다 쉽게 사용할 수 있도록 추상화된 인터페이스를 제공한다. NestJS에서는 `DataSource`를 사용하여 데이터베이스와의 상호작용을 단순화하고 중앙 집중적으로 관리할 수 있다.