django 공식 문서보다 이해하기 쉬운 것 같아 위키피디아에서 model의 정의를 가져왔다.
django에서 model은 데이터에 관한 정보를 담는다. 데이터에 대한 접근, 검증, 작동과 데이터 사이의 관계를 정의하는데, 일반적으로 데이터베이스에서 테이블에 해당한다.
즉 쉽게 말하자면 django에서 model은 데이터베이스의 테이블이다. 따라서 model을 생성하거나, model에 변화를 줬을 때 데이터베이스에도 적용을 시켜주어야 한다.
migrations는 django에서 데이터베이스에 모델의 변화를 적용시킬 때 사용하는 방법이다.
migration을 하는 과정은 makemigrations과 migrate 두 단계로 진행된다.
makemigrations 을 실행시킴으로서, 당신이 모델을 변경시킨 사실과(이 경우에는 새로운 모델을 만들었습니다) 이 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 알려줍니다.
장고 공식문서에 따르면 makemigrations는 모델을 변경시킨 것을 Django에 단지 알려줄 뿐이다. 실제로 적용을 시키지는 않는 것이다.
>python manage.py makemigrations
Migrations for 'app':
app/migrations/0001_initial.py
- Create model Question
처음으로 makemigrations를 실행하면 0001_initial.py라는 모델의 변경사항에 대한 migration 파일을 생성한다. 이는 모델에 변경사항에 대한 SQL command이다. 이제 이를 실제로 적용시켜야 한다.
당신을 위해 migration들을 실행시켜주고, 자동으로 데이터베이스 스키마를 관리해주는 migrate 명령어가 있습니다.
즉 migrate 명령어는 makemigrations로 만든 migration파일을 실행해 데이터베이스에 model의 변경사항을 적용시킨다.
> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, Question
Running migrations:
Rendering model states... DONE
Applying app.0001_initial... OK
migrate 명령은 아직 적용되지 않은 migration을 모두 수집해 이를 실행하고 이 과정을 통해 모델에서의 변경 사항들과 데이터베이스의 스키마의 동기화가 이루어진다.
컴퓨터 과학에서 데이터베이스 스키마(database schema)는 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조이다. 데이터베이스 관리 시스템(DBMS)이 주어진 설정에 따라 데이터베이스 스키마를 생성하며, 데이터베이스 사용자가 자료를 저장, 조회, 삭제, 변경할 때 DBMS는 자신이 생성한 데이터베이스 스키마를 참조하여 명령을 수행한다.
스키마는 내부 / 외부 / 개념스키마가 있는데 보통 내부스키마를 가리키는데 사용된다고 한다.
이때 내부스키마란 데이터베이스의 물리적 구조를 의미한다.
즉 migrate를 통해 변경사항들과 데이터베이스의 물리적 구조가 동기화되는 것이다.
사실 이 글은 현재 하고 있는 django 미니 프로젝트 때문에 쓰게 되었다.
django로 코드를 올릴 수 있는 게시판을 3명이서 만들고 있는데 오류가 생겨 원인을 찾아보니 바로 이 migrations 폴더도 같이 공유하는 것이 문제였다.
한명이 모델을 수정해 makemigrate와 migrate를 진행하고 git으로 공유를 해버리면 다른 팀원도 migrate를 시켜야하는데 이미 makemigrate에는 migrate를 진행한 흔적이 있어 migrate할 것이 없다고 나와버리는 것이었다.
.gitignore에 migrations폴더를 추가해 문제를 해결할 수 있었다.