[프로젝트] Modulo
MySQL 데이터베이스 마이그레이션하기
kwon-record
2025. 1. 14. 20:53
배경

Modulo 프로젝트는 사용자가 이력서를 간편하게 작성하고 조합할 수 있도록 하는 것이 주요 목적이었다. 프로젝트 진행 중 "README 작성이 없어서 아쉽다"는 피드백을 받았으나, README를 추가하는 것은 '간단한 이력서 작성'이라는 원래 취지에서 벗어난다고 판단했다. 대신 이력서 테마 기능을 추가하여 사용자 경험을 개선하기로 결정했다. 하지만 이 과정은 테이블을 수정해야 하는 일이였기에 바로 운영서버에서 테이블을 바꾸는것보다는, 개발 서버에서 먼저 테스트를 해본뒤에 운영서버에 적용하는 것이 나을 것이라고 생각하여 운영환경의 RDS 데이터를 개발 환경 Docker Container의 MySQL로 마이그레이션하여 테스트하기로 결정하였다.
데이터 마이그레이션 과정
1. RDS에서 데이터 덤프
운영 환경의 데이터베이스를 직접 수정하면 위험할 수 있어서, 먼저 운영 서버의 데이터를 개발 서버의 mysql로 마이그레이션하여 개발 서버에서 테스트해보기로 했다. AWS RDS의 데이터를 백업했다:
mysqldump -h [RDS-HOST] -u [USERNAME] -p [DATABASE-NAME] > backup.sql
2. 개인 서버로 전송
SSH를 통해 덤프 파일을 개인 서버로 전송했다:
scp -P [PORT] backup.sql [USERNAME]@[SERVER-ADDRESS]:/home/[USERNAME]/backup.sql
3. Docker MySQL에 복원
Docker 컨테이너의 MySQL에 데이터를 복원했다:
cat ~/backup.sql | docker exec -i [CONTAINER-ID] mysql -u root -p[PASSWORD] [DATABASE-NAME]
테마 기능 추가
1. 테이블 수정 쿼리
데이터 마이그레이션이 완료된 후, 다음 쿼리로 테마 컬럼을 추가했다:
ALTER TABLE resume
ADD COLUMN theme ENUM('BASIC', 'MODERN', 'NOTION') NOT NULL DEFAULT 'BASIC';
결과 확인
1. 마이그레이션 전 테이블 구조
mysql> desc resume;
+------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+----------------+
| created_at | datetime(6) | YES | | NULL | |
| id | bigint | NO | PRI | NULL | auto_increment |
| member_id | bigint | YES | MUL | NULL | |
| updated_at | datetime(6) | YES | | NULL | |
| title | varchar(255) | NO | | NULL | |
+------------+---------------+------+-----+---------+----------------+
2. 테마 추가 후 테이블 구조
mysql> desc resume;
+------------+---------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------------------+------+-----+---------+----------------+
| created_at | datetime(6) | YES | | NULL | |
| id | bigint | NO | PRI | NULL | auto_increment |
| member_id | bigint | YES | MUL | NULL | |
| updated_at | datetime(6) | YES | | NULL | |
| title | varchar(255) | NO | | NULL | |
| theme | enum('BASIC','MODERN','NOTION') | NO | | BASIC | |
+------------+---------------------------------+------+-----+---------+----------------+
이렇게 안전하게 테이블이 변경되었고 데이터베이스의 데이터들이 멀쩡하게 남아있는 것을 확인할 수 있었다.
그 결과...
