예약 가능 여부를 확인하기 위해 예약시간에 해당하는 매시간마다 예약현황DB에서 예약정보를 찾고, 주차현황DB에서 출차여부를 확인한다.
→ 예약시간만큼 쿼리가 반복해서 실행되므로, 예약시간이 길어질수록 로직 실행 속도가 느려진다.
예약 불가 시간대 구하는 로직 코드
시간별 예약현황DB(ParkBookingByHour
) 테이블 추가 설계
CREATE TABLE `park_booking_by_hour` (
`id` bigint NOT NULL AUTO_INCREMENT,
`park_info_id` bigint DEFAULT NULL,
`date` date NOT NULL,
`time` int NOT NULL,
`available` int NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_park_info_id` (`park_info_id`),
CONSTRAINT `FK_park_info_id` FOREIGN KEY (`park_info_id`) REFERENCES `park_info` (`id`)
)
예약 가능 여부를 확인하기 위해 시간별 예약현황DB의 주차가능대수를 확인한다.
ParkBookingByHour
테이블에서 예약시간에 해당하는 주차가능대수(available
) 컬럼 값을 확인하도록 QueryDSL 사용하여 로직을 구현했다.
→ 테이블 조회 속도는 빠르나, 예약정보 생성 후 ParkBookingByHour
에 데이터 생성 및 업데이트 추가 작업이 필요하다.
예약 불가 시간대 구하는 로직 코드
*findByParkInfoIdAndFromsStartDateToEndDate
QueryDSL 쿼리 코드*
<aside> ☑️ 테스트 설정
실행 속도
Hibernate 실행결과
Hibernate:
select
parkbookin0_.id as id1_2_,
parkbookin0_.car_num as car_num2_2_,
parkbookin0_.end_time as end_time3_2_,
parkbookin0_.park_info_id as park_inf5_2_,
parkbookin0_.start_time as start_ti4_2_,
parkbookin0_.users_id as users_id6_2_
from
park_booking_info parkbookin0_
where
parkbookin0_.park_info_id=?
and (
parkbookin0_.start_time>=?
and parkbookin0_.start_time<?
or parkbookin0_.end_time>?
and parkbookin0_.end_time<=?
or parkbookin0_.start_time<=?
and parkbookin0_.end_time>=?
)
Hibernate:
select
count(parkmgtinf0_.id) as col_0_0_
from
park_mgt_info parkmgtinf0_
where
(
parkmgtinf0_.park_booking_info_id in (
?
)
)
and (
parkmgtinf0_.exit_time is not null
)
실행 속도
예약가능여부 확인 : 평균 68ms
전체 예약 프로세스 : 평균 1046ms
→ 예약가능여부 확인하는 속도는 빠르나, 예약정보 생성 후 ParkBookingByHour
에 데이터를 생성 및 업데이트하는 시간이 추가로 소요됨
Hibernate 실행결과
Hibernate:
select
parkbookin0_.id as id1_2_0_,
parkinfo1_.id as id1_4_1_,
parkbookin0_.available as availabl2_2_0_,
parkbookin0_.date as date3_2_0_,
parkbookin0_.park_info_id as park_inf5_2_0_,
parkbookin0_.time as time4_2_0_,
parkinfo1_.address1 as address2_4_1_,
parkinfo1_.address2 as address3_4_1_,
parkinfo1_.la as la4_4_1_,
parkinfo1_.lo as lo5_4_1_,
parkinfo1_.name as name6_4_1_
from
park_booking_by_hour parkbookin0_
inner join
park_info parkinfo1_
on parkbookin0_.park_info_id=parkinfo1_.id
where
parkbookin0_.park_info_id=?
and parkbookin0_.date=?
and (
parkbookin0_.time between ? and ?
)
Hibernate:
select
parkbookin0_.id as id1_2_0_,
parkinfo1_.id as id1_4_1_,
parkbookin0_.available as availabl2_2_0_,
parkbookin0_.date as date3_2_0_,
parkbookin0_.park_info_id as park_inf5_2_0_,
parkbookin0_.time as time4_2_0_,
parkinfo1_.address1 as address2_4_1_,
parkinfo1_.address2 as address3_4_1_,
parkinfo1_.la as la4_4_1_,
parkinfo1_.lo as lo5_4_1_,
parkinfo1_.name as name6_4_1_
from
park_booking_by_hour parkbookin0_
inner join
park_info parkinfo1_
on parkbookin0_.park_info_id=parkinfo1_.id
where
parkbookin0_.park_info_id=?
and parkbookin0_.date=?
and (
parkbookin0_.time between ? and ?
)
Hibernate:
select
parkbookin0_.id as id1_2_0_,
parkinfo1_.id as id1_4_1_,
parkbookin0_.available as availabl2_2_0_,
parkbookin0_.date as date3_2_0_,
parkbookin0_.park_info_id as park_inf5_2_0_,
parkbookin0_.time as time4_2_0_,
parkinfo1_.address1 as address2_4_1_,
parkinfo1_.address2 as address3_4_1_,
parkinfo1_.la as la4_4_1_,
parkinfo1_.lo as lo5_4_1_,
parkinfo1_.name as name6_4_1_
from
park_booking_by_hour parkbookin0_
inner join
park_info parkinfo1_
on parkbookin0_.park_info_id=parkinfo1_.id
where
parkbookin0_.park_info_id=?
and (
parkbookin0_.date between ? and ?
)