1차 프로젝트 Gaebalance (뉴발란스) 페이지 클론 후기

dream.log·2021년 8월 15일
0

dream.log

목록 보기
7/12
post-thumbnail

👟 프로젝트 소개

New Balance 홈페이지를 신발이 아닌 옷 판매 사이트로 컨셉을 변경하여 Clone하였습니다!

👟 Overview

✔️ 프로젝트 기간
2021.08.02 (월) - 2021.08.13 (금)

✔️ 팀 구성
프론트엔드 3명, 백엔드 3명

✔️ 백엔드 기술 스택

  • Python

  • Django

  • ERD: AQueryTool

  • MySQL

  • Git

  • Communication
    : Trello, Notion, Slack, google docs

✅ 백엔드 업무 진행 내역

[공통 진행사항]

➡️ django 초기셋팅
➡️ Aquery tool 모델링
➡️ DB 구축
➡️ User,Product, cart, review models.py 작성

[개별 진행사항] _ 개인 진행내역 : 오렌지 색 볼드처리.

➡️ 회원가입 views.py 작성
➡️ 로그인 views.py 작성
➡️ 로그인 데코레이터 작성
➡️ 상품 리스트 조회 (개별 상품 상세 정보)
➡️ 상품 다중 필터링
➡️ 상품 정렬 (limit/offset으로 data 노출 제한)
➡️ 장바구니 등록 / 조회/ 수정 / 삭제 구현
➡️ 상품별 금액, 총 금액 관리
➡️ 동일 상품 수량 증가 처리
➡️ 수량 수정 및 개별 상품 삭제
➡️ 리뷰 등록 / 조회 / 수정 / 삭제 구현
➡️ 리뷰 평점 평균 계산 => 리뷰 조회 시 함께 노출

👟 모델링

: 모델링을 시작하며 최상위 디렉토리부터 셋팅을 시작했다.
가장 최상단인 men - women을 포함하여 진행해야 하는가? 고민을 많이 했는데,
리뷰를 받은 이후 해당 부분은 프론트단에서 nav바에서 구현해주기로 하고, 카테고리부터 나누었다!

앱은 크게 user, product, cart, review! 리뷰는 추가구현이었지만, 구현을 할 수도 있으니 모델링 단계에서 함께 구현하기로 했다.
모델링 단계에서도 color 테이블과 user color 테이블을 어떻게 분리하면 좋을까?에 대해 고민을 많이 했는데,
실제로 User Model의 Colors에 대한 뷰를 작성할 때 애를 먹었던 부분이기도 하다🥺

migration 이후에도 작은 수정사항들이 종종 생겨 모델을 수정하기도 했다.
모델링을 초기단계에서 완벽하게- 할 수 있다면 참 좋겠지만, 프론트와 맞춰나가며 계획이 변경되다보면 모델링을 변경하고 구체화하는 과정은 어쩔 수 없지 않나..! 싶기도 했다.
수정 할 일이 생긴다면, 한 사람이 migrate를 한다는 원칙만 잘 지키며 모델링을 수정하자!

✅ 내가 만난 문제, 어떻게 극복했나?

➡️ ManyToMany 필드의 다중 참조

: 상단에도 한 번 언급했던 User Model의 UserColor 부분 뷰 작성 관련 부분이다.
지금 보면 간단해보이지만, ManyToMany필드에서 두가지 조건을 가져와야 한다는 것이 감이 잡히지 않았다.
이틀을 고민하며... 울면서 코드를 짰던 부분이기도 하다 ㅠㅠ
(이 때 적극적으로 도와주신 병주님과, 진수님께 무한한 감사를 드린다...⭐️)

UserColor는 UserModel에 속하며, user는 user Model의 ForeignKey이며,
color는 Product의 Color의 ForeignKey이다. user를 가져오는 것은 어렵지 않았지만,

-color를 어떻게 가져와야 하는가?
-color의 data가 여러개인데, 어떻게 뽑아와야 하는가?

이 두가지 문제가 나를 괴롭혔다. for문을 활용할 수 있겠다는 생각은 했지만,
막상 멘탈이 깨지고나니 어디서부터 손을 대야 하나 막막했는데.. 병주님의 도움으로 멘붕의 터널에서 빠져나올 수 있었다.

1. for문 활용하여 작성하기

for color_id in data["colors_id"]:
  UserColor.objects.create( user = User.objects.get(id=user.id),
  color = Color.objects.get(id=color_id) )

: for문을 활용해 colors id data를 불러온 후, UserColor를 생성해준다.
그 후 각각의 조건을 걸어준다.

2. bulk_create 활용하여 작성하기

UserColor.objects.bulk_create([ UserColor(user= user, 
color=Color.objects.get(id=color_id)) for color_id in data["colors_id"]]) 

: bulk_create는 한번에 많은 데이터를 생성/업데이트 할 때 유용하게 쓸 수 있는 구문이다.
for문을 활용해 작성하여 리뷰를 요청드렸었는데, 멘토 경훈님께서 bulk_create를 활용한 구문으로
바꾸어 작성해보라고 하셔서 작성을 해보게 되었다. 비슷한 형태의 구문이지만, 데이터 측면으로 접근했을때, bulk_create가 훨씬 효율적이라는 것을 배울 수 있었다.

➡️ git....git...git...

다른 팀원분들이 작성하신 부분이 Merge 되기 시작하고,
나도 User부분 관련 view를 모두 작성하고 새로운 브랜치를 만들어 작성을 하기 시작한 2주차....
confilct가 발생해 해결하려고 보니 git이 완전히 꼬여 있었다..

원인은 checkout을 제대로 하지 않아 feature/user 안에 새로운 feature/decorator 브랜치가 생겨버린 탓..

자주 발생하는 오류 예시로 올라와 있는 것을 확인했음에도 실수를 해버렸다.
git log를 활용해서 되돌리고, 삭제하고, 다시 올려보고 2주차 월요일 하루를 git과의 사투를 벌인 듯 하다.
병주님과 멘토 수진님의 도움으로 git 지옥에서 겨우겨우 탈출 할 수 있었다 ^^..

무척 멘붕이었지만, 덕분에 git 사용법에 대해 더욱더욱더욱... 학습할 수 있었던 계기가 되었다.

➡️ all_rating. 리뷰의 평균 평점 계산하기

첫째주는 Color때문에 골치가 아팠다면,
둘째주는 리뷰의 평균 평점을 계산하는 공식을 작성하느라 고민했다.
내가 구현하고자 했던 all_rating은 size rating,color rating, delivery rating 세개의 총합을 구해 평균을 계산하는 방식이었다.
리뷰 한 개당 하나의 평균 평점을 계산하면 되었기 때문에, 쉽게 계산할 수 있을거라 생각했지만,
파이썬스럽게 공식을 작성하는 것이 생각보다 쉽지 않았다.

👊🏻 문제를 해결하기 위해 시도해본 방식
: Q객체, annotate, aggregate, statistics.mean(int가 아니어서 실패),
order_by로 객체를 모아 a라는 변수를 지정하고 a를 aggregate 하기,
product.id 불러와 aggregate 해보기, review의 id를 불러와 aggregate 하기

🤔 삽질의 흔적들

☑️ 결국 어떻게 해결했나?

        rating_field = 
  		Review.objects.annotate(all_rating = (F('size_rating')+ F('color_rating') + F('delivery_rating'))/3)
        all_rating = rating_field.aggregate(Avg("all_rating"))

        result = [
            {
                "user"            : review.user.id,
                "product_id"      : review.product_id ,
                "created_at"      : review.created_at,
                "size_rating"     : review.size_rating,
                "color_rating"    : review.color_rating,
                "delivery_rating" : review.delivery_rating,
                "all_rating"      : all_rating['all_rating__avg'],
                "title"           : review.title,
                "comment"         : review.comment,

            } for review in reviews]

답은 F객체에 있었다.
F객체는 파이썬 메모리로 데이터를 갖고 있지 않고 모델 필드값을 참조해 사용하며
데이터베이스 작업을 수행할 수 있다. annotate를 활용해 계산 값을 받아줄 하나의 필드를 만들었다.
F객체로 각 데이터 값을 불러와 //3을 진행해주었고, 그 값을 all_rating이라는 새로운 변수로 불러와
평균으로 계산해주었다. 내가 3일째 고전하던 문제를 함께 고민해주신 진수님 덕분에 로직을 완성할 수 있었고, 마침내 풀어냈다!
이렇게 불러온 값은 딕셔너리의 value값을 통해 결과 값에 넣어준다!

원하는 값을 얻고나니 어찌나 뿌듯했던지!!!
해결하기까지 여러 개념들을 공부하고, 적용해보고 shell에 찍어본 것으로도 많은 것을 얻은 듯 하다!

✅ 잘한 점

✔️ 리뷰 추가구현을 완료했다!
로그인, 회원가입, 데코레이터 작성까지가 나의 필수 구현 사항이었는데, 빨리 끝났다.
2차 프로젝트 가기전에 CRUD를 구현하고 가보아야 제대로 할 수 있을 것 같아 프론트에서 구현이 되지는 않더라도 완성을 하는 것이 나에겐 의미가 있을 듯 해 뷰를 작성하기 시작했다.

2주차 화요일에 review post 부분을 작성하기 시작했고,
목요일이 merge day였기 때문에 사실 시간이 많지는 않았다.
처음에는 get까지만 자세하게 완성해볼까?
all_rating, 총 평점 부분에 대한 문제가 해결되지 않은 상태였기에 이 문제를 해결하는데 집중해볼까?

두가지의 방법 중 고민하다, 기본적인 뷰일지라도 하나의 CRUD를 모두 작성해보는 것이 의미가 있겠다 싶어 수요일에서 목요일 넘어가는 새벽.. 동틀때까지 뷰를 짰다.
내가 고민하던 all_rating 부분도 진수님의 아주 큰! 도움 덕분에 해결하고,
멘토 경훈님의 리뷰 이후 수정하고 어려운 부분은 멘토 수진님께 다시 질문드리며 18시 이전에 작성을 완료할 수 있었다.
세세하게 살펴보면 추가해야 할 부분이 있지만, 기본적인 CRUD를 시간에 맞추어 구현해 냈다는 점에 내 자신을 칭찬해주고 싶다!

✅ 아쉬운 점

➡️ 꼼꼼하게 작업하자. 엔터는 신중히!

원래도 성격이 조금 급한 편인데.. 엔터는 신중하게 치고, 내 코드를 검증해보는 것이 참말로 중요하다는 깨달음을 얻었다.
django 초기셋팅 시, 다 완료하지 않았는데 git에 업로드를 하려고 해버려 다시 git을 돌리느라 시간이 걸렸다.
이러한 실수를 하지 않으려면 내가 쓴 로직이 맞는지 한 번 더 확인하고 엔터를 쳐야겠다!!!!
일 할 때 꼼꼼하게 잘 하면서! 무언가 빨리 끝내고 싶다는 스스로만의 압박감에 계속 급해졌던게 아닐까 싶다.
하나를 하더라도 실수를 줄이고 꼼꼼하게 코딩하고, 내 코드를 체크해보자!

➡️ 소통..소통...소통..

이 부분은 작성을 해야하나 말아야하나 정말 많이 고민했다.
하지만 솔직하게 말하지 않고서야 진정한 회고가 아니라는 판단으로 적어보고자 한다.

프로젝트 기간, 내가 원하는대로 어떻게 코드를 짜야하나 개인적인 고민도 많이 했고 무척 힘들었다.
하지만 그 고민만큼 나와 합을 맞추고 있는 프론트 팀원과 어떻게 소통해야 할까도 중요한 부분이었다.

의사소통에 있어, 내가 원하는 것을 어떻게 표현해야 하나 조심스러웠고,
나와 합을 맞추던 분도 마찬가지였던듯 하다.

조금 더 적극적으로 서로가 소통하고 원하는 바르 표현했다면
구현해야 했던 부분이 잘 구현되지 않았을까? 하는 아쉬움이 든다.

회원가입, 로그인 뷰는 비교적 간단한? 부분이라고 이야기하지만,
사이에 세세하게 이야기하며 맞춰나갈 부분이 적지 않다.

프론트분야에 대해 잘 모르니 소극적으로 의사소통이 진행되었고,
내가 생각했던 방향과는 다르게 화면이 구현되어 내가 힘들게 구현했던 코드가 실제로는 화면에 나타나지 않을 뻔 하기도 했다.

아쉽기도 하고, 너무 속상했지만.....
2차에서는 보다 적극적으로 프론트분들과 의사소통을 하고,
어떠한 화면을 같이 구현해 나가는지 함께 맞추어 나가보고 싶다!

리팩토링 시 구현하고 싶은 부분

  • 이메일 유효성 검사, 패스워드 유효성 검사 부분 프론트 구현
  • 아이디 / 비밀번호 찾기
  • 리뷰 제품 별 평점 구현 (현재는 전체 리뷰 조회식으로 되어 있음)
  • 리뷰 사진 이미지 업로드 기능

프로젝트를 마치며..

개인적으로 프로젝트를 진행하며 '내가 해야할 몫을 잘 해내는 것'과 타인과의 협업때문에 힘들기도 했다.
그럼에도 함께 공동의 목표를 가지고 나아가고,
여러 어려움을 함께 해결한 덕분에 프로젝트를 무사히 마칠 수 있었다고 생각한다.

모두의 속도를 존중해주며 중심을 잡아준 백엔드 리더 진수님과,
부드럽게 이끌어가주며, 부족한 내게 지식을 나누어준 병주님,
팀의 PM으로 궂은 일을 맡아 진행하고 모두를 챙겨준 가영님,
묵묵하게 흔들림 없이 뚝딱뚝딱 코드를 완성해낸 대웅님,
CSS를 자유자재로 잘 사용하는 현준님

그리고 많은 도움을 주신 멘토님들.

과 함께해 하나의 페이지를 완성할 수 있었다.

사진을 많이 안찍은게 조금 아쉽기도 하다.

2차 프로젝트를 앞두고 ...

✔️ 개인적 목표

  • 내 코드 세번 확인하고, shell에 많이 찍어보기
  • 상품 관련 페이지 맡아 뷰 구현해보기
  • 적은 기능을 하더라도 완벽하게 해내기

✔️ 팀원으로서의 목표

  • 팀원이 어떤 어려움에 처해있는지 함께 고민하기
  • 프론트엔드가 어떠한 로직으로 코드를 짰는지 이해해보기
  • 코드를 붙여볼 때는 미리 체크사항을 정해 검증해보기

벌써 프로젝트 한개가 끝났다니 시원섭섭하다.
2차 프로젝트에는 프론트분과 더욱 적극적으로 소통하고
적절한 목표 설정을 통해 구현하고자 하는 기능을 잘- 구현할 수 있었으면 좋겠다.

2주간 고생했고, 2차도 불태워보자!!!!!!!!!!

profile
한 걸음, 한 걸음 포기하지 않고 발전하는 Backend-developer 👩🏻‍💻 노션 페이지를 통한 취업 준비 기록과 회고를 진행하고 있습니다. 계획과 기록의 힘을 믿고, 실천하고자 합니다.

2개의 댓글

comment-user-thumbnail
2021년 8월 15일

도담님 화이팅!!!

1개의 답글