How to use effectively Django ORM

6184 단어 djangodjango

1. What is ORM

Django와 DB를 이어주는 소통창구

Django는 많은 RDB를 사용할 수 있다. 우리가 가장 단순한 "SELETC * FROM something" 를 모른다고 하여도, 장고를 이용해서 DB에 CRUD가 가능하다.
그 이유는 장고의 언어로 작성을 하면 알아서 각 RDB의 언어로 변화시켜 DB에 요청을 보내주기에 가능하고 그것이 바로 Django의 핵심 기능인 ORM!!

2. how to use

from django.db import models

class Orner(models.Model):

	name = models.CharField(max_length=50)
    age  = models.intgerField()
    
    def __str__(self):
        return self.name
        
class Dog(models.Model):
	
	name  = models.CharField(max_length=50)
    age   = models.intgerField()
	orner = models.ForeignKey("Orner", related_name="dogs", on_delete=models.CASCADE)
    
    def __str__(self):
        return self.name

1)Create

Orner.objects.create(name = "jay", age = "25")

2)Read

Orner.object.get(name="jay")
Orner.object.filter(name="jay")

3)Update

Orner.object.get(name="jay").update(name ="jayko")

4)Delete

Orner.object.get(name="jayko").delete()

위의 CRUD는 가장 기본적인 Django의 ORM사용 방법이다.

나는 지금까지 위의 방식을 토대로 가능한 부분들을 조금씩 수정해가며 사용을 했다.
하지만 위의 기능만으로 완성했던 코드들의 품질에 대해서 생각하기 시작하면서, 얼마나 많은 DB요청이 이루어 질까 궁금했고, DB에 대한 Query를 찍어보기 시작했다.

그런데 왠걸 내가 지금까지 만든 코드들은 너무나 많은 DB요청으로 인해 실제 서비스에 적용했다면, 아마도 엄청난 DB과부화를 불러일으키는 코드 였다.

이러한 것을 깨닫고 난 후 어떻게 효과적으로 Django ORM을 사용할지 고민했다.

3. effectively Django ORM

1)lazy loading

장고는 lazy loading을 채택하여 사용하고 있다.
ORM에서는 정말 필요한 시점에만 SQL을 호출하는 특징이 있다.

다시 말해, 정말 필요한 시점이 아니면
QuerySet은 SQL을 호출하지 않는다는 것이다.

이는 DB의 접근을 최소화 하기 위한 방법인데, 사용이 잘못 되어진다면 DB의 과부화를 불러일으킨다.
이러한 문제점을 N+1 problem이라고 하는데 이 문제와 해결법은 다음 포스팅에서 다루려 한다.

2)eager loading

eager loading은 queryset이 만들어 질때 바로 DB에 접근하여 해당 정보를 캐싱하여 재사용 할 수 있게 해준다.
queryset이 만들어 질때 바로 DB에 요청을 하기에 불필요한 요청이 생길 수 있다.

위의 두가지 방법을 효율적으로 잘 활용한다면, DB의 접근을 최소화 하면서 우리가 원하는 로직을 구현 할 수 있을 것이다. 다음 포스팅에서 설명하겠지만, lazy loading과 eager loading의 조합은 너무나도 강력한 조합이다.

좋은 웹페이지 즐겨찾기