DotFriends

⚫️ DotFriends 프로젝트 후기

King of Silicon Valley 2021. 9. 12. 20:46
728x90

⚫️ DotFriends

시연동영상

🌄 이미지를 클릭하면 시연 영상을 시청하실 수 있습니다.

프로젝트 링크: http://18.224.25.47:3000/


⭐️  프로젝트 소개

  • 라인프렌즈 커머스 사이트 라인프렌즈샵 클론 프로젝트
  • 기획, 디자인 시간 단축을 위해 사이트의 디자인과 레이아웃만 참고해서 만들었습니다.

🤔  기획 의도

  • 라인프렌즈 사이트 자체를 따라하기 보다는 재치있는 아이디어를 통해, Line 이 아니라 Dot Friends 로 이름을 정했습니다.
  • 코로나시대에 맞게 사람과 사람을 연결하는 Line이 아니라 개인 혼자 (Dot) 집에서 지낼 때 활용할 수 있는 상품을 판매하는 컨셉을 잡았습니다

📆  개발 기간

  • 2021.08.30 - 2021.09.09
  • 리팩토링은 계속 진행 중입니다.

👨‍👩‍👦  개발 인원

  • FrontEnd
    • 3명
  • BackEnd
    • 3명

🎬 시연 영상


🛠 테크 스택

Backend

Language     : Python 3.7
WebFrameWork : Django 3.2
Database     : MYSQL 5.7

DevOps

AWS EC2
AWS RDS

👩‍👩‍👧‍👦 협업 도구

Slack
Github
Trello

🚀 프로젝트 후기

🤼 합시다! 애자일

프로젝트를 시작하기 앞서
PM으로써 애자일 방법론을 실천하고 싶었습니다.
애자일 애자일 많이 들어봤지만 정확 개념을 알고자 로버트 C.마틴의 '클린 애자일' 책을 사서 애자일이 무엇인지 공부했습니다. 

2주 동안의 짧은 기간 속에 적용시킬 애자일 방법론 원칙을 하나 정했습니다.

목표는 작게

불가능한 목표를 세우고 프로젝트 막바지에 가서 계획이 애당초 달성 불가능하다는 걸 깨닫고 계획을 수정하는 단계에 이르렀을 때 이미 코드는 엉망인 상태가 될 것이라 생각했습니다.
그래서 목표를 작게 잡는 것을 우리 프로젝트의 제1원칙으로 정했습니다.

작은 목표를 세워서 지키고 리팩토링 시간에 더 투자를 해서 견고한 코드를 만들고 시간이 남으면 추가 기능을 만들기로 했습니다.

티켓 관리

목표를 아무리 작게 잡아도 계획은 변동이 있을 수 있으므로 효율적인 티켓 관리를 위해서 협업 도구로 트렐로를 선정했습니다.

 

1차 스프린트가 끝나고 우리 팀의 속도를 측정할 수 있는 작은 데이터가 쌓였고
데이터를 이용해서 2차 스프린트 계획을 조정했습니다.
결국 목표한 계획을 이루었고 만족한 결과물을 얻을 수 있게 됐습니다.

잦은 소통

프론트엔드와 협업을 처음 해보기 때문에 다양한 문제가 발생될 거라 예상이 되었습니다.
그래서 백엔드에서 맡은 기능과 대응되는 프론트엔드 팀원과 끊임없는 소통을 했습니다.

수정사항이 생길 때마다 변경사항을 공유하고 맞춰 보았기 때문에 프론트엔드와의 소통의 문제는 없었습니다.


👨🏼‍💻 내가 구현한 기능

  • 상품 상세페이지 조회 API
  • 상품 리스트 조회 API 

견고한 코드를 만들자! 

  • 이렇게 작은 목표를 세우면서 지키고자 한 가치는 견고한 코드를 만드는 것이었습니다.

500에러를 잡기 위한 노력(상품 리스트 조회 API) 

  • 상품리스트 조회(Get)API에서 쿼리 파라미터로 들어온 값에 따라서 에러가 날 수 있는 모든 경우의 수를 대비했습니다.
  • 프론트엔드에서는 정확히 우리가 원하는 값을 전해줄 수 있지만 악의적인 의도를 갖고 파라미터에 이상한 값을 주어졌을 때 500에러를 막기 위한 대비를 했습니다.
def input_validator(func):
    def wraper(self, request, *args, **kwargs):
        try:
            offset   = int(request.GET.get('offset', 1))
            limit    = int(request.GET.get('limit', 12))
            order    = request.GET.get('order', 'id')
            category = request.GET.get('category', 0)

            if (category != 'new' and category != 'sale') and category and not (Category.objects.filter(id=int(category)).exists()):
                return HttpResponse(status=404)

            if not (order == 'id' or order == '-id' or order == '?'\
                or order=='-popular' or order=='-updated_at' or order =='price' or order =='-price'):
                return HttpResponse(status=400) 
        except ValueError:
            return HttpResponse(status=400)
        return func(self, request, *args, **kwargs)
    return wraper
  • 쿼리 파라미터에 들어온 입력값을 미리 걸러주는 데코레이터를 만들었습니다.
  • 원하는 값이 아닌 값을 집어넣으면 에러를 잡거나 기본값으로 설정해 줍니다.
  • 상품 페이지 조회API에 넣어주었을 수도 있지만 코드가 길어지고 다른 사람들이 상품 리스트 조회 API 코드를 봤을 때 직관적이게 어떻게 기능하는지 알아보기 힘들기 때문에 데코레이터를 만들어 검증 부분을 분리시켜 코드의 가독성을 높였습니다. 

⭐️ 기능 구현 과정과 고민 추가 예정


소감

  • 프로젝트를 하면서 가장 많이 느낀 감정은 행복입니다. 
  • 팀원들의 끊임없는 격려와 응원으로 좋은 분위기 속에 프로젝트를 만들었던 것 
  • 팀원과 소통하면서 더 나은 방법을 찾고자 끊임없는 토론과 토론에 따른 선택 
  • 소프트웨어를 서로 하나씩 하나씩 쌓아올려가면서 만들어지는 과정과 결과물을 볼 수 있다는 점 
  • 이 모든 과정을 할 수 있어서 행복했습니다.