🛫

데이터베이스 일부 테이블 특정 컬럼이 초기화 되는 문제 (1)

프론트엔드 테스트 중, 특정 기능이 예상대로 작동하지 않는 오류가 발생했습니다. 문제의 원인을 조사하던 중, 데이터베이스의 특정 컬럼이 사라진 것을 발견했습니다. 이로 인해 데이터베이스와 관련된 여러 기능이 정상적으로 동작하지 않았습니다.

데이터베이스 컬럼이 사라진 이유를 조사한 결과, 다음과 같은 가능성을 고려할 수 있었습니다

1.
잘못된 스키마 변경:
- 개발자가 ALTER TABLE 명령어를 잘못 사용해 컬럼을 삭제했을 가능성이 있습니다. 특히, 마이그레이션 과정에서 오류가 발생할 수 있으며, 이러한 오류는 컬럼의 삭제로 이어질 수 있습니다.
2.
동시 작업 및 동기화 문제:
- 여러 개발자가 동일한 데이터베이스 스키마를 동시에 변경하거나, 다른 버전의 엔티티를 사용하여 데이터베이스가 일관성을 잃고 컬럼이 삭제될 가능성이 있습니다. 특히, 팀 내에서 동일한 데이터베이스를 공유하는 환경에서 이러한 문제는 더욱 발생하기 쉽습니다.
3.
자동화된 마이그레이션 도구의 오류:
- 데이터베이스 마이그레이션 도구를 사용하는 경우, 마이그레이션 스크립트에서 발생한 오류로 인해 컬럼이 잘못 삭제되거나 데이터베이스 구조가 예상치 못한 방식으로 변경될 수 있습니다.
조사 과정에서 TypeORM의 synchronize: true 설정이 문제의 주요 원인일 가능성이 높다고 판단했지만, 컬럼 삭제의 정확한 원인을 명확히 규명할 수 있는 단서를 찾지 못했습니다. 다만, 이 설정이 활성화된 상태에서는 애플리케이션이 실행될 때마다 데이터베이스 스키마가 자동으로 동기화되며, 개발 중 변경된 엔티티가 실수로 데이터베이스에 반영되어 컬럼이 삭제될 가능성이 있다고 추정했습니다.
synchronize: configService.get('DB_SYNC')
TypeScript
복사

해결 방법

1.
AWS를 사용하는 경우 AWS MySQL Log 확인하기 - RDS를 사용하는 경우, MySQL의 로그(특히 binlog)를 확인하여 어떤 SQL 명령어가 실행되었고, 어떤 시점에 문제가 발생했는지 추적 가능하고 정확한 원인을 찾는 데 도움이 됩니다.
2.
개발 환경에는 DB는 각자 다른 DB를 사용하기 - 각자의 환경에서 발생하는 스키마 변경이 다른 개발자에게 영향을 미치지 않도록 할 수 있습니다. 추가로 Docker를 활용해 각자의 개발 환경을 컨테이너화하고, 모든 사람이 동일한 환경에서 개발하되, 서로 다른 데이터베이스 인스턴스를 사용하도록 설정할 수 있습니다.
3.
synchronize 설정을 false로 변경하고 마이그레이션 사용하기 - synchronize: true 설정을 개발 환경에서도 false로 변경하고, 데이터베이스 스키마 변경은 반드시 마이그레이션 도구를 사용하여 관리합니다. 이렇게 하면 스키마 변경이 명시적으로 관리되고, 예상치 못한 스키마 변경이나 데이터 손실을 방지할 수 있습니다.
마이그레이션 파일 생성
npx typeorm migration:generate -n MigrationName
JavaScript
복사
마이그레이션 파일을 실행하여 스키마 변경 적용
npx typeorm migration:run
JavaScript
복사