대구대 정보 통합 검색 기능 개발 (1)

대구대 사이트에 있는 정보들을 하나로 통합하여 검색할 수 있으면 좋을 것 같아 개발하였습니다.

현재 대구대 사이트에는 아래와 같은 시설 검색이 가능합니다.

  • 편의 시설 정보(매점, 복사실, 편의점)
  • 학과 정보(학과 홈페이지 안내)
  • 교직원 연락처 정보(내선 번호)

추가적으로 비공개 데이터도 있습니다

  • 강의실 목록

이러한 데이터를 검색하려면 메뉴를 누르고 링크를 타고 접속해야 검색이 가능합니다.

예를 들어 전화번호를 검색하려면
① 상단 메뉴에서 대학안내 → 대학개요 → 전화번호안내 링크를 통해 접속하고
② 검색 분류를 선택한 뒤
③ 전화번호를 검색 해야 합니다.

이런 파편화된 데이터를 하나의 검색 박스에서 위 나열된 것을 검색하도록 하는것이 목표입니다.

우선 현재 데이터는 전부 JSON 으로 저장되어 있습니다. 예시 JSON 은 다음과 같습니다.

# 강의실 정보
{
  "id":"법행1100",
  "name":"1층 공통공간",
  "floor":"1층",
  "type":"17558688",
  "location":"법행정대학관"
}

# 시설 정보
{
  "id": "중앙도서관열람관",
  "sectors": "편의점",
  "name": "이마트24",
  "floor": "지하",
  "office_phone": "",
  "phone_number": "010-****-****",
  "type": "10263233"
}

# 학과 정보
{
  "id":"인문대학",
  "name":"한국어문학부",
  "url":"http://koreandu.daegu.ac.kr/",
  "image_url":"http://koreandu.daegu..."
}

# 연락처 정보
{

  "name_kr": "강**",

  "upmu": null,
  "buseo": "재활과학대학 재활건강증진학과",
  "user_upmu": "교육지원조교",
  "bojik_nm": " ",
  "sosok": null,
  "jik_id": "*****",
  "user_telno": "6095",
  "e_mail": "********@naver.com",
  "hompy_addr": null,
  }

이 정보를 키워드 형태로 검색할 수 있게 가공해야 합니다.

MariaDB 같은 RDBMS에 집어넣으려면 JSON을 표 처럼 변환해줘야 합니다. 검색과 별개로 사용자에게 보여줄 정보는 필요하기 때문에 필수적인 항목만 추려 보았습니다.

이제 위 형태로 변환시키는 코드를 만듭니다. 배열로 처리 할 수 있지만 기억력도 좋지 않은데다 표를 봐 가면서 해야하기 때문에 dataclass 로 정의해보도록 하겠습니다.

from dataclasses import dataclass
from typing import Optional

@dataclass
class CsvForm:
    idx: Optional[int] = None
    blah_id: Optional[str] = None
    name: Optional[str] = None
    location: Optional[str] = None
    tel_no: Optional[str] = None
    mobile_no: Optional[str] = None
    category: Optional[str] = None
    web_address: Optional[str] = None
    email_address: Optional[str] = None
    tags: Optional[str] = None

    def __get_data_array(self):
        return [
            self.idx, self.blah_id, self.name, self.location,
            self.tel_no, self.mobile_no, self.category, self.web_address,
            self.email_address, self.tags,
        ]

    def __getitem__(self, item):
        return self.__get_data_array()[item]

    def __repr__(self):
        return self.__get_data_array()

    def __len__(self):
        return len(self.__get_data_array())

어쨌든 CSV 로 변환해야 하기 때문에 class 형태지만 배열처럼 동작해야 합니다. __getitem__()__len__() 을 구현해 줌으로써 배열 처럼 동작하게 할 수 있습니다.

(2) 에서는 sqlite3 을 사용해서 메모리에 데이터베이스를 올리고 쿼리 생성까지 만들어 보겠습니다.

댓글 남기기