인프런 커뮤니티 질문&답변

jay kang님의 프로필 이미지

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

08-05 게시판 CRUD API

ERROR [TypeOrmModule] Unable to connect to the database

해결된 질문

작성

·

2.2K

0

 ERROR [TypeOrmModule] Unable to connect to the database이 에러가 일어났다 안일어났다가해요.

 

nestjs에서 typeorm으로 mysql에 table entity를 저장해주는 과정에서 db에 접속이 안되었다. 1. TypeOrmModul.forRoot안의 오타확인 -> 없었다 2. Entity에 이상이 있는지확인 -> 없었다 3. 구글링에서는 대부분이 오타문제이거나 데이터베이스를 생성해주지않았다는 문제라고했다 -> 데이터베이스도 켜져있었고 티미널이랑 dbeaver에서도 mysql과 접속이 되고있는것으로 확인 4. 컴퓨터가 버그로 안되는 걸로 예상해 잠시 종료했다가 실행 -> 역시안됐다 5. 비밀번호를 숫자로 입력해서 string이아닌 number형식으로 작성했는데 password는 string 타입만 작성가능하다고 오류가나왔다 - 문제해결 -> root 비밀번호를 string타입으로 변경하니까 오류가 해결되었다 -> 숫자로 입력하니 넘어오는 과정에서 숫자가 string형태로 변경되어 접속오류로 판명 -> 비밀번호는 문자열로.....

-> 이게 전날에 연결이 안되어서 해본결과였고 오늘 했을때에는 연결이되었는데 두번째 접속을 하니까 연결이 안되서

dbeaver에서랑 터미널에서 접속을 했을때는 문제가 없었습니다.

왜계속해서 이런오류가 불규칙적으로 일어나는지 모르겠습니다.

그리고 두번째 질문은 nestjs독스에서는 synchronize: true,이부분을 false로 권장하고있는데 그이유로는 데이터 손상?유실이 있을수있다고 써져있는데 수업중에는 true로되어야지 동기화가 된다고 하셔서 이부분도 설명 부탁드릴수있을까요

마지막으로 세번째 질문으로는 dbeaver에서재연결요청을 했을때 Datasource was invalidated

Live connection count: 2/2

이렇게 나오는데 이러면 mysql이 켜져있는 상태인건가요? 해당 database는 다볼수있는데 offline인데 그전에 연결이되서 볼수있는건가하는 의심이 들어서질문드렸습니다

import { ApolloDriver, ApolloDriverConfig as ad } from '@nestjs/apollo';
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { BoardsModule } from './apis/boards/boards.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Board } from './apis/boards/entities/board.entity';

@Module({
  imports: [
    BoardsModule,
    // ProductsModule,
    // UsersModule,
    GraphQLModule.forRoot<ad>({
      // forRoot의 데이터타입지정 <> -> 제네릭 부분
      driver: ApolloDriver,
      autoSchemaFile: 'src/commons/graphql/schema.gql', // 자동으로 스키마 파일을 생성 .gql로마무리 해주기
      // 실행은 package.json이 있는 위치에선
      // graphql은 스키마 파일이 있어야 실행이 가능하다
      // 자동이든 직접 작성하든 작성해주어야한다.
    }),
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost', // 도커할때는 네임레졸루션이 들어가야함
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'myproject',
      entities: [Board], // 해당하는 테이블을 작성
      logging: true, // 어떻게 변형되어서 넘어가는지 디버깅
      synchronize: true, // entity.ts와 db를 동기화 해주는 작업
    }),
  ], // 합치는 부분
})
export class AppModule {}

답변 1

0

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! Daon님!

위에서 차례대로 답변을 드리도록 할게요!

  1. ERROR [TypeOrmModule] Unable to connect to the database이 에러가 일어났다 안일어났다가해요.

    => 아무래도 도커를 기반으로 실행을 하신 것 같아요! 도커 mysql 서비스가 활성화 되고 나서, nestjs가 mysql에 연결될 수 있어요!

    따라서, 어떨 때는 바로 되고, 어떨 때는 한참 있다가 되고, 어떨 때는 안되고 하는 이유는 도커 mysql이 얼마나 빠르게 활성화가 되느냐에 달려있다고 보시면 될 것 같아요!

     

  2. 그리고 두번째 질문은 nestjs독스에서는 synchronize: true,이부분을 false로 권장하고있는데 그이유로는 데이터 손상?유실이 있을수있다고 써져있는데 수업중에는 true로되어야지 동기화가 된다고 하셔서 이부분도 설명 부탁드릴수있을까요

    => 실제 서비스를 운영(production 모드라고 불러요)함에 있어서는 synchronize: false로 놓고 사용합니다.
    그러면 동기화를 어떻게 하나요? 이 부분은 최초 1회만 synchronize: true로 전체 동기화를 시키고, 이후부터는 false로 진행하게 돼요!
    (이후부터 변경되는 데이터베이스 구조에 대해서는 SQL 쿼리문을 직접 전송하여 변경합니다. 이와 관련하여서는 typeorm db migration - https://typeorm.io/migrations#creating-a-new-migration 을 참고해 주세요)

    그러면 이제, 왜 synchronize: true로 자동화하지 않고 일일이 직접 봐줘야하는가에 대해서 아주 간단한 예시만 하나 들어드릴게요!

    [예시] 
    컬럼이 3개(email, password, name) 있는 User 테이블에 10명의 데이터가 있습니다.
    여기서 name을 myname으로 바꾸고 synchronize: true 하면 어떻게 될까요?
    컴퓨터는 name이 myname으로 바뀌었는지 모릅니다.
    name을 삭제하고 myname을 새로 만들 뿐이죠.
    따라서, 10명의 name이 날라가겠죠?!

    이러한 이유에서, 실제 운영되고 있는 서비스에서는 synchronize: false로 놓고 사용합니다.

     

  3. 마지막으로 세번째 질문으로는 dbeaver에서재연결요청을 했을때 Datasource was invalidated

    Live connection count: 2/2

    이렇게 나오는데 이러면 mysql이 켜져있는 상태인건가요
    => 네 맞아요!, DBeaver에서 초록색으로 체크되어있는 연결된 데이터베이스가 2개라는 뜻입니다!
    해당 데이터베이스를 클릭하시고, 마우스오른쪽을 누르신 다음 Refresh를 눌러보세요!
    만약, 아직도 연결중이라면 정상적으로 Refresh 되어 진행이 될 것이고, 연결이 해제된 상태라면 에러가 뜨면서 종료가 될 것이랍니다!^^

jay kang님의 프로필 이미지
jay kang
질문자

그러면 dokcer mysql이 아니라 dbeaver에서 연결한 mysql로 작업하고 확인하기위해서는 어떻게 하는게 좋을까요?

노원두님의 프로필 이미지
노원두
지식공유자

네! Daon님!

도커이든 로컬이든 상관 없이 해당 mysql이 실행되고 나서 nestjs를 켜신다던가, dbeaver 접속을 시도해 주세요!

jay kang님의 프로필 이미지

작성한 질문수

질문하기