/meeting-room-reservation

회의실과 날짜, 사용 시간을 입력하여 예약하는 회의실 예약 애플리케이션

Primary LanguageJava

meeting-room-reservation

회의실과 날짜, 사용 시간을 입력하여 예약하는 회의실 예약 애플리케이션

요구사항

  • 웹 어플리케이션으로 개발
  • 웹어플리케이션 개발언어는 Java, Scala, Golang 중 선택을 권장함 (단, 다른 언어에 특별히 자신있는 경우 선택에 제한을 두지 않음)
  • 서버는 REST API로 구현
  • 프론트엔드 구현방법은 제약 없음
  • 데이타베이스는 사용에 제약 없음 (가능하면 In-memory db 사용)
  • 단위테스트 필수, 통합테스트는 선택
  • README.md 파일에 문제해결 전략 및 프로젝트 빌드, 실행 방법 명시

문제해결

  • 예약 시간은 정시, 30분을 기준으로 시작하여 30분 단위로 예약 가능
    • : 문자 기준으로 잘라 minute 부분이 00 or 30 인지 확인
      • 00 or 30 인 경우, 예약 가능
      • 그 외의 경우, 예약 불가능
  • 예약 시간은 시작 시간보다 끝 시간이 커야한다.
    • String 형태인 예약시간을 소수형태로 변환시켜 비교
      • ex) 9:00 => 9, 9:30 => 9.5
  • 1회성 예약과 주 단위 반복 예약 설정 가능
    • DB 구조 2가지를 고민
      1. 예약 날짜만 저장
        • 주 단위 반복 예약의 경우, 반복 횟수만큼 쿼리문이 생성
      2. 예약 시작날짜와 끝날짜 저장
        • 주 단위 반복 예약의 경우, 반복 횟수를 통해 끝날짜를 계산해 저장 => 1개의 쿼리문 생성
  • 동일한 회의실에 중첩된 일시로 예약 불가
    • 같은 날짜, 같은 회의실인 예약 리스트를 가져온다.
      • 1회성 예약
        • 예약 시작 날짜가 같음
      • 반복 예약
        • 해당 날짜가 예약 시간 날짜보다 크거나 같고 예약 끝 날자보다 작거나 같음
        • 해당 날짜와 예약 시작 날짜의 차이가 7로 나누어지는지 확인
          • 나머지가 0이면, 해당 날짜 예약
          • 나머지가 0이 아니면, 해당 날짜 예약 X
    • 위 조건을 만족하는 예약 리스트 중 시간이 겹치는 예약을 찾는다.
      • 예약 시간이 겹치지 않는 경우
        • 해당 예약 시작 시간 >= DB 예약 끝 시간
        • 해당 예약 끝 시간 <= DB 예약 시작 시간
      • 예약 시간이 겹치는 경우
        • 위 두가지를 제외한 나머지 경우
    • 시간이 겹치는 예약이 존재하는 경우, 예약 불가능
    • 시간이 겹치는 예약이 존재하지 않는 경우, 예약 가능
  • 다수의 사용자가 동시에 동일 날짜, 회의실에 예약할 때 일시가 중첩되어 예약될 수 없고, 서버에서 먼저 처리되는 1건만 예약
    • 다수의 사용자가 동시에 접속하면, lock을 걸어 동시에 접근하지 못하게 제한한다.
      • addReservation 메소드에 synchronized 를 사용

프로젝트 빌드 & 실행방법

a. git --clone

git clone https://github.com/mindock/meeting-room-reservation.git

b. 디렉토리 이동

cd meeting-room-reservation

c. 프로젝트 빌드

gradle build

d. 디렉토리 이동

cd build\libs

e. 프로젝트 실행

java -jar -Dspring.profiles.active=prod -Dfile.encoding=UTF-8 meeting_room-0.0.1.jar