본문 바로가기

Server-DB/MySQL

Django를 어렵게 만드는 ORM에 관해 | 엑셀양식을 만든다고 생각해보자

Node.js와 Django는 스타트업 소프트웨어 엔지니어에서 주로 사용되는 웹프레임워크다. 헌데 Node를 쓰는 상황이 있고, Django를 쓰는 상황이 있는데, 특히 빅데이터 분석이 필요하거나 DB기능이 중요한 경우에는 Django를 사용하게 된다. 

 

그러나 Django에 있어서 난이도를 높히는 요소들이 몇가지 있을 수 있으나, 그 중에서 가장 까다로운 것은 ORM이 아닐까한다. Url Mapping이나 Class-based View를 사용하는 것은, 사실은 어느 웹프레임워크나 똑같기 때문에 Django만의 차별점이 있다면 ORM이 아닐까 싶다. 이 ORM이란 어떻게 이해해야할까

 

models.py에 적는 class는 엑셀의 양식을 만들어주는 것이다.

Django를 처음 사용할 때 했던 오해는 데이터가 models.py에 저장된다고 생각한 점이다. 헌데 이를 잘 생각해보니, models.py에서 정의하는 객체(class)란 엑셀의 양식을 만드는 것과 유사하다는 점을 깨달았다.

 

위 이미지에서 어떤 시트에 날짜, 구분, 등의 항목들을 정의해주는 것이 models.py에 class를 정의하는 행위이다. 그리고 그 안에 담긴 내용들은 models.py가 아니라 django의 기본 db인 sqlite 혹은 따로 import한 db에 저장되는 것이다.

 

그래서 만약에 날짜에서 특정값을 찾고 싶다면, 저 위에 있는 테이블이 Accounts라는 것으로 정의되었을 때,

specific_date = Accounts.objects.filter(날짜="찾고자하는날짜") 로 하면 해당하는 날짜에 맞는 데이터가 나온다. 마치 엑셀에서 실제로 필터기능을 이용하는 것과 비슷하다. 이를 실제로 코드로 살펴보면 다음과 같다.

 

//models.py

from django.db import models
import string
import random


def generate_unique_code():
    length = 6

    while True:
        code = ''.join(random.choices(string.ascii_uppercase, k=length))
        if Room.objects.filter(code=code).count() == 0:
            break

    return code

# Create your models here.
class Room(models.Model):
    code = models.CharField(max_length=8, default=generate_unique_code, unique=True)
    host = models.CharField(max_length=50, unique=True)
    guest_can_pause = models.BooleanField(null=False, default=False)
    votes_to_skip = models.IntegerField(null=False, default=1)
    created_at = models.DateTimeField(auto_now_add=True)
    current_song = models.CharField(max_length=50, null=True)

엑셀로 비유하면, Room이라는 시트를 만들고, 그 안에 code, host 등의 이름이 붙은 카테고리를 만든다.

 

//views.py

class LeaveRoom(APIView):
    def post(self, request, format=None):
        if 'room_code' in self.request.session:
            self.request.session.pop('room_code')
            host_id = self.request.session.session_key
            room_results = Room.objects.filter(host=host_id)
            
            if len(room_results) > 0:
                room = room_results[0]
                room.delete()
            
        return Response({'Message': 'Success'}, status=status.HTTP_200_OK)

models.py에서 엑셀양식을 만들었으면, 이제 그 안에 담긴 데이터들을 조작할 수 있다. host라는 카테고리에서 특정 값을 지닌 데이터만 필터링해서 뽑아올 수 있다. 그리고 그 데이터란 sqlite라는 내부DB에 들어있다.

 

이것은 그냥 상상이지만, 데이터 분석이 필요하다면, ORM을 활용하여 filter로 필요로 하는 데이터를 가져왔을 때, 아마 그 결과물 안에는 여러 개의 데이터가 들어있을 것이다. 그러면 이것을 pandas로 dataframe화 시켜서, 몇가지 데이터분석을 해볼 수도 있을 것이다. 그러나 이 부분은 제품을 만드는 입장에서는 깊게 고민하지 않아도 되는 부분같다.