Sequelize Sync를 반복 실행하며 발생한 인덱스 누적 문제

FeelsBotMan·2024년 12월 19일
1

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 })는 다음과 같이 작동한다.

  1. 데이터베이스의 기존 테이블 구조와 모델 정의를 비교
  2. 차이가 발견되면, 테이블 구조를 업데이트
  3. 인덱스와 같은 제약 조건도 업데이트 대상에 포함
  4. 기존 인덱스를 삭제하지 않고 새롭게 추가하기 때문에 동일한 필드에 대해 중복된 인덱스가 생성될 수 있다.

이 과정을 반복 실행하면 인덱스가 계속 누적되면서 데이터베이스의 인덱스 제한에 도달하게 된다.


해결 방법

  1. alter 대신 force 옵션 사용

    • force: true 옵션은 테이블을 완전히 삭제하고 다시 생성한다.
    • 기존 데이터도 모두 삭제되므로 초기 개발 환경이나 데이터가 없어도 되는 상황에서만 사용 가능하다.
    await sequelize.sync({ force: true });

    이 방법은 반복 실행 시에도 인덱스가 누적되지 않으며, 테이블 정의와 인덱스가 항상 모델과 일치하도록 보장한다.

  2. 인덱스 관리 로직 추가

    • sequelize.sync()를 사용하지 않고, 데이터베이스 마이그레이션 도구(예: Sequelize CLI)를 활용해 명시적으로 인덱스를 관리한다.
    • 기존 인덱스를 삭제하거나 필요한 경우에만 추가하도록 설계한다.
    // 예: 마이그레이션 파일에서 인덱스 추가
    await queryInterface.addIndex('your_table', ['your_column'], {
      name: 'your_index_name',
      unique: true,
    });

결론

sequelize.sync({ alter: true })는 빠르고 간편한 옵션이지만, 반복 실행 시 예상치 못한 부작용을 초래할 수 있다. 특히 인덱스 누적 문제는 예기치 못한 영향을 미칠 수 있으므로 주의가 필요하다.

개발 환경에서는 force: true 옵션을 사용하거나, 프로덕션 환경에서는 명시적으로 마이그레이션 도구를 활용해 데이터베이스를 관리하는 것이 좋겠다.

profile
안드로이드 페페

0개의 댓글