배씨의 개발일지

좌석 예약을 위한 시간표 만들기 본문

TIL

좌석 예약을 위한 시간표 만들기

용찬 2023. 9. 13. 22:23

처음에 좌석 예약을 만들때는 좌석 하나 하나마다 예약 가능한 시간표를 만들어줬다.
그런데 이렇게 생성하고 나니 DB에 데이터가 너무 많이 저장이 되어서 다른 방법으로 시간표를 만들어야만 했다.
그래서 관계 설정으로 방에 시간표를 만들어 준 뒤 따로 저장을 해주고
예약 시 방에서 시간표를 불러와서 그 시간표id와 좌석id를 매치해서 예약을 확인하는 방법으로 로직을 구현했다.

아래 코드는 timeTable(시간표)의 entity

import {
  Column,
  Entity,
  PrimaryGeneratedColumn,
  ManyToOne,
  OneToMany,
} from 'typeorm';
import { Reservation } from './reservation.entity';
import { Payment } from './payment.entity';
import { Room } from './room.entity';

@Entity({ schema: 'apple', name: 'timetable' })
export class TimeTable {
  @PrimaryGeneratedColumn()
  timeTableId: number;

  @ManyToOne(() => Room, (room) => room.timeTable)
  rooms: Room;

  @ManyToOne(() => Payment, (payment) => payment.timeTable)
  payments: Payment;

  @OneToMany(() => Reservation, (reservation) => reservation.timeTable)
  reservations: Reservation;

  @Column()
  roomId: number;

  @Column({ type: 'varchar' })
  timeSlot: string;
}

이렇게 entity파일을 생성 후

  async createTimetableForSeat(
    data: timeTableDto,
    roomId: number,
  ): Promise<void> {
    const { startTime, endTime } = data;

    const startTimeArray = startTime.split(':');
    const endTimeArray = endTime.split(':');

    const startDate = new Date();
    startDate.setHours(parseInt(startTimeArray[0]));
    startDate.setMinutes(parseInt(startTimeArray[1]));

    const endDate = new Date();
    endDate.setHours(parseInt(endTimeArray[0]));
    endDate.setMinutes(parseInt(endTimeArray[1]));

    const timeTableRepository = this.timeTableRepository;

    while (startDate < endDate) {
      const timeTable = new TimeTable();
      const hours = startDate.getHours().toString().padStart(2, '0');
      const minutes = startDate.getMinutes().toString().padStart(2, '0');
      timeTable.timeSlot = `${hours}:${minutes}`;
      timeTable.roomId = roomId;
      await timeTableRepository.save(timeTable); // TimeTable 저장

      // 다음 시간으로 이동 (1시간 더하기)
      startDate.setHours(startDate.getHours() + 1);
    }
  }

이렇게 startTime(영업 시작 시간)과 endTime(영업 종료 시간)을 받아서
예시 ) [09:00]~[18:00] 이런식으로 시간마다 생성을 해주었다.

'TIL' 카테고리의 다른 글

카카오페이 테스트 결제  (0) 2023.09.13
좌석 예약 하기  (0) 2023.09.13
좌석 생성 2번째 - 좌석의 타입별로 가격 넣어주기  (0) 2023.09.06
좌석 만들기 2번째 방법  (0) 2023.09.05
최종 프로젝트 중간 점검  (0) 2023.09.01
Comments