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

Haewoong Lee님의 프로필 이미지

작성한 질문수

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

section 29 예제 코드 오류

해결된 질문

작성

·

280

·

수정됨

0

안녕하세요. section29까지 수강을 다 진행하였는데요.

예제 코드 관련 오류가 있어 질문드립니다.

예제코드가 데이터베이스 처음 만든 상태에서는 괜찮은데 데이터베이스에 데이터를 넣고 코드를 수정하면 아래와 같은 오류가 나옵니다.

query failed: ALTER TABLE `product_saleslocation` ADD `id` varchar(36) NOT NULL PRIMARY KEY
error: Error: Duplicate entry '' for key 'product_saleslocation.PRIMARY'
query: ROLLBACK
[Nest] 33022  - 05/21/2023, 12:47:43 PM   ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
QueryFailedError: Duplicate entry '' for key 'product_saleslocation.PRIMARY'

그리고 DBeaver로 확인하면 product_saleslocation의 기본키인 "id"가 자동으로 삭제되어 있습니다. product_saleslocation의 비정상적인 데이터를 삭제해도 다른 테이블의 기본키에서도 동일한 오류가 발생합니다. 코드를 단순히 주석만 삭제하고 저장해도 프로젝트가 재실행되고 나서 저런 오류가 발생합니다. 프로젝트가 재실행될 때마다 DB에 자동적으로 뭔가 데이터 수정 작업을 하는거 같은데 아무 요청도 안 했는데 DB에 수정이 일어나는 이유를 모르겠습니다.

답변 1

1

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

안녕하세요! Haewoong님!

 

app.module.ts 파일에서 데이터베이스 설정시에 synchronize: true를 추가하였기 때문에,

소스코드가 수정되고 저장을 할 때마다 모든 entity를 바탕으로 테이블을 생성하려고 시도합니다!

물론, 개발하기 편하게 하기 위하여 현재, synchronize: true를 진행하고 있지만, 추후에 실제 배포를 하는 경우에는 synchronize: false로 만들어 주셔야겠죠?!

 

따라서, 저장하면서 synchronize: true가 작동하므로 다시 모든 테이블을 생성하려고 하는데, 이 때, product_saleslocation 테이블도 생성하려고 시도하는 것 같아요(id는 primary 컬럼으로 설정해서 시도하는 것 같네요!)

이 과정에서, 기존에 이미 id컬럼에 중복되는 값이 저장이 되어있는 상태인지라, primary 컬럼으로 id를 설정할 수 없다는 에러를 의미하는 것 같습니다!

제가 실제 소스코드를 보고있진 않으므로, 제 추측이 틀렸을 수도 있어요!

 

만약, 이 방법으로 해결이 되지 않는다면, DBeaver에서 모든 테이블을 삭제하고 다시 시도해주세요!

Haewoong Lee님의 프로필 이미지
Haewoong Lee
질문자

상세한 답변 감사합니다~

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

답변을 추가합니다!

synchronize: true를 붙이면 entity와 테이블을 동기화 시키는 것은 맞지만, 이미 있는 컬럼을 삭제하진 않는데 현재 typeorm 최신 버전에 문제가 좀 있는 것 같습니다!

typeorm 관련된 버전을 아래와 같이 일치시켜 주시고, node_modules와 yarn.lock파일을 삭제하시고 다시 실행시켜 주세요!

"@nestjs/typeorm": "^9.0.1"
"mysql2": "3.2.0",   
"typeorm": "0.3.12"