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']
위의 예제에서는 name
과 description
필드를 지정하여 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_fields
와 ordering_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)),
]
위의 예제에서는 ProductViewSet
를 products
URL에 연결하였습니다.
결론
이제 Django REST framework와 Elasticsearch를 활용하여 실시간 검색 기능을 구현하는 방법에 대해 알아보았습니다. Elasticsearch를 설치하고, Django와 연동하기 위해 django-elasticsearch-dsl
패키지를 사용하였습니다. 실제 데이터 모델을 Elasticsearch와 연결하고, 검색과 정렬을 위한 API를 작성하는 방법을 살펴보았습니다. 이러한 실시간 검색 기능은 사용자에게 더 나은 검색 경험을 제공하는 데 도움이 될 것입니다.
더 많은 정보와 자세한 내용은 Django REST framework 공식 문서와 Elasticsearch 공식 문서를 참고하시기 바랍니다.