이전 포스팅에서는 Django의 데이터베이스 모델과 ORM을 통해 데이터를 생성하고 조회하는 방법을 배웠습니다. 이번 글에서는 Django의 마이그레이션(Migrations) 시스템을 다루겠습니다. 마이그레이션은 Django가 데이터베이스 구조의 변경 사항을 추적하고, 이를 데이터베이스에 반영하는 방법입니다. 모델에 변경이 발생할 때마다 마이그레이션을 생성하고 적용하는 과정은 매우 중요합니다. 이번 글에서는 마이그레이션의 개념과 사용 방법을 자세히 설명하겠습니다.
1. 마이그레이션이란?
마이그레이션은 Django의 모델에서 발생한 변경 사항(예: 새로운 필드 추가, 필드 삭제, 테이블 변경 등)을 데이터베이스에 반영하는 방법입니다. Django는 이 변경 사항을 자동으로 추적하고, 이를 바탕으로 마이그레이션 파일을 생성하여 데이터베이스 스키마를 업데이트합니다. 이를 통해 코드와 데이터베이스 간의 일관성을 유지할 수 있습니다.
2. 마이그레이션 파일 생성
모델을 처음 정의하거나 모델에 변경 사항이 발생하면, Django는 이를 기반으로 마이그레이션 파일을 생성할 수 있습니다. 이 파일은 데이터베이스 스키마에 적용할 변경 사항을 포함합니다.
2.1 마이그레이션 파일 생성하기
모델에 변경 사항이 발생한 후, makemigrations 명령어를 사용하여 마이그레이션 파일을 생성할 수 있습니다.
python manage.py makemigrations
이 명령어를 실행하면, Django가 모델의 변경 사항을 감지하고, 이에 대한 마이그레이션 파일을 migrations/ 디렉토리에 생성합니다.
예시 출력:
Migrations for 'blog':
blog/migrations/0002_auto_20240930_1200.py:
- Alter field title on post
- Add field published_at to post
이 마이그레이션 파일은 모델에 대한 변경 사항을 기록하며, 데이터베이스에 적용될 준비가 됩니다.
2.2 마이그레이션 파일 내용
생성된 마이그레이션 파일을 열어보면, 데이터베이스에 적용할 변경 사항이 Python 코드로 기록되어 있습니다. 예를 들어, 새로운 필드를 추가하거나 기존 필드를 수정하는 내용이 담길 수 있습니다.
class Migration(migrations.Migration):
dependencies = [
('blog', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='post',
name='published_at',
field=models.DateTimeField(null=True, blank=True),
),
]
이 코드에서 AddField는 Post 모델에 published_at 필드를 추가하는 작업을 의미합니다.
3. 마이그레이션 적용
마이그레이션 파일이 생성된 후, 이 파일을 데이터베이스에 반영해야 합니다. 이를 위해 migrate 명령어를 사용합니다.
3.1 마이그레이션 적용하기
다음 명령어를 사용하여 마이그레이션을 데이터베이스에 적용합니다.
python manage.py migrate
이 명령어를 실행하면, Django는 마이그레이션 파일을 읽어 데이터베이스 구조를 업데이트합니다.
3.2 마이그레이션 상태 확인
Django는 마이그레이션의 상태를 추적하여 어떤 마이그레이션이 적용되었고, 아직 적용되지 않은 마이그레이션이 무엇인지 확인할 수 있습니다. 다음 명령어를 사용하여 현재 마이그레이션 상태를 확인할 수 있습니다.
python manage.py showmigrations
이 명령어는 각 애플리케이션에 대한 마이그레이션 파일 목록을 보여주며, 어떤 마이그레이션이 적용되었는지 여부를 확인할 수 있습니다.
blog
[X] 0001_initial
[X] 0002_auto_20240930_1200
4. 마이그레이션 되돌리기
때로는 마이그레이션을 되돌려야 하는 상황이 발생할 수 있습니다. Django는 이전 상태로 되돌릴 수 있는 기능을 제공합니다.
4.1 마이그레이션 되돌리기
특정 마이그레이션 이전 상태로 되돌리려면 migrate 명령어에 마이그레이션 번호를 지정하여 해당 시점으로 되돌릴 수 있습니다.
python manage.py migrate blog 0001
이 명령어는 blog 애플리케이션의 첫 번째 마이그레이션(0001_initial)로 되돌리게 됩니다.
4.2 마이그레이션 재실행
되돌린 후에는 다시 마이그레이션을 적용할 수도 있습니다. 위에서 되돌린 마이그레이션을 다시 적용하려면 다음 명령어를 사용합니다.
python manage.py migrate
이 명령어는 최신 마이그레이션까지 다시 적용하여 데이터베이스 구조를 업데이트합니다.
결론
이번 포스팅에서는 Django의 마이그레이션 시스템에 대해 알아보았습니다. 마이그레이션은 모델의 변경 사항을 데이터베이스에 반영하는 중요한 도구로, 이를 통해 코드와 데이터베이스 간의 일관성을 유지할 수 있습니다. Django의 강력한 마이그레이션 시스템을 통해 데이터베이스 변경 사항을 쉽게 관리하고, 필요에 따라 변경을 되돌릴 수도 있습니다.