[Rails] 다운타임 없이 컬럼 삭제하기

걍은서·2022년 2월 7일
2

Rails

목록 보기
1/1
post-thumbnail

수정중인 글입니다

단일 카테고리를 다중 카테고리로 개편하는 작업을 진행하면서 컬럼을 드랍는 작업도 함께 배포를 나갔는데(레거시 컬럼을 남겨두는 게 너무 싫었다)

rails g migration
class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

이렇게 그냥 마이그레이션 파일만 추가하면 되겠지 싶었으나...
문제가 발생해버렸지 뭐야...

store_packages, operation_product_units, operation_product_unit_histories 테이블 cook_category_id 삭제 시 존재하지 않는 컬럼이라고 이슈 발생

rails에서 column_names, includes 등을 통해서 쿼리해올 경우, 내부적으로 캐싱해둔 스키마 컬럼 정보를 통해서 쿼리해옴. 따라서 컬럼 삭제 및 변경 시, 해당 컬럼을 참조하지 않도록 해야 함.

cook_category_id 컬럼 삭제 시, 서버를 재실행하거나 내부적으로 캐싱해둔 스키마 컬럼 정보가 업데이트 되어야 하는데 바로 적용될 수 없는 구조임.

Model.reset_column_information 실행 시 이 스키마 컬럼 정보가 삭제됨. 하지만, 컬럼을 삭제하는 동시에 해당 코드 실행 필요. 또 서버별로 모두 따로 적용해줘야 하기 때문에 짧은 시간이지만 이슈 발생할 가능성 높음. 좋은 해결 방법 X

모델에 self.ignored_columns = %w(cook_category_id) 추가 시 해당 컬럼에 대해서 아예 참조하지 않음. 해당 컬럼을 코드에서 사용하는 곳이 없으면 컬럼을 지워도 따로 에러 발생하지 않음.

StorePackage.rb, Operation::ProductUnit.rb, Operation::ProductUnitHistory.rb 파일 self.ignored_columns = %w(cook_category_id) 추가

루비 서버 전부 배포

datagrip에서 store_packages, operation_product_units, operation_product_unit_histories 테이블 cook_category_id 삭제

기존 코드로 원복

참고자료


profile
끄적끄적

0개의 댓글