[python] Django REST framework에서의 실시간 검색 기능 추가 방법

Django REST framework은 웹 애플리케이션의 개발을 쉽게 만들어주는 강력한 도구입니다. 이 글에서는 Django REST framework를 사용하여 실시간 검색 기능을 추가하는 방법을 안내하겠습니다.

1. Elasticsearch 설치

실시간 검색을 구현하기 위해서는 먼저 Elasticsearch를 설치해야 합니다. Elasticsearch는 고성능 검색 엔진으로, Django와 연동하여 효과적인 실시간 검색을 제공합니다. Elasticsearch를 설치하는 방법은 Elasticsearch 공식 문서를 참고하시면 됩니다.

2. Django-Elasticsearch 연동 설정

Django에서 Elasticsearch를 사용하기 위해서는 django-elasticsearch-dsl 패키지를 사용하면 편리합니다. 이 패키지는 Django와 Elasticsearch 간의 연동을 쉽게 처리해주는 도구입니다. 패키지를 설치한 후, settings.py 파일에 다음과 같이 Elasticsearch 연동 설정을 추가합니다.

ELASTICSEARCH_DSL = {
    'default': {
        'hosts': 'localhost:9200'
    },
}

위의 예제에서는 Elasticsearch를 로컬호스트의 포트 9200에서 실행한다고 가정하고 설정을 작성하였습니다. 실제로 사용하는 Elasticsearch의 호스트와 포트에 맞게 설정해주시기 바랍니다.

3. 모델과 Serializer 작성

실시간 검색을 위해서는 Elasticsearch 인덱스와 그에 해당하는 Django 모델이 필요합니다. 모델에는 Elasticsearch를 위한 필드를 정의해야 하며, SearchIndex를 통해 Elasticsearch와의 연결을 설정해야 합니다. Serializer는 Elasticsearch 인덱스와 Django 모델 간의 데이터 변환을 도와줍니다.

예를 들어 Product 모델을 검색 대상으로 사용한다고 가정하겠습니다. Product 모델을 위한 Elasticsearch 인덱스와 ProductSerializer를 다음과 같이 작성합니다.

from django_elasticsearch_dsl import Document, Index, fields
from elasticsearch_dsl import analyzer

product_index = Index('products')

# Elasticsearch 인덱스 설정
product_index.settings(
    number_of_shards=1,
    number_of_replicas=0
)

@product_index.document
class ProductDocument(Document):
    name = fields.TextField(
        analyzer=analyzer('english')
    )
    description = fields.TextField(
        analyzer=analyzer('english')
    )

    class Django:
        model = Product
        fields = [
            'name',
            'description',
        ]

# Serializer 작성
class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'description']

위의 예제에서는 namedescription 필드를 지정하여 Elasticsearch 인덱스에 저장하도록 설정하였습니다.

4. 실시간 검색 API 작성

이제 실시간 검색을 위한 API를 작성하여 Django REST framework에 추가해보겠습니다. views.py 파일에 다음과 같이 코드를 작성합니다.

from django_elasticsearch_dsl_drf.filter_backends import (
    FilteringFilterBackend,
    OrderingFilterBackend,
    SearchFilterBackend,
)
from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet
from rest_framework import viewsets

from .documents import ProductDocument
from .serializers import ProductSerializer

class ProductViewSet(DocumentViewSet):
    document = ProductDocument
    serializer_class = ProductSerializer

    filter_backends = [
        FilteringFilterBackend,
        OrderingFilterBackend,
        SearchFilterBackend,
    ]

    search_fields = [
        'name',
        'description',
    ]

    ordering_fields = [
        'name',
    ]

위의 예제에서는 DocumentViewSet를 사용하여 Elasticsearch 인덱스와 Django 모델을 연결하고, 실시간 검색을 위한 필터링 백엔드와 정렬 백엔드, 검색 백엔드를 설정하였습니다. search_fieldsordering_fields를 통해 검색과 정렬을 할 필드를 지정해주어야 합니다.

5. URL 설정

마지막으로 URL 설정을 해주어야 합니다. urls.py 파일에 다음과 같이 코드를 작성합니다.

from django.conf.urls import include, url
from rest_framework import routers

from .views import ProductViewSet

router = routers.DefaultRouter()
router.register(r'products', ProductViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]

위의 예제에서는 ProductViewSetproducts URL에 연결하였습니다.

결론

이제 Django REST framework와 Elasticsearch를 활용하여 실시간 검색 기능을 구현하는 방법에 대해 알아보았습니다. Elasticsearch를 설치하고, Django와 연동하기 위해 django-elasticsearch-dsl 패키지를 사용하였습니다. 실제 데이터 모델을 Elasticsearch와 연결하고, 검색과 정렬을 위한 API를 작성하는 방법을 살펴보았습니다. 이러한 실시간 검색 기능은 사용자에게 더 나은 검색 경험을 제공하는 데 도움이 될 것입니다.

더 많은 정보와 자세한 내용은 Django REST framework 공식 문서Elasticsearch 공식 문서를 참고하시기 바랍니다.