2차 프로젝트 AirBnB 클론 프로젝트 후기 _[BeerBnB]

dream.log·2021년 9월 12일
2

dream.log

목록 보기
10/12
post-thumbnail

1차가 끝난 피로가 완전히 풀리지 않은채 맞이한 2차 프로젝트.
무사히 마무리하고, 잘 마쳤는지 회고해보는 시간을 가지려고 한다!
이미 2주가 흘러버렸지만, 회고해보자!

🏠 프로젝트 소개

여행은 살아보고, 맥주는 마셔보는거야!
술을 마시기 좋은 장소를 소개합니다 !

🏠 Overview
✔️ 프로젝트 기간
2021.08.17 (화) - 2021.08.27 (금)

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

✔️ 백엔드 기술 스택
: ERD-AQueryTool, Python, Django, MySQL, AWS RDS, Docker, Git

✔️ Communication
: Trello, Notion, Slack, google docs

🏠 백엔드 업무 진행내역

☑️ User

➡️ 카카오 소셜 로그인
➡️ 프론트 단에서 카카오 토큰을 받아 서버 토큰으로 반환
➡️ 기존에 등록되어 있는 회원 정보(닉네임, 프로필 사진)는 카카오 기반으로 업데이트
➡️ 로그인 데코레이터

☑️ Product

➡️ quary parameter를 이용한 상품 필터링(주소, 체크인, 체크아웃, 인원)
➡️ 상품 상세 정보 및 예약 가능 일자 확인
➡️ 호스트 되기 상품 등록

☑️ Booking

➡️ 숙소 예약 기능 구현
➡️ 내가 예약한 숙소 확인
➡️ 내가 등록한 숙소의 예약 현황 확인

🏠 모델링

모델링은 크게 User, Booking, Product, Review로 나누어 진행하였다.
이번엔 소셜 로그인을 구현해야 했기에, 카카오 소셜 로그인을 포함하기로 하고, 이미지의 경우에는 별도의 테이블로 관리를 했다.
주소는 필터링을 위해 따로 테이블을 만들어주었다.
리뷰의 경우 모델링시 반영하긴 하였지만, 시간관계상 따로 작업을 진행하지는 않았다!

이번에 상품 관련된 뷰를 맡아 진행하며, 상품이 주소를 참조하는 관계에 관련해서 헷갈려 고민을 많이 했었다.
정참조, 역참조, 쿼리셋등 기초 개념의 중요성을 다시 한 번 느끼며...!

💌 커뮤니케이션

➡️ Trello

: 트렐로는 1차 때도 사용했지만, Blocker를 공유하는 것이 무엇보다 중요하다는 사실을 깨닫고,
이번에는 미팅로그에 스탠드업 미팅 이전 개개인의 블로커를 기록했다. 그 블로커 내용을 회의 때 나누며 어떻게 해결하면 좋을지? 몇시까지 해결할지 공유했다. 그리고, 해당 블로커 해결을 도와줄 수 있는 팀원이 있다면 함께 도와주며 업무의 능률을 높였다! (협업을 정말 잘하는 우리팀원들 짱짱...!)

미팅 기록을 간략하게 정리해서 로그에 저장했고, 원활한 프-백간 통신을 위해 IP 주소는 메일 업데이트하며 트렐로를 활용했다!

➡️ Google Slides(Sketch)

각 페이지별 컴포넌트 분류하여 간략하게 도식화
컴포넌트마다 어떤 위치에 어떤 API를 사용하는지 직관적으로 확인 가능

➡️ Google Spreadsheet(API정의서)

API별 기능, Method, URI, Request 및 Response 정리

🥲 내가 만난 문제, 어떻게 해결했나?

➡️ UnitTest

2차 프로젝트를 진행하며 유닛테스트를 무조건 진행해야했다.
1차 때보다 조금- 실력이 성장했다고 그래도 코드 짜는데 걸리는 시간은 (아주 조금) 단축되었는데,
유닛테스트를 하느라 이틀씩 시간이 허비됐다..... 유닛테스트는 조금의 오타가 발생하면 Fail이 뜨기 때문에
필요한 부분을 일목요연하게, 꼼꼼하게 작성해야 한다는 것을 배웠다.
실제 배포 이전, 반드시 필요한 부분이므로 어렵더라도 극복해야 할 부분이다...!
하다 보면 능숙해지겠지...!

➡️ 주소 split을 통해 '호스트 되기' 페이지의 입력된 주소 분리하기

 Category.objects.create(
            product       = product,
            big_address   = product.address.split(" ")[0],
            small_address = product.address.split(" ")[1],
        )

        if not data["address"]:
            return JsonResponse({"MESSAGE": "ADDRESS_DOES_NOT_EXISTS" },status = 400)   

: 해당 코드는 호스트 되기 페이지에 사용자가 집 주소를 입력하고,
그 주소를 대주소와 소주소로 나누어 저장해주는 코드이다.
지금 보면 엄청 간단하기도 하고 왜이렇게 고민했나 싶은데....ㅎㅎ
그 당시는 하나로 입력된 주소를 분리해서 저장하는 것 자체가 쉽지 않았고,
해당 과정에서 원하는대로 데이터가 슬라이싱 되지 않아 애를 먹었다.
파트너인 종규님이 꽤 많은 힌트를 주었지만, 조금은 시간이 지체되었던 코드!
코드의 작성이 힘들었다기 보다는..
입력된 데이터를 어떻게든 가공해서 원하는대로 사용할 수 있다는 발상의 전환을 준 코드여서 기억에 남는다.
(이렇게 슬라이싱 하고 재조합 하는 방법을 잘- 배워서 기업협업에서 나름!? 유용하게 써먹었다!ㅎㅎ)

➡️ 상세페이지의 객실 예약된 날짜 프론트에게 보내 예약불가로 표시하기

class DetailCalender(View):
    def get(self, request, product_id):
        today   = date.today()
        booking = Booking.objects.filter(Q(product_id=product_id)& Q(check_out__gte = today))
        
        if not booking.exists() :
            return JsonResponse ({"message":"NO_BOOKING"}, status = 400)

        response = []
        for i in booking:
            booking_date = [response.append((i.check_in+ timedelta(days=j)).strftime("%Y-%m-%d")) \
                for j in range((i.check_out-i.check_in).days)]

        return JsonResponse({"message":response}, status = 200)  

✔️ 오늘 날짜를 date를 import 해와 불러온다.
✔️ 예약 데이터를 Q 객체를 활용해 불러온다. 체크아웃 날짜를 기준으로 오늘 날짜 이후인 데이터만!
: 없다면 예약이 없다는 에러를 반환해준다.

✔️ 예약된 데이터를 담아줄 빈 리스트를 만들어주고 for문을 돌려 append한다.
: 체크아웃 날짜 - 체크인 날짜를 뺀 날짜들을 모두 담는다.

✔️ 해당 데이터를 response에 담아 200과 함께 프론트에 돌려준다.

✔️ 날짜와의 전쟁이었다....! 체크아웃 날짜 이후인 데이터를 불러오는 것도,
원하는 데이터를 append에 담아 보내는 것도 마음처럼 잘 되지 않았다.
시작부터 끝 날짜가 모두 출력되어야 하는데,
시작 날짜와 끝 날짜만 출력된다던가,
출력되는 날짜의 데이터가 원하는 방식과는 맞지 않는다던가....
머지데이까지 원하는 방식대로 데이터가 나오지 않아 고민 많이 했는데,
종규님이 도와주셔서 for문을 통해 코드를 다듬고, 원하는 방식으로 데이터를 잘 뽑아낼 수 있었다!

어려웠지만, 기억에 남고 애정이 가는 코드였다!

🌈 프로젝트 총평

☑️ 개인적인 총평

➡️ 프론트분들과 적극적으로 의사소통을 했다!

: 1차 프로젝트를 진행하며, 프론트 분들과 의사소통을 제대로 하지 못한게 아쉬움이 남아
2차 프로젝트에서 PM을 맡았다.
우리팀은 워낙 둥글둥글하고- 프론트의 리더 나현님과 백엔드의 리더 종규님이 계셔서
너무나도 수월하게 PM을 할 수 있었다! 잘 모르거나 헷갈리는 프론트 용어들에 대해 적극적으로 물어보고,
의사소통을 했다. 통신을 비롯한 많은 일들을 종규님께서 진행해주셔서 정말 감사했다.

➡️ 두려워하지 않고 상품관련 view를 작성해보았다.

1차때 user와 review 관련 뷰를 작성하고, 2차에는 어떤 부분을 맡을까 고민을 많이 했는데
상품관련된 부분을 맡아보고 싶어 진행을 하게 되었다.
생각보다 유닛테스트도 있고 나의 코딩실력이 부족한 탓도 있어서 시간이 많이 딜레이 됐다.
내가 시간이 늦어져 상품 부분의 뷰도 도와주시고, csv 파일 작성 및 통신도 진행해주신 종규님 덕분에
이번 프로젝트를 무사히 마무리 할 수 있었다고 생각한다.
아직 더디지만, 실력적으로 1차 때보다 조금 더 발전하였다는 사실에 뿌듯했다...!

☑️ 그리고 우리 비어비앤비 팀


(종규님.. 조금 더 가까이 오세요!!!)

프론트의 리더로 전체적인 그림과 진행사항을 공유하고 라우팅 작업까지 맡아서 진행해주신 긍정요정 나현님!
1차에 이어 2차에서도 만난 묵묵히 할 일을 진행하며 팀원들을 잘 챙겨주던 따뜻하고 꼼꼼한 가영님!
여러 Blocker가 많아 진행에 애를 많이 먹었음에도 무사히 해내고, 해결하기 위해 열심히 고민했던 문실님!
맡은 부분을 뚝딱뚝딱 잘 처리하고 팀원들과 "함께" 문제를 해결해나가고 적극적으로 의사소통했던 윤아님!
전체적인 큰 그림을 보며 업무를 진행하고, 번거로운 작업들도 묵묵히 진행해주시고 더딘 나를 기다려주고 도와준 종규님까지!

너무나도 열심히 임하고, 협업도 원활히게 진행했던 우리 팀원들 덕분에!
무사히 프로젝트를 마칠 수 있었다고 생각한다.
확실히 2차 프로젝트가 되고나니 체력적으로도 많이 지쳐 1차때보다 더 많은 기능을 구현하지 못한 것 같아
개인적인 아쉬움이 남지만, 부족한 부분은 리팩토링 때 채워볼 수 있으니까-!

(비교적) 스무스했던! 2차 프로젝트 회고록도 드디어!!!!! 완성!

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

2개의 댓글

comment-user-thumbnail
2021년 10월 11일

도담님 같이 팀으로 진행할 수 있어서 즐거웠습니다:)!! 저희 취업하고 회포를 풀어보아요

1개의 답글