Sequelize를 사용하면서 개발 초기에 테이블의 스키마를 자동으로 동기화하기 위해 sequelize.sync({ alter: true })
를 사용했다. 이 옵션은 기존 테이블을 수정하면서 새로운 필드나 변경 사항을 반영해 주는 유용한 기능이지만, 반복적으로 실행하면서 예상치 못한 문제가 발생했다.
alter: true
옵션을 사용한 상태에서 여러 번 sequelize.sync()
를 실행했더니, 데이터베이스 테이블에 설정된 인덱스가 점점 누적되었다. 결국 특정 테이블의 인덱스 개수가 64개를 초과하며 아래와 같은 오류가 발생했다:
Error: Too many indexes on table 'your_table_name'; the limit is 64
해당 문제는 테이블에 이미 존재하는 인덱스와 새로운 인덱스가 계속 추가되는 방식으로 동작하기 때문이다. sequelize.sync()
가 테이블 스키마를 업데이트하면서 인덱스를 중복 생성하는 구조적 한계를 드러낸 것이다.
sequelize.sync({ alter: true })
는 다음과 같이 작동한다.
이 과정을 반복 실행하면 인덱스가 계속 누적되면서 데이터베이스의 인덱스 제한에 도달하게 된다.
alter
대신 force
옵션 사용
force: true
옵션은 테이블을 완전히 삭제하고 다시 생성한다.await sequelize.sync({ force: true });
이 방법은 반복 실행 시에도 인덱스가 누적되지 않으며, 테이블 정의와 인덱스가 항상 모델과 일치하도록 보장한다.
인덱스 관리 로직 추가
sequelize.sync()
를 사용하지 않고, 데이터베이스 마이그레이션 도구(예: Sequelize CLI)를 활용해 명시적으로 인덱스를 관리한다.// 예: 마이그레이션 파일에서 인덱스 추가
await queryInterface.addIndex('your_table', ['your_column'], {
name: 'your_index_name',
unique: true,
});
sequelize.sync({ alter: true })
는 빠르고 간편한 옵션이지만, 반복 실행 시 예상치 못한 부작용을 초래할 수 있다. 특히 인덱스 누적 문제는 예기치 못한 영향을 미칠 수 있으므로 주의가 필요하다.
개발 환경에서는 force: true
옵션을 사용하거나, 프로덕션 환경에서는 명시적으로 마이그레이션 도구를 활용해 데이터베이스를 관리하는 것이 좋겠다.