*몽고디비 자체는 schema-less 디비 이지만 몽구스를 통하여 스키마가 있는것처럼 동작 하는 것 같다
그래서 어플리케이션에서 작성한 스키마 때문에 디비 자체에 데이터가 사라진다거나(sql처럼) 하는 일은 없음
nestjs와 몽구스 사용환경임
두개의 서버와 두개의 디비가 있는 상황
한 아틀라스의 두개의 A디비, B디비가 있는 상황
1번 서버에서 B 디비를 조회 해야되는데
이미 서비스 되고사용되는 디비여서
혹시 1번 서버에서 스키마를 작성하게 되면 뭔가 영향을 미칠꺼 같아서
스키마 없이 find()만 하고 싶었다
근데 스키마 동일하게 작성하면 별 문제 없을꺼 같기도 하다
하튼 그래서 했던 방식은
MongooseModule.forRootAsync({
connectionName: 'A',
imports: [디비모듈], //디비서비스를 프로바이더로 가지고 있는 모듈
inject: [디비서비스], //useFactory로 비동기적으로 옵션 설정해주는 서비스 아래처럼사용
useFactory: (optionService: 디비서비스) => {
return optionsService.createOptions('A');
},
}),
MongooseModule.forRootAsync({
connectionName: 'B',
imports: [디비모듈],
inject: [디비서비스],
useFactory: (optionService: 디비서비스) => {
return optionsService.createOptions('B');
},
}),
미리 정의해둔 createOptions 메서드에 전달되는게 a인지 b인지에 따라
다른 데이터베이스로 연결되게 url을 설정해둠
그다음
원하는 모듈로 가서 forFeature로 원하는 connectionName 적용해서 어떤 디비를 사용할지 써주고
(보통 [] 이 빈 배영 부분에 { name: 엔티티이름, schema: 스키마이름 } 이런식으로 들어가는데 그걸 안해줘도 작동함 나중에 connection.collection()을 사용해서 컬랙션 지정해서 연결함)
@Module({
imports: [MongooseModule.forFeature([], "B")],
exports: [myRepository],
providers: [myRepository],
})
export class myModule {}
서비스나 레포지토리단으로 가서 "@InjectConnection()"을 사용해서 원하는 디비랑 연결할 수 있다
@Injectable()
export class myRepository {
constructor(
@InjectConnection("B")
private readonly connection: Connection,
) {}
async find() {
const result = this.connection.collection('logs');
const data = await result.find();
const res = data.toArray();
return res;
}
}
"@InjectModel()"을 사용하면 매개변수에 Model을 넘겨줘야되는데 model을 만들려면 스키마를 작성해야해서
스키마를 작성안하기 위해서 위와 같은 방법으로 함
이렇게 하면 스키마 적용 안하고 디비에 접근할 수 있다
'TIL,WIL(일간,주간 회고)' 카테고리의 다른 글
[TIL] Etag란 무엇인가? (0) | 2023.08.15 |
---|---|
[TIL]강력새로고침 (0) | 2023.08.15 |
TIL interface 교차타입 (0) | 2023.05.30 |
[vscode]에서 파일 변화 인식 못할 때 (0) | 2023.05.12 |
jest로 Logger.log 테스트 (0) | 2023.04.24 |