Post

Django: ORM과 Model의 핵심 이해

Django의 ORM과 Model에 대한 핵심 개념을 이해하고, 실습을 통해 데이터베이스와 상호작용하는 방법

Django: ORM과 Model의 핵심 이해

Django Model 이해하기

1. Django에서 Model이란?

Django에서 Model은 데이터베이스 구조와 동작을 정의하는 구성 요소로, MTV 패턴 중 “M(Model)”에 해당합니다. 데이터를 저장하고 조작하기 위한 데이터베이스 테이블의 스키마와 필드가 포함되어 있습니다.

  • Model 특징
    • 데이터베이스와 직접 연결되어 데이터를 조작합니다.
    • 일반적으로 하나의 Model은 데이터베이스의 하나의 테이블을 나타냅니다.

2. 데이터베이스 기본 개념

Model을 배우기 전에 데이터베이스와 관련된 몇 가지 개념을 이해해 봅시다.

  • 데이터베이스(Database): 데이터를 체계적으로 저장하고 관리하는 공간.
  • 쿼리(Query): 데이터베이스에 데이터를 조회하거나 조작하기 위해 사용하는 언어.
  • 스키마(Schema): 데이터베이스 구조와 관계를 정의하는 명세서.

3. Django Model 작성하기

모델 생성

models.Model을 상속받아 원하는 데이터 스키마를 정의합니다. 아래는 간단한 예제입니다:

1
2
3
4
from django.db import models

class Article(models.Model):
    pass
  • 모든 Django 모델은 models.Model을 상속받아야 합니다.
  • 클래스 이름은 테이블 이름으로 사용됩니다.
필드 추가

테이블의 열(Column)을 나타내는 필드를 추가합니다. 예를 들어, 제목(title)과 내용(content) 필드를 추가합니다.

1
2
3
4
5
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
  • models.CharField(max_length=50): 최대 50자의 문자열을 저장.
  • models.TextField(): 긴 문자열 데이터를 저장.

📌 참고: 다양한 필드 타입과 옵션은 공식 문서를 참고하세요.

4. 마이그레이션(Migration)

Python 코드로 작성된 Model을 데이터베이스에 반영하려면 마이그레이션 과정을 거쳐야 합니다.

마이그레이션 생성

Model 변경 사항을 마이그레이션 파일로 생성합니다.

1
python manage.py makemigrations
마이그레이션 적용

생성된 마이그레이션을 데이터베이스에 반영합니다.

1
python manage.py migrate
추가 명령어
  • 마이그레이션 상태 확인

    1
    
    python manage.py showmigrations
    
  • SQL 보기

    1
    
    python manage.py sqlmigrate <app_name> <migration_no>
    

5. SQLite 데이터베이스 확인

Django는 기본적으로 SQLite 데이터베이스를 사용합니다. 데이터를 확인하려면 SQLite 관리 도구를 사용할 수 있습니다.

  • SQLite VSCode 설정
    • VSCode에서 .sqlite3 파일을 열어 데이터베이스 확인.
    • Command Palette(Windows: Ctrl+Shift+P) → SQLite: Open Database → 데이터베이스 파일 선택.
  • 다른 데이터베이스 도구
    • DBeaver, DB Browser for SQLite 등.

6. 유용한 필드 옵션

Model에서 자주 사용되는 필드는 다음과 같습니다:

  • 생성일(created_at)과 수정일(updated_at)

    1
    2
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    • auto_now_add=True: 객체가 처음 생성될 때 현재 시간을 자동으로 저장.
    • auto_now=True: 객체가 수정될 때 현재 시간을 자동으로 저장.

7. 실습 예제

  1. Model 정의

    1
    2
    3
    4
    5
    6
    7
    
    from django.db import models
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        author = models.CharField(max_length=50)
        price = models.FloatField()
        published_date = models.DateField()
    
  2. 마이그레이션 생성 및 적용

    1
    2
    
    python manage.py makemigrations
    python manage.py migrate
    
  3. 데이터베이스 확인 SQLite 도구를 이용해 테이블과 데이터를 확인하세요.

8. 실습 중 발생할 수 있는 오류

  • 마이그레이션 관련 경고
    • 기존 데이터에 기본값을 추가하거나 초기화를 요청받을 수 있습니다. 메시지를 읽고 적절히 처리하세요.

Django ORM과 Database API

1. ORM(Object-Relational Mapping)이란?

Object-Relational-Mapping, 즉 객체와 관계형 데이터베이스를 매핑하는 기술입니다.

  • 쉽게 말해: SQL을 직접 작성하지 않고, Python 코드로 데이터베이스를 조작할 수 있는 방법입니다.
  • 객체지향 프로그래밍의 클래스와 관계형 데이터베이스의 테이블 간의 개념적 차이를 줄이는 역할을 합니다.
💡 한 줄 요약

SQL 없이도 Django ORM을 통해 데이터베이스를 조작할 수 있습니다.

2. Django ORM의 특징

  • 다양한 ORM 존재: Django ORM, SQLAlchemy, Tortoise ORM 등.
  • 활용도 높음: 많은 개발 환경에서 생산성을 위해 ORM을 채택.
  • Django와 ORM: Django는 ORM을 기본 제공하며, Job 공고에서도 Django ORM이 암묵적으로 사용됩니다.
ORM의 역할
  • SQL ↔ ORM ↔ Python Object
    • SQL 쿼리 작성 없이 Python 코드로 데이터베이스 조작.
    • 데이터베이스의 테이블 데이터를 객체로 변환해 제공.

3. ORM의 장단점

장점
  1. SQL을 몰라도 데이터베이스 조작 가능.
  2. 객체지향적인 접근 방식으로 생산성 향상.
  3. 복잡한 SQL 작성 없이 간단히 데이터 조작 가능.
단점
  1. 지원하지 않는 쿼리는 직접 작성해야 함.
  2. 대규모 서비스에서 ORM 성능 한계.
  3. 최적화된 SQL이 필요한 경우 불편.

4. Django Database API

Django ORM은 Database Abstraction API를 통해 데이터베이스를 조작합니다.

Manager
  • Django가 모델 클래스 생성 시 CRUD 작업을 위한 Database API를 자동으로 제공합니다.
  • 이 API를 관리하는 객체를 Manager라 부르며, 기본 이름은 objects입니다.
1
2
# 기본 구조
MyModel.objects.all()

5. Django Shell을 활용한 CRUD

Django의 Shell 환경에서 Database API를 사용해 CRUD 작업을 수행합니다.

사전 설정
  1. 기본 Django Shell 실행

    1
    
    python manage.py shell
    

    하지만 기본 Shell 환경은 불편할 수 있습니다.

  2. django-extensions 설치

    1
    
    pip install django-extensions
    
  3. settings.py에 등록

    1
    
    "django_extensions",
    
  4. ipython 설치

    1
    
    pip install ipython
    
  5. Shell Plus 실행

    1
    
    python manage.py shell_plus
    

CRUD 작업 예제

1. Create (생성)
  1. Article 객체 생성 후 저장

    1
    2
    
    article = Article(title='My First Article', content='Hello, world!')
    article.save()
    
  2. 객체 생성과 동시에 저장

    1
    
    Article.objects.create(title='Another Article', content='Django ORM is great!')
    
2. Read (조회)
  1. 전체 조회

    1
    
    Article.objects.all()
    
  2. 하나의 객체 조회

    1
    
    Article.objects.get(id=1)
    
  3. 조건부 조회

    1
    
    Article.objects.filter(content__contains='Django')
    
3. Update (수정)
  1. 객체 조회 후 수정

    1
    2
    3
    
    article = Article.objects.get(id=1)
    article.title = 'Updated Title'
    article.save()
    
4. Delete (삭제)
  1. 객체 삭제

    1
    2
    
    article = Article.objects.get(id=1)
    article.delete()
    

6. __str__ 메서드 활용

__str__ 메서드를 정의하면 객체의 문자열 표현을 지정할 수 있습니다.

1
2
3
4
5
6
class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()

    def __str__(self):
        return self.title

7. Shell 환경에서 활용

  • Shell 환경에서 Database API를 실습하며 Django ORM의 강력함을 체험할 수 있습니다.
  • 기본 Shell보다 확장된 Shell Plus를 사용해 자동 임포트와 편리한 기능을 활용하세요.
This post is licensed under CC BY 4.0 by the author.