레거시 데이터 마이그레이션은 기존 Rails 애플리케이션에 외부 데이터를 통합하는 과정입니다. 이 과정은 단순히 데이터베이스 행을 복사하는 것을 넘어 데이터 변환 및 추가 처리(예: 파일 다운로드)를 포함할 수 있습니다.
어댑터 파일 정의
레거시 데이터베이스 연결을 위해 /lib
디렉터리에 별도의 어댑터 파일을 생성합니다. 이 파일에는 ActiveRecord::Base
를 상속받는 부모 클래스(OldBlog
)를 정의하고, self.abstract_class = true
및 establish_connection
을 사용하여 레거시 데이터베이스에 연결합니다.
* readonly?
메서드를 오버라이드하여 모든 모델을 읽기 전용으로 설정합니다.
* 레거시 테이블(예: articles
, users
)에 해당하는 모델을 정의하고, 필요한 경우 사용자 지정 연관 관계(associations) 및 인스턴스 메서드를 추가하여 데이터 접근 편의성을 높입니다. (예: OldBlog::Article
, OldBlog::User
)
고유 교환 키 활용
시스템 간 데이터 동기화를 위해 각 행에 대한 고유한 교환 키가 필수적입니다. 이는 마이그레이션을 주기적으로 재실행할 때 기존 레코드를 식별하거나 새로운 레코드를 생성하는 데 사용됩니다.
* 새로운 Rails 앱의 테이블(예: posts
)에 legacy_id
컬럼을 추가하고 인덱스를 생성합니다.
* 저자(authors)와 같은 다른 엔티티의 경우 이메일 주소와 같이 기존에 고유한 필드를 교환 키로 활용할 수 있습니다.
* 이 교환 키는 마이그레이션 완료 후 제거할 수 있습니다.
Rake 태스크 구현
데이터 추출, 변환, 로드(ETL) 프로세스는 Rake 태스크를 통해 행별(row-by-row)로 구현됩니다. find_each
를 사용하여 메모리 문제를 방지합니다.
* namespace :etl
내에 users
및 articles
와 같은 개별 태스크를 정의합니다.
* 사용자 마이그레이션: OldSystem::User
를 순회하며 Author.where(email: old_user.email).first_or_initialize
를 사용하여 기존 저자를 찾거나 새로 생성합니다. 속성을 매핑하고 save(validate: false)
로 저장합니다.
* 게시물 마이그레이션: OldSystem::Article
을 순회하며 Post.where(legacy_id: old_article.id).first_or_initialize
를 사용합니다. 제목, 생성일 등을 매핑하고 post.author = old_article.user
와 같이 연관 관계를 설정한 후 저장합니다.
* 태스크 실행 순서(예: 사용자 먼저, 게시물 나중)는 내부 종속성을 고려하여 중요하게 설정해야 합니다.
* ProgressBar
를 사용하여 진행 상황을 시각적으로 표시할 수 있습니다.