[Django] 장고 ORM

sudog·2023년 9월 5일
0

Django

목록 보기
4/13

웹 프로젝트를 진행하다 보면 데이터베이스가 필요해질 때가 온다. 유저의 정보, 유저가 작성한 글, 장바구니, 구매 내역 등 데이터가 많아지면 이를 데이터베이스에 입력하고 이를 바탕으로 서비스를 제공하게 된다.

그런데 서버가 데이터베이스와 직접 통신하는 것은 그다지 바람직하지 않다. 여러 단점들이 있기 때문이다.

  • 데이터베이스의 종류에 따라 쿼리문이 다를 수 있다.
  • SQL쿼리 작성이 복잡할 수 있다.
  • SQL 인젝션으로 인해 데이터베이스가 삭제되거나 중요한 정보를 탈취당할 위험이 있다.
  • 데이터베이스 모델 변경이나 유지보수가 어려울 수 있다.

따라서 대부분의 웹 프레임워크에서는 서버와 데이터베이스 사이의 인터페이스로 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)

TodoModelmodels.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()를 사용하면 된다.

profile
안녕하세요

0개의 댓글

Powered by GraphCDN, the GraphQL CDN