[필수 포함 사항]
- READ.ME 작성
- 프로젝트 빌드, 자세한 실행 방법 명시
- 구현 방법과 이유에 대한 간략한 설명
- 완료된 시스템이 배포된 서버의 주소
- 해당 과제를 진행하면서 회고 내용 블로그 포스팅
- Swagger나 Postman을 이용하여 API 테스트 가능하도록 구현
주요 평가 사항
- 주어진 정보를 기술적으로 설계하고 구현할 수 있는 역량
- 확장성을 고려한 시스템 설계 및 구현
과제 안내
디어는 사용자의 요금을 계산하기 위해 다양한 상황을 고려합니다.
- 우선 지역별로 다양한 요금제를 적용하고 있습니다. 예를 들어 건대에서 이용하는 유저는 기본요금 790원에 분당요금 150원, 여수에서 이용하는 유저는 기본요금 300원에 분당요금 70원으로 적용됩니다.
- 할인 조건도 있습니다. 사용자가 파킹존에서 반납하는 경우 요금의 30%를 할인해주며, 사용자가 마지막 이용으로부터 30분 이내에 다시 이용하면 기본요금을 면제해줍니다.
- 벌금 조건도 있습니다. 사용자가 지역 바깥에 반납한 경우 얼마나 멀리 떨어져있는지 거리에 비례하는 벌금을 부과하며, 반납 금지로 지정된 구역에 반납하면 6,000원의 벌금을 요금에 추과로 부과합니다.
- 예외도 있는데, 킥보드가 고장나서 정상적인 이용을 못하는 경우의 유저들을 배려하여 1분 이내의 이용에는 요금을 청구하지 않고 있습니다.
최근에 다양한 할인과 벌금을 사용하여 지자체와 협력하는 경우가 점점 많아지고 있어 요금제에 새로운 할인/벌금 조건을 추가하는 일을 쉽게 만드려고 합니다. 어떻게 하면 앞으로 발생할 수 있는 다양한 할인과 벌금 조건을 기존의 요금제에 쉽게 추가할 수 있는 소프트웨어를 만들 수 있을까요?
우선은 사용자의 이용에 관한 정보를 알려주면 현재의 요금 정책에 따라 요금을 계산해주는 API를 만들어주세요. 그 다음은, 기능을 유지한 채로 새로운 할인이나 벌금 조건이 쉽게 추가될 수 있게 코드를 개선하여 최종 코드를 만들어주세요.
다음과 같은 정보들이 도움이 될 것 같아요.
- 요금제가 사용자 입장에서 합리적이고 이해가 쉬운 요금제라면 좋을 것 같아요.
- 앞으로도 할인과 벌금 조건은 새로운 조건이 굉장히 많이 추가되거나 변경될 것 같아요.
- 가장 최근의 할인/벌금 조건의 변경은 '특정 킥보드는 파킹존에 반납하면 무조건 무료' 였습니다.
이용에는 다음과 같은 정보들이 있습니다.
use_deer_name (사용자가 이용한 킥보드의 이름)
use_end_lat, use_end_lng (사용자가 이용을 종료할 때 위도 경도)
use_start_at, use_end_at (사용자가 이용을 시작하고 종료한 시간)
데이터베이스에는 킥보드에 대해 다음과 같은 정보들이 있습니다.
deer_name (킥보드의 이름으로 고유한 값)
deer_area_id (킥보드가 현재 위치한 지역의 아이디)
데이터베이스에는 지역에 대해 다음과 같은 정보들이 있습니다.
area_id (지역 아이디로 고유한 값)
area_bounday (지역을 표시하는 MySQL spatial data로 POLYGON)
area_center (지역의 중심점)
area_coords (지역의 경계를 표시하는 위도, 경도로 이루어진 점의 리스트)
데이터베이스에는 파킹존에 대해 다음과 같은 정보들이 있습니다.
parkingzone_id (파킹존 아이디로 고유한 값)
parkingzone_center_lat, parkingzone_center_lng (파킹존 중심 위도, 경도)
parkingzone_radius (파킹존의 반지름)
데이터베이스에는 반납금지구역에 대해 다음과 같은 정보들이 있습니다.
forbidden_area_id (반납금지구역 아이디로 고유한 값)
forbidden_area_boundary (반납금지구역을 표시하는 MySQL spatial data로 POLYGON)
forbidden_area_coords (반납금지구역의 경계를 표시하는 위도, 경도로 이루어진 점의 리스트)
회고
- 이번 과제에서는 확장성에 대한 부분을 상당히 강조한 과제이다. 과제 진행에 앞선 수업에서 OOP수업을 통해 클래스에 대해 배웠다. '클래스를 어떻게 활용하느냐'에 집중하여 과제를 해결하는 것이 관건이다. 요금조건에 대한 추가 삭제가 용이하게 구성해야 한다. 우리 팀은 책임연쇄패턴으로 디자인했다. 새롭게 알게 된 디자인 패턴이었는데 간단히 설명하면 클라이언트의 요청을 처리할 수 있는 처리객체를 집합(Chain)으로 만들어 부여함으로 결합을 느슨하기 위해 만들어진 디자인 패턴이다. 계산조건에는 크게 기본요금과 할인과 벌금으로 간단하게 생각하자. 우선 각 계산조건에 대한 공통부분을 클래스로 만들었다.
다음 체인으로 넘어가거나 계산을 하거나 체인을 추가하는 메소드를 공통으로 묶었다.
아래는 기본요금 계산에 대한 코드이다.
추상클래스를 상속하여 기본요금을 계산하는 클래스를 구성한다. 이와 같은 방식으로 할인과 벌금에 대한 클래스를 선언한다. 이후 체인을 관리하는 클래스를 만들어 요금체계에 맞게 체인의 순서를 설정하여 계산한다.
아래는 체인을 관리하는 클래스이다. ![](https://velog.velcdn.com/images%2Fraejun92%2Fpost%2F6ac06c38-f69e-41de-bc22-95d20503a45e%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-11-22%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.54.53.png)
체인을 실행하는 메소드와 이용정보를 토대로 data를 만들어 주는 메소드가 있다.
요금체계에 맞게 체인의 순서를 설정한다.
기록
- 시간을 ms로 나타냄
![](https://velog.velcdn.com/images%2Fraejun92%2Fpost%2F675055e6-5b5c-49a9-a9a8-4abac007f3fe%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-11-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.54.15.png)
- mysql의 공간 데이터 타입
sequelize POLYGON 선언
MySQLworkbench![](https://velog.velcdn.com/images%2Fraejun92%2Fpost%2Fcbed8a12-48b2-4a2e-8fad-ffe8922d4e89%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-11-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.02.13.png)
sequelize POINT 선언
MySQLworkbench![](https://velog.velcdn.com/images%2Fraejun92%2Fpost%2F2d1edc26-68f4-4c29-9470-09dc333b722c%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-11-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.05.03.png)