멘토링

멘토링 Django 심화 (7회차 정리)

Chansman 2025. 5. 16. 11:32

1. 🗒️ 마이그레이션 파일과 데이터베이스 CRUD

1.1 마이그레이션 파일의 개념과 역할

  • 마이그레이션 파일은 데이터베이스 구조 변경 이력을 기록하는 설계도입니다.
  • Django 외의 프레임워크에서도 "마이그레이션(Migration)"은 데이터 이동 또는 구조 변경 기록을 뜻하는 일반적인 용어입니다.
  • makemigrations: 모델 클래스 변경을 감지해 마이그레이션 파일 생성
  • migrate: 마이그레이션 파일의 내용을 실제 DB에 반영

📌 마이그레이션 파일은 수정 이력이 누적되어 관리되므로, 변경 시 기존 파일을 수정하기보다 새 파일을 생성하여 이력을 쌓는 것이 원칙입니다.


2. 🖥️ 아이디와 데이터 조작 방식

2.1 ID(PK) 처리의 유의사항

  • Django는 자동으로 ID(PK)를 생성하므로 일반적인 경우 직접 입력하지 않아도 됩니다.
  • 테스트 목적 등으로 직접 ID를 지정할 수 있으나, 이미 존재하는 ID를 사용할 경우 에러가 발생합니다.

2.2 CRUD 메서드 기본 흐름

# Create
Person.objects.create(name="철수", age=30, job="개발자")

# Read - 단일 객체
person = Person.objects.get(id=1)

# Read - 여러 객체(QuerySet)
people = Person.objects.filter(age=30)

# Read - 전체
all_people = Person.objects.all()
  • get() → 조건에 맞는 하나의 객체만 반환 (없거나 2개 이상이면 에러)
  • filter() → 조건에 맞는 여러 개의 객체를 QuerySet 형태로 반환
  • all() → 테이블의 모든 객체를 가져옴 (대용량일 경우 성능 유의)

3. 📊 객체와 인스턴스의 개념

3.1 클래스와 인스턴스 관계

  • 클래스는 설계도, 인스턴스는 실제 데이터로 만들어진 객체입니다.
  • Django에서 Person.objects.get()이나 filter()로 가져온 객체는 해당 클래스의 인스턴스입니다.

3.2 QuerySet의 성질

qs = Person.objects.filter(age=30)
first_person = qs[0]
print(first_person.name)
  • QuerySet은 리스트처럼 인덱싱과 반복이 가능
  • 단, 정확히는 리스트가 아닌 Django QuerySet 객체로 최적화된 DB 접근 구조

💡 인스턴스에서는 .name, .age 등의 멤버 변수에 접근 가능


4. 📰 뉴스 데이터 처리 방법

4.1 뉴스 객체 생성과 활용

news = News.objects.create(title="테스트 뉴스", detail="상세내용", thumbnail_url="http://img.com/a.jpg")
print(news.title)  # "테스트 뉴스"
  • News는 Django 모델 클래스
  • .objects.create()로 DB에 한 줄(Row)을 생성하고 인스턴스를 반환
  • 이후 인스턴스의 속성에 직접 접근 가능 (예: news.title)

4.2 조건 검색과 예외 처리

try:
    news_item = News.objects.get(id=1)
except News.DoesNotExist:
    print("뉴스가 존재하지 않습니다")
  • get()은 반드시 try-except로 감싸야 안전
  • filter()는 결과가 없으면 빈 QuerySet 반환 → 예외 발생하지 않음

5. 📝 폼 및 데이터 리스트 생성 관련 내용

5.1 뉴스 리스트 출력 예제

news_list = News.objects.filter(detail="특정 내용")
for news in news_list:
    print(news.title)
  • filter() 결과는 QuerySet
  • for문으로 반복 가능

5.2 리스트 컴프리헨션 활용 예시

titles = [news.title for news in News.objects.filter(detail="특정 내용")]
  • 리스트 컴프리헨션으로 QuerySet 데이터를 간단히 가공 가능

6. 🧪 쉘에서의 연습 중요성

6.1 manage.py shell 사용

python manage.py shell
  • Django 환경에서 ORM을 자유롭게 테스트 가능
  • 실습 예:
from myapp.models import News
News.objects.create(title="뉴스1", detail="내용1")
News.objects.filter(title__icontains="뉴스")

🛠️ 실제 DB에 반영되기 때문에 테스트용 DB에서 실습할 것!


7. 🎓 장고와 모델 구성 이해하기

7.1 모델 클래스의 구성

class News(models.Model):
    title = models.CharField(max_length=100)
    detail = models.TextField()
    thumbnail_url = models.URLField()

    class Meta:
        db_table = 'custom_news_table'
  • 각 필드는 데이터베이스의 컬럼이 됨
  • Meta 클래스의 db_table 속성으로 테이블 이름 커스터마이징 가능

8. 🧩 정리 및 실전 팁

✅ CRUD의 각 메서드 사용법을 익히고, get()의 예외 처리와 QuerySet의 활용에 익숙해지자
✅ manage.py shell을 통해 실습을 자주 해볼 것
✅ filter()로 가져온 QuerySet은 for문, 리스트 컴프리헨션, 인덱싱에 자유롭게 사용 가능
✅ 마이그레이션은 구조 변경 히스토리를 담는 핵심 요소로 반드시 이해해야 함

🧠 장고 ORM은 단순한 쿼리 이상의 개념! 객체 지향적으로 데이터를 다루기 위한 강력한 도구입니다.