멘토링
멘토링 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은 단순한 쿼리 이상의 개념! 객체 지향적으로 데이터를 다루기 위한 강력한 도구입니다.