쉬운 설명과 함께 Django로 검색 기능 만들 때 핵심 기능 구현해보기
django로 구현해볼 수 있는 여러가지 기능 중 하나는 자바스크립트 (특히, Jquery를 활용한 JS)를 함께 사용해 데이터 베이스 내에 존재하는 값을 비동기처리해서 실시간으로 값을 보여주는 기능일 것이다.
Django 자체가 본래 비동기식 렌더링을 지향하는 프레임워크가 아니다보니, 화면을 렌더링 할 때 마다 모든 화면의 내용이 새로 불러오는 현상이 발생한다.
굉장히 비효율적인 화면 출력방식이고, 이 때문에 화면 부분 부분에 JS를 적절히 활용하면 — 특히 AJAX — 사용자와 상호작용하는 듯한 화면 UX를 구성할 수 있고, 비효율적인 화면 렌더링 문제를 어느정도 해결해 줄 수 있다는 장점을 갖게 된다.
특히 Django를 활용한 AJAX 예시는 구글링 하다보면, 크게 2개가 나온다. 첫번째는 좋아요/싫어요 구현, 두번째는 게시글 검색(또는 사용자 검색이나 검색어 자동완성)이다.
이 글의 목적을 명확히 밝히자면 AJAX를 활용한 게시글 검색 및 Jquery를 사용한 화면 표출을 구현하는 과정이라 말할 수 있다.
자, 그럼 한 번 내가 구현하는 과정을 풀어보겠다.
위의 views.py에서 구현한 함수는 Django를 구현하면서 어느 때고 볼 수 있는 평범한 FBV 코드다. 그런데 풀이가 중요한데,
먼저 첫 번째로, url_parameter = request.GET.get(“q”,None)이다.
Client가 서버로 보내는 요청에는 다양한 값이 있고, 여러분이 요청에 관련한 코드를 구현하다보면 분명히 개발자 도구를 확인할 일이 있다. 그 개발자 도구 안에 Network라는 곳을 들어가면, GET/POST라고 대문자로 입력된 사용자 요청 분류된 현황을 볼 수 있다. request.GET은 그 분류된 요청 중 GET을 가져오는 것이고, 뒤에 따라오는 메소드 get은 파이썬 Dictionary에서 value 값을 가져오는 역할을 수행하는데, 이는 request.GET이 기본적으로 Dictionary (얼핏 Json을 연상시키는… 가만? Json인가?)에서 값을 가져오기 때문이다.
그래서 사용자가 요청한 값이 있다면 — if url_parameter: — 그 요청한 값을 토대로Post.objects.filter(title__contains=url_parameter)를 대입한다. filter에는 다양한 값이 사용될 수 있는데, 그 다양한 값이란, 우리가 models.py에서 지정한 클래스 내 변수들을 의미한다.
예를 들어, filter(title =) 또는 filter(contents=) 이런 형태를 사용한다는 것이다. 그런데, 이렇게 활용할 경우, 해당하는 단어가 정확하게 일치하지 않으면, 필터링이 안된다는 점이다. 그래서 이 부분을 보완하기 위해 __contains가 포함된다. __contains를 사용하면 단어의 일부만 입력해도, 그 단어와 연관된 모든 단어들이 리스트 형태로 표기가 된다.
그리고 이 데이터를 사용자 요청이 Ajax라면 문자열로 렌더링하고, 최종적으로 반환하는 값은 Json으로 response를 보내서 프론트엔드에서 Jquery로 받을 수있게 작업하면 된다.
그리고 이것을 Jquery로 AJAX 형태로 받아오면 완성!
처음으로 Gist를 사용해서 Medium에 글을 업로드 하는데, 코드가 짤려서 나오는듯하다.
Django의 경우 Rails와 동일하게 ORM을 사용해 SQL을 처리하다보니, views.py에서 ORM을 사용하는 방법을 능숙하게 활용할 수록 데이터 처리를 효율적으로 할 수 있는 것 같다. 따라서, 공부하는 방향을 SQL과 ORM으로 잡고 꾸준히 해보면 어떨까 싶다.
관련해 참조할 수 있게 코드를 캡쳐해서 올리니, 언제든 게시글에 댓글 남겨서 편하게 소통할 수 있으면 좋겠다.
Reference
views.py
home.html
Ryan Kim