Application을 개발시 여러개의 DB에 접속하여 데이터를 핸들링 해야 하는 경우가 있습니다.
Nestjs에서는 TypeORM의 Multiple Connection을 이용하여 이러한 구현이 가능합니다.
예제에서는 다음과 같이 두개의 database를 사용합니다.
- Database #1 : cat
- Database #2 : slider
Table 정보
사용하는 테이블 생성 정보는 다음과 같습니다.
cat
CREATE TABLE `cat` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL COMMENT '고양이 이름',
`age` int(11) NOT NULL COMMENT '고양이 나이',
`breed` varchar(255) NOT NULL COMMENT '고양이 종류',
PRIMARY KEY (`id`)
);
slider
CREATE TABLE `slider` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_url` varchar(200) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
프로젝트 생성
아래와 같이 프로젝트를 생성합니다.
nest new multi-connection
폴더로 이동 후 Visual Studio Code를 실행합니다.
cd multi-connection
code .
패키지 설치
아래와 같이 TypeORM 패키지를 설치합니다.
yarn add @nestjs/typeorm typeorm mysql2
첫번째 database 연결하기
ORM 설정파일
프로젝트에 orm 환경 설정 파일을 만듭니다.
- 소스 폴더 : src/config/orm.config.ts
import { TypeOrmModuleOptions } from "@nestjs/typeorm";
function ormConfig(): TypeOrmModuleOptions {
return {
name: 'default',
type: 'mysql',
database: 'cat',
host: 'localhost',
port: Number(13306),
username: 'cat',
password: 'cat',
logging: (process.env.NODE_ENV === 'local'),
synchronize: true,
entities: [__dirname + '/domain/*.entity.{ts,js}'],
migrations: [__dirname + '/migrations/**/*.{ts,js}'],
migrationsRun: false,
};
}
function ormConfigSlider(): TypeOrmModuleOptions {
return {
name: 'sliderConnection',
type: 'mysql',
database: 'slider',
host: 'localhost',
port: Number(13306),
username: 'slider',
password: 'slider',
logging: (process.env.NODE_ENV === 'local'),
synchronize: true,
entities: [__dirname + '/domain/*.entity.{ts,js}'],
migrations: [__dirname + '/migrations/**/*.{ts,js}'],
migrationsRun: true,
};
}
export { ormConfig, ormConfigSlider };
orm config import 하기
app.module.ts 에 orm config를 import 합니다.
import { ormConfig } from './config/orm.config';
imports: [
TypeOrmModule.forRootAsync({
useFactory: ormConfig
}),
TypeOrmModule.forRootAsync({
name: 'sliderConnection',
useFactory: ormConfigSlider
})
],
Entity 생성
typeorm-model-generator를 사용해서 테이블에 있는 cat, slider entity를 생성합니다.
사용법은 아래 포스트에서 확인하실 수 있습니다.
https://codegear.tistory.com/122
typeorm-model-generator -h localhost -d cat -p 13306 -u cat -x cat -e mysql -o ./gen_models
typeorm-model-generator -h localhost -d slider -p 13306 -u slider -x slider -e mysql -o ./gen_models
gen_models 폴더에 생성된 entity 파일을 domain 폴더로 복사합니다.
파일 이름을 아래와 같이 변경합니다.(ormConfig에서 설정한 파일명 형식)
Cat.ts -> Cat.entity.ts
Slider.ts -> Slider.entity.ts
Module에 Entity 선언하기
app.module.ts의 import 아래에 다음을 추가합니다.
(TypeOrmModule.forRootAsync 아래에 추가하면 됩니다)
TypeOrmModule.forFeature([Cat]),
TypeOrmModule.forFeature([Slider], 'sliderConnection')
Cat & Slider 데이터 조회하기
app.controller.ts에 다음을 추가합니다.
@Get('/cats')
async getCats(){
return await this.appService.getCats();
}
@Get('/sliders')
async getSliders(){
return await this.appService.getSliders();
}
app.service.ts에 다음을 추가합니다. (getCats, getSliders)
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Cat } from './domain/Cat.entity';
import { Slider } from './domain/Slider.entity';
@Injectable()
export class AppService {
constructor(
@InjectRepository(Cat)
private catRepository: Repository<Cat>,
@InjectRepository(Slider, 'sliderConnection')
private sliderRepository: Repository<Slider>
){}
getHello(): string {
return 'Hello World!';
}
async getCats() {
return await this.catRepository.find();
}
async getSliders() {
return await this.sliderRepository.find();
}
}
브라우저에서 다음을 각각 호출합니다.
http://localhost:3000/cats
http://localhost:3000/sliders
결과는 다음과 같습니다.
[
{
"id":1,
"name":"kitty",
"age":1,
"breed":"cyprus"
},
{
"id":2,
"name":"pitty",
"age":2,
"breed":"percian"
}
]
[
{
"id":1,
"imageUrl":"https://..../images/test.jpg",
"createdAt":"2024-08-19T14:08:20.000Z",
"updatedAt":"2024-08-19T14:08:20.000Z"
}
]
이상으로 Nestjs에서 TypeORM을 사용해서 여러개의 DB를 사용하는 방법에 대해 알아보았습니다.
'Nestjs 활용 동영상강좌' 카테고리의 다른 글
Nestjs 프로젝트를 Docker로 배포하기 (2) | 2022.12.30 |
---|---|
(풀스택) Node(Nest)와 Vue(Nuxt)로 사이트 만들기 - 12.이미지 슬라이드 개발 (0) | 2022.12.20 |
(풀스택) Node(Nest)와 Vue(Nuxt)로 사이트 만들기 - 11.이미지 조회 및 삭제 (0) | 2022.12.18 |
(풀스택) Node(Nest)와 Vue(Nuxt)로 사이트 만들기 - 10.업로드 파일 DB 저장 (0) | 2022.12.11 |
(풀스택) Node(Nest)와 Vue(Nuxt)로 사이트 만들기 - 09.Front에서 S3에 파일 업로드하기 (0) | 2022.10.23 |
(풀스택) Node(Nest)와 Vue(Nuxt)로 사이트 만들기 - 08.AWS S3 설정 (0) | 2022.10.22 |
(풀스택) Node(Nest)와 Vue(Nuxt)로 사이트 만들기 - 07.사용자 권한 관리 (0) | 2022.10.15 |
(풀스택) Node(Nest)와 Vue(Nuxt)로 사이트 만들기 - 06.Front 로그인 (with Jwt Token) (0) | 2022.10.03 |