[2차프로젝트] AirBitAndBite 후기

김기용·2021년 1월 24일
0
post-custom-banner

👨‍💻👩‍💻[총원: 5명 | 프론트엔드: 2명 | 백엔드: 3명 ]
후기는 프로젝트를 진행하면서 가장 기억에 남는 부분을 모아 만들었습니다.


😉 OVERVIEW | 개요

온라인 숙소 예약 플렛폼을 모델링부터 배포까지 재개발 하였으며 날짜입력을 통한 온라인 예약시스템 구현을 목표로 하였습니다. 프로젝트매니저 역할을 수행하면서 스크럼방법론을 적용한 agile(기민한) 조직을 구성하는 목표를 하였으며, Trello를 활용해 Sprint(업무주기)를 관리하였습니다.


💿 MODELING


🎯 PERSONAL OBJECTIVE | 개인목표

2차 프로젝트를 하면서 꼭 해보고 싶었던 기능이 바로 예약기능이였습니다. 사용자가 속소검색을 날짜와 함께 검색을 할경우 그 날짜에 해당하는 비어있는 숙소를 반환해서 보여주어야 했다.


🤔 PROBLEM | 문제

예약이 되어있는 객실과 빈 객실을 구분했어야하는데 문제는 입력받은 데이터 값은 string 타입이였고 이 데이터 형태로는 비교 연산을 할 수 없었다.


🥳 SOLUTION | 해결방안

입력받은 값을 비교가능한 integer 값으로 만들어 주려고 하였지만 단순 숫자의 크기만으로 비교하게 될경우 날짜가 가진 특징을 가질수 없었다. 그러던 중 파이썬의 datetime 객체에 대해 알아보게 되었고 이 객체를 사용하면 날짜 비교연산이 가능하다는 사실을 알게되었다.

비교가능한 값을 만들려면 먼저 데이터가 고정된 포멧으로 들어와야 한다. 그러기 위해 정규표현식을 통해 입력받은 데이터의 유효성 검사를 해주는 함수를 구현하였다.

def validate_date_format(date):
    return re.match('^[0-9]{4}-[0-9]{2}-[0-9]{2}$', date)

유효성 검사를 거친 데이터는 비교가능한 datetime object 로 치환시켜주어야 하기 때문에 date_parser 함수를 구현하였다.

def date_parser(date):
    date_list = date.split('-')
    year      = int(date_list[0])
    month     = int(date_list[1])
    day       = int(date_list[2])
    date_time = datetime(year, month, day)
    return date_time

🕹 BUSINESS LOGIC
이제 입력받은 check_in 과 check_out 은 비교가능한 datetime object 가 되었음으로 데이터베이스에 들어있는 Reservation 객체의 check_in 과 check_out 객체와 비교할 수 있다.

def check_availability(property, check_in, check_out):
    bookings      = Reservation.objects.filter(property_id=property.id)
    check_in      = datetime.date(check_in)
    check_out     = datetime.date(check_out)
    availability = []
    for booking in bookings:
        if booking.check_in > check_out or booking.check_out < check_in:
            availability.append(True)
        else:
            availability.append(False)
    return all(availability)

check_availability 함수는 숙소, 체크인 날짜, 체크아웃 날짜를 인자를 받아 해당 숙소의 예약 데이터가 있는지 데이터베이스에 조회를한다.

    bookings = Reservation.objects.filter(property_id=property.id)

이제 bookings 는 해당 프로퍼티에 대한 모든 예약 데이터를 가지고 있는 querySet 이다. for 문을 통해 각 객체를 순차적으로 돌면서 입력받은 체크인, 체크아웃 날짜를 예약데이터와 비교를 하여 availiability 리스트에 True, false 값을 넣어준다.

만약 숙소 날짜와 입력받은 날짜데이터 조건에 어긋나는 경우 예약 불가능이기 때문에 all() 메서드의 특징을 사용해서 false 가 하나라도 리스트안에 존재할경우 false 를 리턴하게 해준다.

availiability 리스트True를 반환한다면 해당 날짜, 숙소의 예약이 비어있음으로 예약가능이라는 뜻이며, False 를 반환한다면 해당 날짜에 예약되어있는 숙소가 존재한다는 의미이기 때문에 예약불가능으로 처리가 되는 로직이다.


profile
매일 새로운 배움을 통해 꾸준히 성장하는 것을 목표를 두고 있습니다. 논리적인 사고로 문제해결 하는것에 희열을 느끼고 언젠가 제가 만든 결과물들이 사람들에게 편이를 제공하며 사용되는 날을 간절히 소망하고 있습니다. 🙏
post-custom-banner

0개의 댓글