모델(Model)의 변경 사항 관리 즉 Django 프로젝트의 데이터 구조 변경 사항을 관리하기 위한 Django만의 관리 방법
장고의 데이터 변경사항에 대한 버전 컨트롤 시스템
예를 들어, 개발자가 모델을 생성하거나 변경했을 때, migration을 하나씩 만든다. 그리고 만든 migration을 실제 데이터베이스에 적용하는 것이 migrate 명령어이다.
그리고 이 모든 과정은 ORM(Object-Relational Mapping)을 통해 진행됨.


migration은 각 앱의 migration 디렉토리에 저장되어 있는데, python manage.py makemigrations 명령어를 이용해 만들었던 1번 migration 파일이 생성되었음을 볼 수가 있다.
이 파일을 보면 장고에서 제공해주는 migration을 상속받은 class가 있고, 빨간색 박스친 우리가 작성한 부분도 있고, 작성해주지 않았지만 자동으로 생성된 부분도 있다.
id는 장고에서 자동으로 생성해주는 필드중 하나인데, 각각의 menu 데이터를 구분하기 위한 고유값이다. (Primary Key)이렇게 변경사항을 기록한 migration 파일을 바탕으로 현재 데이터베이스에 적용되지 않은 사항이 있다면 적용해주는 명령어가 migarte 명령어 이다.
💡 우리는 지금껏 model의 모든 코드를 Python으로 작성했지만, 사실 데이터베이스와 소통하기 위해서는 SQL 언어를 사용해야 한다. 하지만 그런 SQL없이 파이썬으로 데이터베이스와 소통할 수 있도록 해주는 것이 ORM이다. 실제로 이러한 모델이 어떻게 변환되었는지 보자.
python manage.py showmigrations 를 입력하자. 이 명령어는 현재 migration의 적용현황을 알려준다. 그럼 아래와 같이 뜨는데 이 [X]는 이미 장고에 변경사항이 반영되었음을 알려준다.

적용되었음을 확인했으니 이제 진짜로 1번 migration파일(foods앱의 0001_initial)이 ORM을 통해서 어떻게 SQL로 변환되었는지 보자.
python manage.py sqlmigrate [app 이름] [보고싶은 migration 번호]python manage.py sqlmigrate foods 0001
python manage.py makemigrations
모델의 변경 사항을 인식해서 새로운 마이그레이션을 만든다. 이때 마이그레이션은 각 앱 디렉토리 내 migrations 디렉토리 안쪽에 생성된다.
python manage.py migrate
생성된 최신 버전의 마이그레이션을 데이터베이스에 반영한다. 만약 이전 마이그레이션으로 되돌리고 싶다면 python manage.py migrate {앱 이름} {되돌릴 마이그레이션 번호}를 사용할 수 있다.
python manage.py showmigrations
현재 django 프로젝트의 모든 마이그레이션과 반영 상태를 나타낸다. 만약 특정 앱에 대한 것만 보고 싶다면 python manage.py showmigrations {앱 이름}을 사용할 수 있다.
python manage.py sqlmigrate {앱 이름} {마이그레이션}
인수로 넘겨준 마이그레이션이 ORM을 통해 변경된 SQL문을 출력한다. sqlmigrate를 통해 모델이 의도한 대로 SQL문으로 변경되어 데이터베이스에 반영되었는지 확인할 수 있다.
Django의 마이그레이션에 대해 더 알고 싶다면 아래의 공식 문서를 참고
https://docs.djangoproject.com/en/2.2/topics/migrations/