Skip to content

Project-Ticketaka/Data

Repository files navigation

👁️‍🗨️ 개요

  • 공연예술통합전산망(KOPIS) OPEN API를 이용해 공연정보 데이터를 수집하고 정제해 데이터베이스에 정제하는 서비스입니다.

🧩 기능 및 아키텍처

  • 🏗 서비스 아키텍처

    서비스 아키텍처


  • 🗄 공연 데이터베이스 구조

    공연 데이터베이스 구조

    • Performance Table - 공연 상세 정보

    • Facility Table - 공연 시설 상세 정보

    • Prf_session - 공연 일자 정보

    • Prf_rank - Top10 - 공연 정보


  • 📊 데이터 처리 과정

    • KOPIS의 데이터는 BeautifulSoup 라이브러리를 이용해 XML parsing 진행

    • 공연, 시설 목록
      • 매일 정해진 시간에 따라 공연 ID, 시설 목록 ID를 KOPIS에 요청

      • 기존의 데이터베이스의 공연 ID, 시설 목록 ID를 중복 검사 후 새로 등록된 데이터를 추가


    • 공연 시설 상세
      • 공연 시설들의 상세 정보를 정제 및 적재

      • 요청한 시설 ID 리스트를 이용해 KOPIS에 시설 상세 데이터 요청

      • 빈 문자열이 들어오는 컬럼들은 유효성 검사를 통해 None으로 변환 후 반환


    • 공연 상세
      • 상세 공연 정보들 정제 및 적재

      • 공연 일정과 공연 가격이 유효한 데이터가 아닐 경우 사용가능한 데이터가 아니라고 판단하고 로직을 수행하지 않도록 처리

      • 이외 빈 문자열이 들어오는 컬럼들은 유효성 검사를 통해 None으로 변환 후 반환

      • 응답된 데이터중 공연 상세 시간 데이터는 별도로 데이터 정제 후 관리


    • 공연 상세 시간
      • 기존 데이터는 다음과 같은형태로 응답됨

        토요일 ~ 일요일(13:00,15:00), 월요일(16:00,19:00), 금요일(15:00,18:00), HOL(11:00,14:00,16:00)

      • 데이터를 HOL(공휴일)이 포함된 데이터와 아닌 데이터로 분리해서 처리

      • 공휴일 미포함

        1. , 를 기준으로 split하여 배열 생성

          • ['토요일 ~ 일요일(13:00,15:00)', '월요일(16:00,19:00)', '금요일(15:00,18:00)']
        2. 1번의 각 원소를 요일과 시간으로 분리

          • ['토요일 ~ 일요일', '13:00', '15:00']
        3. 첫번째 원소에 ~ 가 포함되어 있거나 없는 경우로 분리

          1. ~가 포함되어 있지 않는 원소중에는 HOL도 있기 때문에 이는 제외

            i. 시작일자와 종료일자 사이의 해당 요일의 모든 년/월/일을 리스트로 생성

            ii. 생성된 모든 일자에 배열에 포함된 시간 추가

             `2023-01-01, 13:00`  `2023-01-08, 13:00` 
             `2023-01-02, 15:00`  `2023-01-09, 15:00`
            
          2. ~가 포함되어 있는 경우

            i. 초기에 일주일의 요일을 담고있는 배열 선언

             `['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일']`
            

            ii. 첫번째 원소를 ~ 기준으로 분리함

             `['토요일', 일요일']`
            

            iii. 시작 인덱스를 첫번째 인덱스로 잡음

            iv. 첫번째 원소부터 일주일을 탐색하며 마지막 원소를 만날때까지 각 요일에 대한 데이터를 생성

      • 공휴일 포함

        1. HOL 문자열이 들어있는 원소를 따로 분리 후 flag 변경

        2. 위와 마찬가지로 HOL과 시간으로 분리

           `['HOL', '13:00', '15:00']`
          
        3. 내년까지의 공휴일 리스트 중 공연 시작 날짜와 종료날짜 사이의 공휴일을 추출

        4. 추출된 공휴일에 배열에 포함된 시간 추가

           `2023-03-01, 13:00`  `2023-03-01, 17:00` 
          
      • 데이터 최종 형태

        datafinal


    • Top 10 공연 정보
      • 1위부터 10위까지의 공연 순위를 저장함

      • 당일 순위 데이터가 업데이트되는 시간과 API 호출 시간의 간극으로 인한 데이터의 부재를 방지하고자 2일까지의 순위 데이터를 저장함

      • 불필요한 데이터의 저장을 막기 위해 3일 이후부터의 데이터는 삭제


🪵 개발환경

  • MariaDB:10.3

  • Python 3.8.6


💬 회고

프로젝트 진행 시 주안점

  • 공연 시간 데이터를 각 요일,시간 세션으로 분리

  • 공휴일 데이터가 있을 시 별도의 처리


한계점 및 개선 사항

  • 시간복잡도 및 보일러플레이트 코드의 개선이 좀 더 필요함

  • 공휴일 데이터의 불규칙적인 업데이트를 고려해 데이터베이스에 저장하지 않고 사용하고 있는데 이를 보완할 방법 고안