해결된 질문
작성
·
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님!
위에서 차례대로 답변을 드리도록 할게요!
ERROR [TypeOrmModule] Unable to connect to the database이 에러가 일어났다 안일어났다가해요.
=> 아무래도 도커를 기반으로 실행을 하신 것 같아요! 도커 mysql 서비스가 활성화 되고 나서, nestjs가 mysql에 연결될 수 있어요!
따라서, 어떨 때는 바로 되고, 어떨 때는 한참 있다가 되고, 어떨 때는 안되고 하는 이유는 도커 mysql이 얼마나 빠르게 활성화가 되느냐에 달려있다고 보시면 될 것 같아요!
그리고 두번째 질문은 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로 놓고 사용합니다.
마지막으로 세번째 질문으로는 dbeaver에서재연결요청을 했을때 Datasource was invalidated
Live connection count: 2/2
이렇게 나오는데 이러면 mysql이 켜져있는 상태인건가요
=> 네 맞아요!, DBeaver에서 초록색으로 체크되어있는 연결된 데이터베이스가 2개라는 뜻입니다!
해당 데이터베이스를 클릭하시고, 마우스오른쪽을 누르신 다음 Refresh를 눌러보세요!
만약, 아직도 연결중이라면 정상적으로 Refresh 되어 진행이 될 것이고, 연결이 해제된 상태라면 에러가 뜨면서 종료가 될 것이랍니다!^^
그러면 dokcer mysql이 아니라 dbeaver에서 연결한 mysql로 작업하고 확인하기위해서는 어떻게 하는게 좋을까요?