Q객체 [20211001]

이번주 금요일 (10월 1일)까지 하여 2차 프로젝트도 마무리 되었다. 프로젝트 회고록은 추후에 따로 블로깅 할 예정이다. 이번에는 프로젝트 도중 인상 깊었던 코드가 있어서 그 내용을 공유하고자 이 글을 작성한다.

이번에 공유하고자 하는 내용은 제목에서 볼 수 있듯이 Q객체의 활용이다.

<목차>
1. 구현 기능
2. 코드
3. Q객체 사용이유

1. 구현 기능

  먼저 내가 구현해야 되었던 기능을 말하자면 아래의 사진의 필터 기능과 같다.

위 사진을 보게되면 거래내역 항목에 5개의 탭이 있는데, 탭을 누를 때 마다 구분에 해당하는 항목을 필터링해줘야 하는 기능을 구현했어야 했다.

우리팀의 다른 팀원의 경우에는 모든 각탭에 해당하는 모든 데이터를 동시에 프론트에 보내준 다음에 프론트에서 처리하게끔 하였는데, 다른 방식으로 해보는 것은 어떨까 라는 생각이 들어 query parameter를 활용하여 기능 구현을 시도하였으며 성공하였다.

2. Code

  내가 기능 구현한 코드는 아래와 같다.

class TransactionHistoryView(View):
    @login_decorator
    def get(self, request):

        type_id = request.GET.get("type_id", None)
        q = Q()

        if type_id:
            q = Q(type=type_id)

        transactions = (
            Transaction.objects.filter(user=request.user)
            .filter(q)
            .order_by("-created_time")
        )

        return JsonResponse(
            {
                "transactions": [
                    {
                        "created_time": transaction.created_time,
                        "type": transaction.type.name,
                        "information": transaction.information,
                        "amounts": transaction.amounts,
                    }
                    for transaction in transactions
                ]
            },
            status=200,
        )

간략하게 설명하자면, query parameter를 사용하기 위해 파라미터의 key 값을 type_id로 주었다. 그리고 Q 객체를 활용하여 type_id를 필터링 하게끔 설정하였다.

로직은 다음과 같다.

  1. 먼저 q객체에 빈 값을 할당해 준다.
  2. 만약 type_id가 있다면 q객체에 q = Q(type=type_id)로 재할당 해준다.
  3. 그 후에 filter(q)를 사용하여 q객체 값을 통한 필터링을 진행하게 된다.
  4. 만약 query parameter 값이 없다면 빈 q객체를 통해 따로 필터링 작업이 필요하지 않으며, query parameter 값이 있다면 해당 type_id 값으로 Q객체를 통해 필터링이 진행된다.

이런식으로 코드의 길이를 많이 줄일 수 있었다.

3. Q 객체 사용이유

  Q객체를 사용한 이유는 코드를 비교적 깔끔하고 길이를 줄이기 위해서 였다. 특히 query parameter를 쓰지 않을 경우, 각 탭에 해당하는 데이터를 전부 보내줘야 하기 때문에 데이터 중복이 일어날 것으로 생각했다. 그래서 먼저 query parameter를 사용하는 쪽으로 고려를 하였다.

처음에 query parameter를 사용했을 때는 Q객체는 따로 고려하지 않고 if, else 문을 사용하였으나, 현재 위의 코드보다는 다소 길고 직관적이지 못했었다. 같은 기수 동기가 Q객체를 활용해 보는 것이 어떠냐는 의견을 주었고 괜찮을 것 같다고 판단하여 적용하게 되었다.

참고로 나는 Q 객체를 활용한 필터링을 사용한 것은 이번이 처음이었다. Q 객체의 경우 and, or의 방식으로 필터링을 진행해야 할 경우 매우 효율적이라는 이야기를 들었는데 앞으로 기회가 되면 자주 활용해봐야겠다는 생각을 했다.

그럼 이만...

좋은 웹페이지 즐겨찾기