2차 Project 후기

2cong·2020년 7월 3일
0

Project

목록 보기
6/7

Frip Website Cloning Project

Introduction

  • Frip website clone.
  • Develop Member (3 Front-End , 3 Back-End)
  • develop period : 20.05.11. ~ 20.05.22.

Demo

Technologies

  • python
  • Django web framework
  • MySQL
  • AWS EC2, RDS
  • CORS headers

API Documentation

API document published by postman

Modeling

홈 페이지를 구성하는 Data Base modeling을 진행하였다.
모델링은 아래와 같이 만들었다.


기억하고 싶은 내용

삼항 연산자 (Ternary Operator)

bono's blog를 참고하여 작성한 글

if 와 else 를 이용한 3 항 연산자

# result = when True if condition else when False;
a = 10
b = 20
result = (a-b) if a == b else (a+b)    # 결과는 a+b = 30
  • 결과가 먼저 나와 있고, 그 뒤에 조건(condition)이 있는 형태
  • 만약 이 조건이 참이면 맨처음 연산을 리턴
  • 거짓이면 else 뒤의 연산을 리턴

적용한 코드

data = [{
         "new" : True if frip.id in is_new else False
        }for frip in frips]

# is_new 는 리스트
# is_new에 frip.id가 있으면 True return
# is_new에 frip.id가 없으면 False return

동적 필터 생성

Frip 리스트에 필터 조건을 동적으로 생성하기 위하여 만들었던 코드 중 일부분

 class DailyView(View):
     @login_check_frip
     def get(self,request):
         # 필터로 들어올 수 있는 항목
         # 값이 들어오지 않으면 None으로 처리
         first_category = request.GET.get('fid',None)
         second_category = request.GET.get('sid',None)
         third_category = request.GET.get('tid',None)
         tag = request.GET.get('tag',None)
         startdate = str(request.GET.get('startdate',"1920-01-01"))
         enddate = str(request.GET.get('enddate', "2030-01-01"))
         location = request.GET.get('location',None)
         include = request.GET.getlist('include',None)
         province = request.GET.get('province',None)

         filter_dict={}
         
         # 값이 들어오면 (None이 아닌 경우) 딕셔너리에 값 추가
         if first_category:
             filter_dict['firstcategory'] = first_category
         if second_category:
             filter_dict['secondcategory'] = second_category
         if third_category:
             filter_dict['thirdcategory'] = third_category
         if tag == 'new':
             filter_dict['created_at__range'] = [timezone.now()-datetime.timedelta(days=60),timezone.now()]
         if startdate:
             if enddate:
                 filter_dict['dateValidTo__date__gte'] = startdate
         if 'today' in include:
             filter_dict['today'] = True
         if 'superhost' in include:
             filter_dict['host__super_host'] = True
         if location is not None:
             filter_dict['subregion'] = location
         if province is not None:
             filter_dict['subregion__region_id'] = province
		
         # 동적으로 생성된 필터를 이용
         # 장고 ORM이 딕셔너리를 이용하여 필터 쿼리문 생성
         frips=Frip.objects.filter(**filter_dict)         

필터로 들어올 수 있는 값들을 받아올 수 있도록 만들어둔다. 만약 값이 없으면 None으로 처리하여 Keyerror가 생기지 않도록 하였다.

이 후 None이 아닌 경우 (필터에 값이 있는 경우)에 딕셔너리에 해당 key와 value를 추가한다.

그 이후 딕셔너리를 이용하여 필터를 처리하면 된다.


후기

Frip 사이트는 크롤링 해야 할 데이터가 무척 많았고, 데이터 분류 및 정리가 복잡한 편이었다.
데이터 정리를 하다 보니 초반에 소모한 시간이 무척 컸다. 다른 사람들은 API를 만들고 있는데 우리 팀은 아직 데이터 정리를 하고 있으니 마음이 급하고 불안했다.

하지만 시간 부족의 이유로 초반에 약속했던 기능을 줄이고 싶지는 않았다. 그래서 팀원들 특히 서율님과 밤을 정말 많이 샜다. 3일은 집에 못 들어갔다. 그렇게 한 덕분에 처음 목표였던 부분까지 구현할 수 있었다. 체력적으로 힘들었지만 결국 완성해내서 힘든 시간들을 보상받은 기분이었다. 함께 남아서 작업하던 팀원들이 있어서 기운 낼 수 있었다. 같이 열심히 해주고 서로 응원해 줬던 팀원들에게 너무 고맙다.

프로젝트를 진행하며 단순히 보이기에 그럴듯해 보이는 페이지가 아니라 정말 구현이 되는 페이지를 만들기 위해서 노력했다. 인기순, 별점 순위 및 계산 신규 상품 계산들 모두 그냥 크롤링 해서 박아둔 데이터가 아니라 기준에 따라서 계산하였고 적용되도록 구현하였다. 그래서 더욱 보람차고 뿌듯했다.

이번 프로젝트를 진행하며 동적 필터에 대하여 배우게 되었다. 처음에 봤을 때는 정말 어려워 보였는데 이해하고 나니 어렵지 않았다. 어떤 내용이든 겁먹지 말고 차근차근 배우면 잘 할 수 있다는 믿음을 가지게 된 프로젝트였다.

저번 프로젝트에서는 의사소통을 잘 했다고 당당하게 말할 수 없었다. 그래서 이번에는 의사소통에 정말 많은 신경을 썼다. 의사소통에 신경을 쓰니 일의 효율이 더 올라간 느낌이었다.

코드의 깔끔함에 대해서는 아쉬움이 남는다. 좀 더 좋고 간결하게 쓸 수 있었을 텐데 시간에 쫓겨 좋은 코드에 대해서는 많은 고려를 하지 못했던 것 같다. 더욱 효율적인 코드를 쓸 수 있도록 공부해야겠다.

0개의 댓글