웹 프로젝트를 진행하다 보면 데이터베이스가 필요해질 때가 온다. 유저의 정보, 유저가 작성한 글, 장바구니, 구매 내역 등 데이터가 많아지면 이를 데이터베이스에 입력하고 이를 바탕으로 서비스를 제공하게 된다.
그런데 서버가 데이터베이스와 직접 통신하는 것은 그다지 바람직하지 않다. 여러 단점들이 있기 때문이다.
따라서 대부분의 웹 프레임워크에서는 서버와 데이터베이스 사이의 인터페이스로 ORM(Object-Relational Mapping)을 제공한다. ORM은 테이블을 클래스로 추상화하여 관리하고 클래스가 생성한 인스턴스를 테이블의 데이터로 변환해 준다.
장고에서 ORM을 사용하기 위해 models.py
에 클래스를 작성하기만 하면 된다. 실습을 진행해보자.
# todo/models.py
from django.db import models
from user.models import UserModel
class TodoModel(models.Model):
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
title = models.CharField(max_length=32)
content = models.CharField(max_length=256, default='')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_completed = models.BooleanField(default=False)
TodoModel
은 models.Model
을 상속받고 있다. 이것은 장고가 구현한 ORM의 기본적인 형태로서 데이터베이스와 클래스를 매핑하기 위한 기능들을 제공한다. 즉, 우리는 아무 기능을 추가하지 않아도 todo.save()
나 todo.delete()
같은 메소드를 사용해 데이터베이스에 데이터를 저장하거나 삭제할 수 있는 것이다.
# todo/views.py
...
def create_view(request):
if request.method == 'GET':
user = request.user.is_authenticated
if user:
return render(request, 'todo/form.html')
else:
return redirect('/user/sign-in')
elif request.method == 'POST':
todo = TodoModel()
todo.author = request.user
todo.title = request.POST.get('title')
todo.content = request.POST.get('content', '')
todo.save()
return redirect('/todo')
def read_view(request, id):
if request.method == 'GET':
user = request.user.is_authenticated
if user:
todo = TodoModel.objects.get(id=id)
return render(request, 'todo/read.html', {'todo': todo})
else:
return redirect('/user/sign-in')
이렇게 todo
의 멤버변수에 데이터의 속성을 할당하고 save()
메서드만 호출하면 저장이 끝난다. 가져올 때는 TodoModel.objects.get()
를 사용하면 된다.