worldint
mathengi
worldint
전체 방문자
오늘
어제
  • 분류 전체보기 (152)
    • infra, cloud (4)
      • aws (4)
    • TIL,WIL(일간,주간 회고) (57)
    • 컴퓨터 공학 (5)
      • 정보통신 (3)
      • 컴퓨터 구조 (2)
    • Math (1)
      • linear algebra (0)
      • 명제와 집합 (1)
    • Operating System (8)
      • Linux Ubuntu (1)
    • programming (66)
      • c , c++ (9)
      • c# (0)
      • java (2)
      • javascript (14)
      • Python (4)
      • github (1)
      • programing terms (12)
      • html, css (2)
      • docker (3)
      • algorithm_datastructure (5)
      • database (11)
      • flutter(dart) (2)
    • 항해99 부트캠프 (7)
      • 사전교육 (7)
    • 보안관련 (1)

블로그 메뉴

    공지사항

    인기 글

    태그

    • db데드락
    • CloudFront
    • 디비데드락
    • docker
    • node
    • NoSQL
    • MongoDB
    • ec2 #코드디플로이 #리눅스
    • AWS
    • flutter #provider #error
    • nodejs
    • NVM
    • Blue/Green
    • ci/cd
    • EC2
    • Javascript
    • MONGOOSE

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    worldint

    mathengi

    [TIL][mongoose]몽구스 사용하여 스키마작성 안하고 db 연결
    TIL,WIL(일간,주간 회고)

    [TIL][mongoose]몽구스 사용하여 스키마작성 안하고 db 연결

    2023. 8. 10. 18:56

    *몽고디비 자체는 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
      'TIL,WIL(일간,주간 회고)' 카테고리의 다른 글
      • [TIL] Etag란 무엇인가?
      • [TIL]강력새로고침
      • TIL interface 교차타입
      • [vscode]에서 파일 변화 인식 못할 때
      worldint
      worldint
      공부한 내용들, 트러블 슈팅 용 블로그

      티스토리툴바