DJango 서버개발, Django ORM(Object-Relational Mapping) 소개

Django는 파이썬으로 작성된 고급 웹 프레임워크로, 빠른 개발과 깔끔하고 실용적인 디자인을 목표로 합니다. Django의 핵심적인 기능 중 하나는 ORM(Object-Relational Mapping)입니다. ORM은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 전환하는 기법으로, 데이터베이스 작업을 훨씬 간편하고 효율적으로 만들어 줍니다. 이 글에서는 Django ORM의 기본 개념, 사용 방법, 그리고 다양한 예제 코드를 통해 Django ORM의 강력한 기능을 탐구하겠습니다.

1. ORM이란?

ORM(Object-Relational Mapping)은 객체와 데이터베이스 레코드 간의 관계를 매핑하는 방법입니다. 이는 데이터베이스의 테이블을 객체로 표현하고, SQL 쿼리를 작성하는 대신 프로그래밍 언어의 일반적인 객체 지향 방식으로 데이터베이스와 상호작용할 수 있도록 해줍니다. Django에서는 이 과정이 매우 간단해지며, 이는 개발자에게 다음과 같은 이점을 제공합니다:

  • SQL 쿼리를 작성할 필요가 없어져 코드가 더 간결해집니다.
  • 데이터베이스 독립성으로 인해 여러 종류의 데이터베이스를 쉽게 전환할 수 있습니다.
  • 코드의 가독성이 향상되고 유지 보수가 용이해집니다.

2. Django ORM 구성요소

Django ORM의 주요 구성 요소는 다음과 같습니다:

  • 모델(Model): 데이터베이스 테이블을 정의하는 클래스입니다. 각 모델은 데이터베이스 레코드 하나와 매핑됩니다.
  • 쿼리셋(QuerySet): 데이터베이스에서 데이터를 조회하기 위한 API입니다. 쿼리셋은 객체 리스트를 반환합니다.
  • 마이그레이션(Migration): 모델의 변경 사항을 데이터베이스에 적용하는 방법입니다. Django는 자동으로 마이그레이션 파일을 생성합니다.

3. Django 모델 만들기

먼저 Django 프로젝트를 생성하고 앱을 추가한 후, 모델을 정의하는 방법을 살펴보겠습니다.

python
django-admin startproject myproject
cd myproject
python manage.py startapp myapp

이제 myapp/models.py 파일을 열어 기본 모델을 정의해봅시다.

python
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    birth_date = models.DateField()

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()

    def __str__(self):
        return self.title

위의 코드에서 AuthorBook 모델을 정의했습니다. 각 모델은 models.Model을 상속받아야 하며, 각 속성은 데이터베이스 필드를 나타냅니다. ForeignKey를 사용하여 두 모델 간의 관계를 정의했습니다.

4. 마이그레이션 적용하기

모델을 정의한 후, Django는 모델을 데이터베이스에 반영하는 마이그레이션 파일을 생성할 수 있습니다. 이를 위해 다음 명령어를 사용합니다:

python
python manage.py makemigrations
python manage.py migrate

이 명령어는 모델의 변경 사항을 감지하고 관련 마이그레이션 파일을 생성하여 데이터베이스에 적용합니다.

5. 데이터베이스와의 상호작용

Django ORM을 사용하여 데이터베이스와 상호작용하는 다양한 방법을 살펴보겠습니다. 일부 기본적인 CRUD(Create, Read, Update, Delete) 작업을 통해 이를 이해할 수 있습니다.

5.1. 데이터 생성(Create)

python
# 새로운 저자 데이터 추가
author = Author(name="J.K. Rowling", birth_date="1965-07-31")
author.save()

# 새로운 책 데이터 추가
book = Book(title="Harry Potter and the Philosopher's Stone", author=author, published_date="1997-06-26")
book.save()

5.2. 데이터 조회(Read)

데이터를 조회하려면 쿼리셋을 사용합니다. 다음은 데이터베이스에서 모든 저자와 책을 조회하는 방법입니다:

python
# 모든 저자 조회
authors = Author.objects.all()
for author in authors:
    print(author.name)

# 특정 저자의 책 조회
books_by_author = Book.objects.filter(author=author)
for book in books_by_author:
    print(book.title)

5.3. 데이터 업데이트(Update)

데이터를 업데이트하려면 먼저 원하는 객체를 가져온 후, 속성을 수정하고 저장하면 됩니다:

python
# 저자의 이름 변경
author = Author.objects.get(id=1)
author.name = "Joanne Rowling"
author.save()

5.4. 데이터 삭제(Delete)

데이터를 삭제하는 방법은 다음과 같습니다:

python
# 특정 책 삭제
book_to_delete = Book.objects.get(id=1)
book_to_delete.delete()

6. Django Admin에서 ORM 사용하기

Django는 기본적으로 강력한 관리자 인터페이스를 제공합니다. 이 인터페이스를 통해 데이터베이스 모델을 쉽게 관리할 수 있습니다. 이를 위해 myapp/admin.py 파일에 모델을 등록해야 합니다:

python
from django.contrib import admin
from .models import Author, Book

admin.site.register(Author)
admin.site.register(Book)

이제 Django 서버를 실행하고 http://127.0.0.1:8000/admin에 접속하면 관리 페이지에서 Authors와 Books를 쉽게 관리할 수 있습니다. 기본 사용자(admin)을 만들어야 하며, 다음 명령어를 사용하여 생성할 수 있습니다:

python
python manage.py createsuperuser

7. Django ORM의 고급 기능

Django ORM은 간단한 CRUD 작업 외에도 고급 쿼리 기능을 제공합니다. 예를 들어, annotate, aggregate, 및 select_related 메서드를 사용하여 데이터를 더 효과적으로 사용할 수 있습니다.

7.1. annotate와 aggregate

이 메서드들은 데이터를 집계하여 계산된 필드를 추가하는 데 사용됩니다.

python
from django.db.models import Count

# 저자별 책 수 조회
author_book_count = Author.objects.annotate(num_books=Count('book'))
for author in author_book_count:
    print(f'{author.name} has written {author.num_books} books.')

7.2. select_related

이 메서드는 ForeignKey 관계를 가진 개체를 효율적으로 미리 로드할 수 있게 해줍니다. 이를 사용하면 쿼리 수를 줄이고 성능을 높일 수 있습니다.

python
# 책과 저자를 함께 조회
books_with_authors = Book.objects.select_related('author').all()
for book in books_with_authors:
    print(f'{book.title} by {book.author.name}')

8. Django ORM과 데이터베이스

Django는 다양한 데이터베이스를 지원합니다. SQLite, PostgreSQL, MySQL, Oracle 및 NoSQL 데이터베이스와도 호환됩니다. 이는 Django의 장점 중 하나로, 프로젝트에 적합한 데이터베이스를 선택할 수 있습니다. 각 데이터베이스에 필요한 설정을 settings.py 파일에서 확인하고 수정할 수 있습니다.

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',  # PostgreSQL 사용 설정
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

9. 결론

Django ORM은 Django 프레임워크의 중요한 구성 요소로, 데이터베이스와 상호작용하는 것을 매우 효율적이고 간편하게 만들어줍니다. 우리는 ORM을 사용하여 모델을 정의하고, CRUD 작업을 수행하며, 복잡한 쿼리를 생성하는 방법을 배웠습니다. Django ORM은 뿐만 아니라 유지 보수를 용이하게 하고, 데이터베이스 독립성을 제공하여 다양한 데이터베이스와 쉽게 통합할 수 있게 해줍니다.

이 글을 통해 Django ORM의 기초를 배우고, 적절한 사용 예제를 통해 실습할 수 있기를 바랍니다. Django를 통한 웹 개발의 제약에서 벗어나 흥미로운 프로젝트를 개발해 보세요!

다음 글에서는 Django REST Framework를 사용하여 데이터베이스와의 상호작용을 API 형태로 제공하는 방법에 대해 알아볼 것입니다.