f-lab-edu / show-ticketing-service

[초봉 3000 후반 신입]다양한 공연 정보를 제공하며 예매를 할 수 있는 서비스
9 stars 3 forks source link

[#34] 공연 정보 추가 기능 구현 #60

Closed hanwix2 closed 3 years ago

hanwix2 commented 3 years ago

개요

[관리자 권한]

  1. 공연 정보 등록

    • 공연 정보:
      • title(공연명), imageFilePath(공연이미지 파일 위치), detail(상세설명), ageLimit(관람가능연령), showType(공연타입), venueId(공연장ID), hallId(공연홀ID)
      • 최초 공연 정보 등록 시 이미지 파일은 Null 값으로 등록(공연 등록 이후 이미지 등록 가능)
        • 공연 타입(ShowType): 뮤지컬, 연극, 콘서트
    • 공연장ID, 공연홀ID, 공연타입은 UI에서 선택하여 유효한 값 만을 넣는다고 가정
  2. 포스터 이미지 등록

    • 기존에 존재하는 공연에 대하여 포스터 이미지 등록
    • 공연ID는 UI에서 선택하여 유효한 값 만을 넣는다고 가정
  3. 공연 스케줄 등록

    • 기존에 존재하는 공연에 대하여 스케줄 등록
    • 하나의 공연에 여러 개의 스케줄 등록이 가능
    • 스케줄에는 공연 시작 시간과 끝나는 시간을 입력
    • 공연 시간은 최대 24시간으로 제한
    • 공연ID는 UI에서 선택하여 유효한 값 만을 넣는다고 가정
  4. 공연 스케줄 등록 시 시간 중첩 방지

    • 같은 공연에 여러 스케줄 입력 중 발생 가능한 시간 중첩 방지
    • 문제 상황:
      1. 끝나는 시간이 시작 시간 보다 빠른 경우
      2. 새로 등록하는 스케줄 간 시간이 중첩되는 경우
      3. 기존 DB에 등록된 스케줄과 시간이 중첩되는 경우

Progress

Detail

  1. 공연 정보 등록 기능

    • Performance(공연) 관련 Controller, Service, Mapper 생성
      • insertPerformance메소드에서 공연 등록 로직 수행
    • PerformanceRequest객체로 공연 정보 받아옴
    • 공연 등록 전 공연명과 공연유형이 중복되었으면 PerformanceAlreadyExistsException에러
    • 공연 유형은 ShowTypeEnum 및 TypeHandler 로 처리
  2. 포스터 이미지 등록 기능

    • MultipartFile을 이용하여 파일 업로드 기능 구현
    • PUT 메소드 (공연 정보의 이미지 정보 업데이트 API)
      • 공연 등록 시 Request Body에 MultipartFile과 JSON 형식의 공연 정보를 함께 보낼 수 없으므로 기존 공연 정보 등록 API와 분리하여 구현
    • 이미지 저장 시 기존에 존재하는 파일이 있다면 삭제 후 저장되고 DB에선 새로운 파일의 저장경로로 속성을 update
    • 이미지는 프로젝트 파일의 files/performanceImages 폴더(상대경로)에 저장
    • FileService, FileUtil 클래스를 구현하여 파일 관련 기능 로직을 PerformanceService에서 분리
    • 관련 예외 상황 처리:
      • 지정된 파일 형식만 허용(이미지 파일: jpeg, png, gif)
      • 최대 파일 허용 크기: 10MB
  3. 공연 스케줄 등록 기능

    • PerformanceTimeRequest 객체로 공연 시작, 끝 시간 전달 받음
    • 공연 스케줄은 하나 이상이므로 PerformanceTimeRequest는 List로 받음
    • 이후 스케줄 시간 관리의 효율성을 위해 time format은 [Year,4][Month,2][Date,2][Hour,2][Minute,2][Second,2] 형식으로 총 14자리의 숫자로만 구성
    • DB에 저장되는 스케줄 시간은 DATE_TIME 형식으로 저장
  4. 공연 스케줄 시간 중첩 방지 기능

    • PerformanceService에서 스케줄 시간이 정상인지 또는 시간이 중첩되지 않는지 체크
    • 스케줄이 정상이 아니거나 중첩된다면 PerformanceTimeConflictException 예외처리
    • 구현:
      1. 입력된 스케줄 간의 중첩 체크(checkPerfTimeRequestConflict 메소드)
      • performanceTimeRequest 리스트를 startTime을 기준으로 정렬
      • startTime과 endTime이 정상적인지 확인(checkCorrectPerfTime)
      • Linear 하게 스케줄이 중첩되지 않는 지 체크 2. DB에 저장되어 있는 스케줄과의 중첩 체크(checkPerfTimeWithDB 메소드)
      • 기존에 존재하는 스케줄을 List로 가져와 startTime을 기준으로 정렬 - DB의 스케줄을 가져올 때 같은 홀의 스케줄 중 날짜 범위를 조정하여 체크 알고리즘의 효율 향상 - 공연 시간이 이틀에 걸쳐 진행 될 수 있으므로 입력하려는 스케줄의 시작 시간을 기준으로 앞, 뒤 날짜 모두 SELECT
      • 정렬된 스케줄을 endTime 기준으로 이분탐색 하여 입력하려는 스케줄의 startTime 보다 큰 스케줄 중 가장 작은 스케줄 검색
      • 검색된 스케줄이 입력하려는 스케줄의 시간과 중첩되는지 확인
  5. TEST

    • 공연 id를 가져오는 것에 한계가 있어 로컬에서 Postman으로 테스트 진행
    • 정상적인 요청에 대한 기능은 모두 정상 동작 & 문제 상황에 대한 테스트 수행 및 해결
    • 문제 상황에서의 테스트:
      • 공연 이미지 등록
        • 파일 크기가 허용 값 보다 초과되는 경우
        • 파일이 이미지가 아닌 경우
      • 공연 스케줄 등록
        • 스케줄 시간이 정상이 아닌 경우(ex. 끝 시간이 시작 시간보다 빠름)
        • 스케줄이 서로 중첩되는 경우
      • etc
        • 관리자 권한이 없는 경우