위코드 2차 프로젝트 리뷰 - Backend 기준

Taeha Kim·2020년 9월 13일
0

PROJECT

목록 보기
2/3
post-thumbnail

위코드 2차 프로젝트 리뷰

위코드 부트캠프 11기 2차 프로젝트 MagicConch팀의 kinfolk클론 입니다.

개발 인원 및 기간

개발 인원

개발 기간

  • 2020/08/31 ~ 2020/09/11

프로젝트 목적

슬로우 라이프 스타일 잡지 킨포크를 클론함으로써 데이터 모델링, 회원가입, 소셜 로그인, 장바구니 등의 기능을 구현하고 개발 역량을 기르고자 한다.

Modeling

적용 기술 및 구현된 기능

Frontend, Backend 공통

  • JSON
  • Git
  • Linux
  • HTTP
  • Scrum 방식의 프로젝트 진행

Backend 적용 기술

  • Python, Django web framework
  • Bcrypt
  • JWT
  • MySQL
  • 카카오 소셜 로그인

내가 구현 기능 및 한 일들

  • BeautifulSoup, Selenium을 통한 웹 데이터 크롤링
  • 상품 카테고리 및 상품 상세 페이지 엔드포인트 구현
  • Django Q객체를 통한 검색 기능 구현

잘한점

  • 오프라인 프로젝트 진행의 불편함을 극복하기 위해 노력
    이번 2차 프로젝트는 1차 프로젝트와 달리 프로젝트 기간 전체 2주를 온라인으로 진행 했습니다.
    바로 옆에 앉아 같이 작업하지 못하고 원격으로 하다보니 오프라인 진행에 비해 소통에 불편함을 느꼈고 더욱 적극적으로 팀원간 소통을 하려고 노력했습니다.
  • 팀원간의 격려
    이번 킨포크 사이트는 킨포크 특성상(잡지) 웹사이트내의 데이터가 계속 변했습니다.
    특히 프론트엔드는 메인 페이지의 레이아웃 변화, 백엔드는 크롤링하는 도중 상품 페이지의 변화가 생겼고, 이로 인해 프로젝트의 세부 진행 계획이 예정보다 늦어지는 일이 발생했습니다.
    다들 당황스럽고, 곤혹스러운 상황이였지만 이럴때 더욱 괜찮다 할 수 있다며 팀원간에 응원과 격려가 있어서 이런 상황속에서도 2차 프로젝트를 재밌게 할 수 있었습니다.

아쉬운점

  • 1차 프로젝트 때와 마찬가지로 프론트엔드와의 소통
    프로젝트가 온라인으로 진행되다 보니 팀원간의 소통을 더욱 절실해서 구글밋, 줌으로 계속 팀원간에 대화를 했었습니다. 다만 팀원간에 대화는 늘었지만 다들 경험 부족으로 필요했던 대화는 많이 하지 못했습니다. 특히 저같은 경우에는 상품 정보를 어떻게 프론트에게 넘겨줄 것인지, 예를 들어 상품하나가 여러 이미지를 가지고 있을때 이미지 URL들을 어떤 자료형으로 넘길것인지에 대해서 충분한 대화가 이루어지지 못해 마지막가서 프론트엔드, 백엔드 전부 고생한 경험이 있었습니다.

  • 미처 구현 못한 기능들
    이번 킨포크를 클론 프로젝트를 하면서 팀원 프론트엔드던 백엔드던 다사다난한 일들이 많았습니다.
    위에서 언급했던 사이트 내부의 변화 말고도 팀원 두 분의 노트북이 프로젝트 도중에 고장나서 한분은 새로 구매 했어야 했고, 한분은 수리로 인해 하루 가까이 프로젝트 진행을 하지 못했습니다.
    (그래도 서로 당황하지 말고 멘탈 잡으라며 격려와 응원이 있어서 흔들리지 않고 프로젝트를 계속 진행했던거 같습니다.)
    프론트엔드, 백엔드의 상황이 이렇다 보니 프로젝트 초기에 구상했던 기능들을 모두 구현하지 못한채 시연을 하게 되어 아쉬웠습니다.
    구현하지 못한 기능들로 아쉬움이 남을지언정 우리 팀원 모두 최선을 다했기에 후회는 없습니다.
    시간 부족으로 미처 구현 못한 기능들은 기업 협업 이후 다시 모여서 구현 및 리펙토링 하기로 했습니다.

저는 이번 프로젝트를 통해서 백엔드가 프론트엔드에게 어떤 데이터를 어떻게 넘겨줄것인지,
프론트엔드에서 상품 정보 조회시 쿼리스트링은 상품 ID로 할것인지 상품명으로 할것인지 등...
백엔드와 프론트엔드간에 맞추어야 할 것들이 무엇인지, 상호간에 진짜 필요한 소통이 무엇인지 알게 되었습니다.

기억에 남는 코드

Django QuerySet을 이용한 데이터 가져오기

제가 구현한 기능중에서 검색 기능이 있습니다. 처음 구현할때에는 DB의 각 테이블 컬럼별로
접근해서 검색어와 일치하는 데이터를 확인하고 일일이 가져왔었는데, 이런식의 접근으로는 검색어 하나당 데이터베이스에 6번이나 접근을 했었고, 성능저하를 일으켰습니다. 그러다가 Q객체를 알게되었고 이것을 이용해서 검색어를 찾다보니 테이블 하나당 한번만 접근 하면 되어서 최종적으로는 DB Hit를 6번에서 2번으로 줄였습니다.

class SearchView(View):
    def get(self, request, item):
        results = []
        search_shop = list(ShopProduct.objects.filter(
            Q(outer_tag__icontains = item) | 
            Q(inner_description__icontains = item) | 
            Q(inner_details__icontains = item)
            ).values()
        )
        search_category = list(CategoryProduct.objects.filter(
            Q(title__icontains = item) | 
            Q(description__icontains = item) | 
            Q(tag__icontains = item)
            ).values()
        )
        results.append(search_shop)
        results.append(search_category)

        if results[0] == []:
            return JsonResponse({'Massage': 'No results found'}, status = 400)
        return JsonResponse({'search_results': results}, status = 200)
profile
함께 성장하는 개발자가 되고 싶습니다.

0개의 댓글