How to use effectively Django ORM
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()
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
Orner.objects.create(name = "jay", age = "25")
Orner.object.get(name="jay")
Orner.object.filter(name="jay")
Orner.object.get(name="jay").update(name ="jayko")
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의 조합은 너무나도 강력한 조합이다.
Author And Source
이 문제에 관하여(How to use effectively Django ORM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jay95ko/How-to-use-effectively-Django-ORM저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)