프리온보딩 과제 4

Tasic·2021년 11월 12일
1
post-thumbnail

과제 정보 요약

  • 구현 기간 : 21.11.01(17시) ~ 21.11.13 (10시)
  • 자세한 내용은 Github 참조

거래내역 조회 기능

제가 맡은 일은 계좌의 거래내역을 조회하는 기능을 담당하였고, 요구사항은 다음과 같습니다.

  • 해당계좌의 주인만 조회할 수 있도록 구현
  • filtering 지원
  • ordering 지원
  • pagination 지원

그래서 맨 처음에는 url을 아래와 같이 생각하였습니다.

/accounts/<account_id>/?[필터, 정렬, 페지네이션]

그 이유는 계좌라는 하나의 자원의 요소라고 판단했기 때문입니다.
하지만 위에 url은 한 계좌 자체의 정보를 보여주는 편이 더 적합하다고 생각했습니다.

그래서 아래와 같이 변경하였습니다.

/accounts/<account_id>/tradelogs?[필터, 정렬, 페지네이션]

이렇게 되면, 한 계좌거래내역들을 나타내기 좋다고 판단하였습니다.

이제 구현만 하면 되는데, DRF 특성상 기준이 되는 자원들만 filtering, ordering, pagination을 지원하였습니다. 즉 지금 이 기능은 계좌가 기준이 되기 때문에, 기본적으로 DRF에서 제공해주는 필터, 정렬, 페지네이션을 적용 할 수 없었습니다.

그래서 1차로 생각한 것은 거래내역 관점에서 본 /tradelogs?account_id=1 url이 였다. 구현 측면에서도 깔끔하게 구현 할 수 있다.
하지만 이러한 url의 의문이 있었는데, query string에 들어가는 값에 따라서 403 에러를 보내주는 것이 맞는가? 라는 의문이였습니다.

그래서 고민하고 있다가 상용서비스인 인스타그램을 들어가서 url을 살펴 보았다.

해당 url은 특정 user의 팔로잉 리스트를 출력하는 것인데, <자원>/<자원의 관련된 자원들> 구조여서 이전에 생각했던 것과 비슷한 구조였습니다.

그래서 결론적으로 처음에 생각한 대로 하되, drf에서 사용되는 로직을 참고하여 구현하였습니다. 참고한 로직은 GenericAPIView
paginate_queryset, filter_queryset 입니다.

	# 해당 계좌의 해당되는 전체 거래내역의 queryset을 구함
        account = self.get_object()
        tradelogs = TradeLog.objects.filter(account_id=account.id)
        
        # 해당구조로 만들어줘야 filter_set에서 사용 할 수 있음
        filter_set = {
            'data'    : request.query_params,
            'queryset': tradelogs,
            'request' : request,
        }
        
        # 필터가 적용된 결과값
        filterset = TradeLogListFilter(**filter_set)

        if not filterset.is_valid() and self.raise_exception:
            raise utils.translate_validation(filterset.errors)

	# 커서 페지네이션 사용
        cursorPaginator = CursorPagination()
        # 페이지 사이즈 지정
        cursorPaginator.page_size = 20

        ordering_filter = {'desc': '-created_at', 'asc': 'created_at'}
        
        # orderling 할 필드 및 정렬 방식 지정 (원래 로직은 View에 지정된 filter의 값을 얻어서 알아서 세팅한다)
        cursorPaginator.ordering = ordering_filter.get(filter_set['data'].get('order'), '-created_at')
        
        # pagination 된 Queryset
        paginated_tradelogs = cursorPaginator.paginate_queryset(filterset.qs, request)
        result = TradeLogSerializer(paginated_tradelogs, many=True)
        
        # pagination 정보를 포함하여 결과를 보냄 (일반 response로 보내게 되면  pagination 관련 정보
        # (cursor, limit, offset, page, page_size 등)가 결과에 포함되지 않음
        return cursorPaginator.get_paginated_response(result.data)

결론적으로 아래와 같은 결과가 나올 수 있었습니다.

{
    "next": "http://localhost:8000/accounts/1/tradelogs/?cursor=cD0yMDIxLTExLTEyKzE5JTNBMjIlM0EzMQ%3D%3D",
    "previous": null,
    "results": [
        {
            "code": "출금",
            "amount": 8215807487384682905,
            "balance": 1000000,
            "description": "Feel stop second popular local. Turn popular include. Close real ball.\nLight southern me media exact",
            "created_at": "2021-11-12T23:13:21"
        },
        {
            "code": "출금",
            "amount": 3819251598706783859,
            "balance": 1000000,
            "description": "Kind everyone perhaps anyone foot grow. Either finish hot he experience indeed full.\nOpen conference",
            "created_at": "2021-11-12T22:54:54"
        }
        .
        .
        .

swagger

지난 프로젝트에서는 swagger에서 요청이 안되서 postman을 새로 만들었었습니다.

Request URL이 docker 컨테이너 이름으로 되어 나오기 때문에, 서버에 요청을 할 수 없는 상황이였습니다. 임시긴 하지만 나중에는 유동적으로 설정이 되도록 구현 해야겠습니다. 그래도 먼가 보이지 않았는데, 해결의 실마리를 찾은 것 같아서 기분이 좋습니다.

swagger의 관련 url를 설정하기 위해서는 schema_view가 필요한데, 아래와 같이 구현합니다. 여기서 url 이라는 변수에 서버 ip주소를 입력하면 됩니다. 이는 제가 사용한 패키지인 drf_yasg 문서에 configuration 항목에 있습니다.

swagger_schema_view = get_schema_view(
    openapi.Info( 
        title            = "회사",
        default_version  = "v1",
        description      = "과제 API",
        terms_of_service = "https://www.google.com/policies/terms/",
    ), 
    public = True, 
    permission_classes=(AllowAny,),
    #url = '127.0.0.1:800'
)

마치며

이제 과정 반정도 진행했는데, 돌아서 생각해보면 잘 구현했다고 생각된 내용도 있고, 제출 후에 다시 생각해봤 을때, 조금 이상하겠다라는 내용들도 있었습니다.
그래도 매번 잘 할 수는 없지만 포기하지 않고 지금까지 이 과정을 진행했다는 것에 뿌듯하고 남은 2주동안도 발전하면서 유종의 미를 걷을 수 있도록 노력해야겠습니다.

profile
블로그 옮겼습니다 (https://jotasic.github.io)

1개의 댓글

comment-user-thumbnail
2021년 11월 29일

👍👍👍👍👍✨✨✨✨✨

답글 달기