커넥션 테스트 준비
(현재 글은 typeorm 0.3.21 버전, mysql 8.0 버전을 토대로 작성하였습니다.)
저는 NestJS 프레임워크에서 typeorm을 활용하여 데이터베이스 작업을 진행하고 있습니다. 그리고 typeorm과 관련된 설정에서 connection pool과 관련된 설정은 어떠한 것도 수정하지 않았습니다. 이때 typeorm에서 데이터베이스와 연결되는 커넥션 수가 궁금하여 다음과 같은 테스트를 진행하였습니다.
- 커넥션 수 확인
- nest js 어플리케이션 실행 후 커넥션 수 확인
- nest js 서비스 코드 중 데이터베이스에 한 번 CRUD 작업을 진행하는 메서드 실행 후 커넥션 확인
- nest js 서비스 코드 중 데이터베이스에 여러 번 CRUD 작업을 진행하는 메서드 실행 후 커넥션 확인
이때 사용한 서비스 코드는 다음과 같습니다.
// 서비스 코드 중 일부
async updateTest() {
// 데이터베이스에 데이터 수정하는 로직
}
async concurrencyProblem() {
await Promise.all([
this.updateTest(),
this.updateTest(),
... // 20번 반복
]);
}
해당 코드에서 concurrencyProblem 메서드를 실행해서 데이터베이스 작업인 updateTest 메서드를 여러번 실행시켰습니다.
커넥션 테스트 결과
테스트 결과는 다음과 같습니다.
1. 커넥션 수 확인
커넥션 수는 아래 쿼리를 통해 확인했습니다.
SHOW PROCESSLIST;
해당 쿼리로 실행된 프로세스 하나만 존재하는 것을 확인할 수 있습니다.
2. nest js 어플리케이션 실행 후 커넥션 수 확인
nest js 어플리케이션 실행 후에는 typeorm으로 인해 커넥션이 하나 생성되면서 프로세스도 하나 추가된 모습을 확인할 수 있습니다.
3. nest js 서비스 코드 중 데이터베이스에 한 번 CRUD 작업을 진행하는 메서드 실행 후 커넥션 확인
nest js에서 특정 API를 호출해 서비스 코드에 설정한 데이터베이스 관련 CRUD 작업을 한 번 실행합니다. 그럼 위와 같이 이미 nest js 어플리케이션 실행 시 생성된 커넥션을 그대로 활용하기 때문에 추가적인 프로세스는 생성되지 않은 모습을 확인할 수 있습니다. 단순히 해당 커넥션의 Time 부분이 다시 0초로 바뀌었다가 카운트되는 모습을 확인할 수 있습니다.
4. nest js 서비스 코드 중 데이터베이스에 여러 번 CRUD 작업을 진행하는 메서드 실행 후 커넥션 확인
이번엔 nest js에서 데이터베이스 작업을 20번 연속해서 실행하는 메서드에 요청을 보냅니다. 그럼 위와 같이 총 10개의 데이터베이스 커넥션이 생성된 모습을 확인할 수 있습니다. 이때 궁금한 점이 생깁니다. 왜 20번 요청을 보냈는데 커넥션 수는 10개밖에 생기지 않을까요? 이는 typeorm이 사용하는 mysql2 라이브러리의 디폴트 설정인 것으로 추정됩니다. 이때 더 많은 커넥션이 필요하다면 어떻게 해야할까요?
커넥션 관리하기
typeorm에서는 기본적으로 1개의 커넥션만 생성한 채로 이후 추가 커넥션이 필요할 때마다 커넥션을 추가하는 것으로 보입니다. 그리고 이때 최대로 늘어날 수 있는 커넥션 수는 10개로 보입니다.( typeorm 0.3.21, mysql 8.0 사용 시 ) 이때 최대 커넥션 수를 수정하고 싶다면 아래와 같은 옵션을 사용하면 됩니다.
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => ({
type: 'mysql',
host: configService.get<string>('MYSQL_HOST'),
port: configService.get<number>('MYSQL_PORT'),
username: configService.get<string>('MYSQL_USERNAME'),
password: configService.get<string>('MYSQL_PASSWORD'),
database: configService.get<string>('MYSQL_DATABASE'),
...
// ✅ 커넥션 수 설정하기!
extra: {
connectionLimit: 20,
},
}),
}),
위처럼 `extra` 옵션을 통해 최대 커넥션 수를 설정할 수 있습니다.
'데이터베이스, ORM > TypeORM' 카테고리의 다른 글
[TypeORM] 골치 아픈 Distinct 쿼리 피해 소요 시간 줄이기 (0) | 2025.03.22 |
---|---|
[TypeORM] 내가 트랜잭션을 사용하는 이유와 조심해야할 부분 (0) | 2024.12.17 |
[TypeORM] SQL 쿼리 튜닝 - 2. 외래키 정보 join없이 조회하기 (0) | 2024.12.02 |
[TypeORM] SQL 쿼리 튜닝 - 1. findBy VS findOneBy 뭐가 더 좋을까? (0) | 2024.11.25 |
[TypeORM] @OneToMany, @ManyToOne - 옵션: onDelete / onUpdate (0) | 2024.11.23 |