특강

[Django 2일차] Django 마이그레이션과 ORM 실전 이해 가이드2/4 (250513)

Chansman 2025. 5. 13. 13:59

🛠️ Django 마이그레이션과 ORM 실전 이해 가이드

이 글은 Django ORM과 마이그레이션 시스템을 실전 중심으로 이해하고, 데이터베이스의 상태를 효율적으로 관리하는 방법을 다룹니다. 또한 비밀번호 암호화 보안 처리까지 이어지는 흐름을 바탕으로 웹 애플리케이션 개발 실습에 도움이 되도록 구성되어 있습니다.


1. 🧩 마이그레이션 처리 원칙

  • 기록의 연속성 유지: 마이그레이션은 기존 파일을 수정하지 않고 새로운 마이그레이션 파일을 계속 생성합니다.
  • 삭제 후 복구도 새 파일로: 필드를 삭제했다가 다시 추가해도, 기존 파일을 수정하지 않고 새로운 파일이 생성됩니다.
  • 리버트는 제한적으로: 로컬 작업에서만 리버트 명령어(migrate appname 000x)를 사용하며, 공유된 코드는 리버트하지 않는 것이 원칙입니다.
  • 모델 파일은 수동 수정: 마이그레이션만으로 모델 코드가 자동 복구되지는 않으며, 항상 모델(models.py)은 직접 수정해야 합니다.

2. 🔁 마이그레이션 리버트 실습 흐름

  • makemigrations → 새 변경 사항을 반영한 마이그레이션 파일 생성
  • migrate → 해당 마이그레이션을 DB에 적용
  • showmigrations → DB에 실제 반영된 마이그레이션 파일 상태 확인
  • migrate appname 000x → 특정 버전으로 되돌림 가능 (주의: 협업 시 지양)

예시:

  • 003번에서 컬럼 삭제
  • 004번에서 동일 컬럼 다시 생성 → 안전한 방식

3. 🐍 ORM으로 데이터 추가

  • python manage.py shell 명령어 실행
  • Django 5.2부터는 shell --interface=ipython 없이도 모델 자동 import 지원

3.1 객체 생성 방법

1️⃣ 기본 방식 (메모리에 객체 생성 → .save() 호출)

user = CustomUser(username='user1', password='password')
user.save()

2️⃣ 단일 메서드로 생성 (.create())

user = CustomUser.objects.create(username='user2', password='password')

3️⃣ 여러 객체를 한 번에 (bulk_create)

objs = [CustomUser(username=f'user{i}', password='pw') for i in range(100)]
CustomUser.objects.bulk_create(objs)
  • ✅ bulk_create는 네트워크 요청 횟수를 줄여 성능이 향상됩니다.

4. 🔒 비밀번호 암호화 처리

비밀번호는 반드시 해싱되어야 하며, 장고에서는 2가지 방법 제공:

4.1 방법 1 – create_user 메서드 사용 (내장 해싱)

user = CustomUser.objects.create_user(username='user3', password='password')

4.2 방법 2 – make_password + 일반 create

from django.contrib.auth.hashers import make_password
user = CustomUser.objects.create(
    username='user4',
    password=make_password('password')
)

🔐 같은 비밀번호라도 매번 다른 해시값이 생성됩니다. (salt 사용)

4.3 비밀번호 검증 (로그인 시 사용)

from django.contrib.auth.hashers import check_password
check_password('입력값', 해시된_패스워드)  # True/False 반환

5. 📦 숏URL 서비스 데이터모델 설계 예시

class ShortURL(models.Model):
    code = models.CharField(max_length=8, unique=True)   # 짧은 코드
    original_url = models.URLField(max_length=255)       # 원본 URL
    access_count = models.PositiveIntegerField(default=0) # 접속 횟수
    created_at = models.DateTimeField(auto_now_add=True)  # 생성일

☑️ PositiveIntegerField를 통해 접속 횟수는 음수가 되지 않도록 설정


✅ 마무리 정리

  • 마이그레이션은 이력 기반 변경 기록이며, 파일 수가 늘어나도 수정하지 않는 것이 원칙
  • ORM을 활용하면 SQL 없이도 객체처럼 데이터 조작 가능
  • 민감정보(비밀번호 등)는 반드시 해싱 처리 필요
  • 장고는 대부분의 기능을 기본 제공하며, 보안과 생산성을 동시에 확보할 수 있음

📌 다음 실습으로는 👉 숏 URL 생성 + 리디렉션 + 유저 연동, QR 코드, 만료일 기능 등을 확장해 나갑니다!