[python] Django REST framework에서의 쿼리 최적화 방법

Django REST framework은 강력한 웹 프레임워크로서 데이터베이스 쿼리 최적화를 효과적으로 수행할 수 있습니다. 이번 글에서는 Django REST framework에서의 쿼리 최적화 방법에 대해 알아보겠습니다.

select_related는 Django ORM에서 제공하는 기능으로, 외래키 관계에 있는 모델의 데이터를 미리 조회하여 쿼리를 최적화할 수 있습니다. 이는 데이터베이스의 조인 연산을 최대한 줄여주어 쿼리 성능을 향상시킬 수 있습니다.

예를 들어, Author 모델과 Book 모델이 1:N 관계일 경우, Book을 조회할 때 해당 BookAuthor 정보를 함께 조회하려면 다음과 같이 select_related를 사용할 수 있습니다.

books = Book.objects.select_related('author').all()

prefetch_related는 Django ORM에서 제공하는 기능으로, 역참조 관계에 있는 모델의 데이터를 미리 조회하여 쿼리를 최적화할 수 있습니다. 이는 데이터베이스의 추가 쿼리를 효율적으로 처리하여 쿼리 성능을 향상시킬 수 있습니다.

예를 들어, Author 모델과 Book 모델이 1:N 관계일 경우, Author을 조회할 때 해당 Author의 모든 Book 정보를 함께 조회하려면 다음과 같이 prefetch_related를 사용할 수 있습니다.

authors = Author.objects.prefetch_related('book_set').all()

3. 필요한 필드만 조회

Django ORM에서는 values() 메서드를 사용하여 필요한 필드만 조회할 수 있습니다. 이는 데이터베이스로부터 전체 필드를 조회하는 것이 아니라 필요한 필드만 조회하여 쿼리 성능을 향상시킬 수 있습니다.

예를 들어, Book 모델에서 title 필드와 author 필드만 조회하려면 다음과 같이 values() 메서드를 사용할 수 있습니다.

books = Book.objects.values('title', 'author')

4. 캐시 사용

Django ORM은 기본적으로 쿼리 결과를 캐시하여 성능을 향상시킬 수 있습니다. 쿼리 결과를 캐시하면 같은 쿼리를 반복해서 수행할 때 데이터베이스에 접근하지 않고 캐시된 결과를 사용할 수 있습니다.

books_cache = cache.get('books_cache')
if not books_cache:
    books_cache = Book.objects.all()
    cache.set('books_cache', books_cache, timeout=3600)

5. 인덱스 추가

데이터베이스에서 자주 조회되는 필드에는 인덱스를 추가하는 것이 좋습니다. 인덱스를 추가하면 데이터베이스가 해당 필드를 검색하거나 정렬할 때 효율적으로 처리할 수 있습니다.

class Book(models.Model):
    title = models.CharField(max_length=100, db_index=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

위의 예시에서 title 필드에 db_index=True를 설정하여 인덱스를 추가했습니다.


이와 같이 Django REST framework에서는 다양한 방법으로 쿼리를 최적화할 수 있습니다. 위의 방법들을 적절히 활용하여 웹 애플리케이션의 성능을 향상시키세요.

참고자료