`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`를 사용하여 데이터베이스와의 상호작용을 단순화하고 중앙 집중적으로 관리할 수 있다.