Maeily hotel 프로젝트 후기!

minch·2021년 8월 29일
0
post-thumbnail

프로젝트 후기!

새로운 마음으로 시작했던 2주간의 두번째 프로젝트도 마침내 끝이났다!

첫번째 프로젝트에 비해서 하루가 더 짧았기 때문에 심적으로 초조함이 있었지만,
그래도 첫번째 프로젝트에서는 막연하게 zero 베이스에서 시작했던 것과 달리 조금 더 수월하게 진행이 되었던 것 같다.
(경험의 중요성..)


프로젝트 주제가 선정되고, 데일리 호텔이라는 사이트를 맡게 되었다.

처음에는 '일반적인 커머스 사이트와 크게 다르지 않는데?' 라는 생각으로
1차때와는 다른 성격을 띄는 사이트를 하고 싶어했기 때문에 실망을 하였지만,

점점 하다보니 그러한 생각이 크게 틀렸다는것을 깨닳게 되었다.

(정말 큰 착각이었다...)

처음 모델링을 진행하면서, 가장 고민이 되었던 것은
한 호텔에서 방의 종류가 있고, 각각의 방에 대한 개수가 한정되어 있는데,

날짜별로 방의 예약이 다 차면 더 이상 그 방을 예약할 수 없게
처리하는 것에 대해 정말 고민이 많았다.

그러다가, 같은 고민을 하던 동기분의 아이디어를 듣고
날짜별로 재고관리를 할 수 있는 테이블을 따로 두는 것이 어떠냐는 제안에
그 것을 바탕으로 테이블을 만들었었다.

예를 들어,

id잔여방날짜room_id
1102021.08.201
2192021.08.202
3202021.08.211

위의 테이블과 같이 해당하는 방에서 예약이 이루어질때마다
잔여방이 하나씩 차감되는 식이다.

하지만 이 테이블 없이 충분히 그 여부를 판단가능하다 결론지어서
최종 ERD는 아래와 같이 그 재고테이블을 지우고 설계하였다.


기억나는 코드

기억나는 코드는 어김없이 이 여부를 판단하는 곳에서 발생하였다.

호텔리스트에서 체크인 날짜와, 체크아웃 날짜를 받으면
해당하는 날짜에 예약리스트를 확인하여 그 숫자를 세고,
방의 총 갯수에서 빼는 로직을 구현하기 위해서 처음에는

from django.db.models import Sum, Count, F, Q
from stays.models import Staytype
from datetime import date
check_in  = date(2021,8,21)
check_out = date(2021,9,1)
q1 = Q(room__book__check_in__range = [check_in, check_out])
q2 = Q(room__book__check_out__range = [check_in, check_out])
q3 = Q(room__book__check_in__lte = check_in, room__book__check_out__gte = check_out)
stays = Staytype.objects.anotate(
	remains = Sum(F('room__quantity'), distinct = True)
         	- Count(F('room__book_id'), filter = (q1|q2|q3), distinct = True))

위와 같은 방법으로 해보았지만,

room에서 book 테이블로 참조하는 과정에서
모텔은 room_option이 여러개이기 때문에 오류가 발생하여,
제대로 연산이 되지 않았다.

(room_option에 숙박만 존재하는 호텔과는 달리, 모텔에서는 숙박과 대실 두가지가 존재하기 때문에)

이 문제점을 해결하기 위해서 여러 방법으로 고민하던 중,
Subquery를 사용하여 해결할 수 있었다.

from django.db.models import Subquery, OuterRef
booked_count = Staytype.objects.annotate(
	booked_count = Count('room__book__id',
    		       filter = (q1|q2|q3))).filter(pk = OuterRef('pk'))
stays = Staytype.objects.anotate(
	total = Sum('room__quantity'),
        booked_count = Subquery(booked_count.values('booked_count')))

이렇게 OuterRefSubquery가 참조하고자 하는 값을 설정하고,
해당하는 값들을 지정하면, booked_count의 값들을 해당 쿼리를 바탕으로 불러오게 된다.


이번 프로젝트 기간에는 정말 많은 것을 얻을 수 있엇다.

1차때는 scrum 방식의 개발로 협업의 중요성에 대한 것을 얻을 수 있었다면,
2차 프로젝트는 기능 개발에 대해 초점을 맞추고 그 방향성으로 쭉 진행했었다.
(물론 그렇다고 scrum을 안지켰다는 뜻은 아니다.)

위에서 설명한 부분 말고도 달력부분에서 해당하는 날짜에 대해서 처리하는 부분이나, S3를 이용하여 이미지파일을 업로드하고 저장하는 부분

그리고 리팩토링을 거치면서,
객체 지향 프로그래밍(Object-Oriented Programming)에 맞게,
코드의 재사용, 코드 중복 방지, 유지보수 등을 위한 여러가지 Tip들을 얻을 수 있었다.

개인적으로 얻어가는 것이 많은 프로젝트였다.

프로젝트를 마무리하면서 짧은 기간 동안 여러 의견을 나누고,
조율해가면서 고생한 우리 팀원 모두에게 정말 감사하다.

앞으로 지나게 되어 돌이켜보면,
기억 속에 굵직하게 임팩트를 남긴 팀으로 생각날 것 같은 느낌이다.


프로젝트 기간동안 막혔던 코드들 : Blocker,
Github : 매일리호텔

0개의 댓글