(7) 서울 카페 추천 웹사이트 만들기 - MySQL 카페 데이터 파일 적재

Updated:


2020-10-21부터 2020-12-28까지 진행했던 서울시 25개구 카페추천 웹페이지 만들기 팀프로젝트 개발에 대한 포스팅이다.

이 글에서는 MySQL 데이터 파일 적재를 활용한 웹페이지 구축 과정을 소개한다.



1. MySQL 데이터 적재

데이터 마이닝과 텍스트 마이닝 작업을 통해 추출한 카페 정보 데이터와 최빈도수 데이터들을 MySQL Workbench를 이용하여 적재하였다.

MySQL Workbench란?
MySQL 워크벤치는 데이터베이스 설계자, 개발자 및 DBA를 위한 통합된 시각적 도구입니다. 서버 구성, 사용자 관리, 백업 등을 위한 데이터 모델링, SQL 개발 및 포괄적인 관리 도구를 제공합니다. Windows, Linux 및 Mac OS X에서 사용할 수 있습니다.


1.1. 테이블 생성

카페 정보 테이블은 info_tbl로, 카페 이용 후기 핵심어 최빈도수 테이블은 review_tbl로 명명하였다.

info_tbl‘gu’,’id’를 primary키로 설정하여 review_tbl에서 해당하는 데이터를 찾을 수 있도록 하였고,

정보데이터

<그림 1> 카페 정보 테이블 속성



review_tbl은 info_tbl의 ‘gu’와 ‘id’의 primary키와 충돌되지 않도록 ‘seq’를 Auto-Increment로 추가하여 primary키로 설정하였다.

빈도수데이터

<그림 2> 핵심어 최빈도수 테이블 속성



1. 2. 테이블 데이터 Import

이제 생성한 테이블에 카페 정보 데이터.csv 파일과 핵심어 최빈도수 데이터.csv파일을 MySQL DB에 적재했다.

테이블

<그림 3> 테이블 데이터 적재



다음과 같은 순으로 테이블 데이터를 적재하였다.

적재

<그림 4> 데이터 적재 순서



위 순서대로 테이블 데이터 적재 작업을 진행하면 다음과 같이 컴퓨터에 보유하고 있던 csv 파일을 적재할 수 있다.

임폴트

<그림 5> 임폴트 결과



2. 기존 데이터베이스 Django에 연동

이용자가 웹페이지 상에서 서울시 특정‘구’를 선택하고 10가지 카페 이용 목적 ‘테마’를 선택하면 이 조건에 해당되는 데이터들을 제공하기 위해, 기존 데이터베이스Django에 연동시켰다.

이 작업을 수행하기 위해, 정말 많이 헤맸는 데… 비트교육센터 배교수님께서 항상 말씀하시던 “모르겠으면 Documentation을 참고해라!”라고 하셨는 데!!!

역시 해당 프로그램의 Documentation을 찾아보면 거기에 모든 사용설명서가 다있다.

내가 참고했던 문서는 “레거시 데이터베이스에 장고 연동하기” 부분인데

python manage.py inspectdb

이 한줄이면 MySQL에 적재한 모든 데이터가 한번에 Django안으로 쏙~! 들어간다. 진짜 신기했다!!!



(myweb_JW) C:\Users\ehcho\Desktop\myweb2>python manage.py inspectdb
# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models


=============================중간 생략==============================

class InfoTbl(models.Model):
    gu = models.CharField(primary_key=True, max_length=100)
    id = models.IntegerField()
    name = models.CharField(max_length=100, blank=True, null=True)
    addr = models.CharField(max_length=300, blank=True, null=True)
    hour = models.CharField(max_length=300, blank=True, null=True)
    tel = models.CharField(max_length=300, blank=True, null=True)
    photo = models.CharField(max_length=300, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'info_tbl'
        unique_together = (('gu', 'id'),)



class ReviewTbl(models.Model):
    seq = models.IntegerField(primary_key=True)
    gu = models.CharField(max_length=100, blank=True, null=True)
    id = models.IntegerField(blank=True, null=True)
    star = models.IntegerField(blank=True, null=True)
    keyword = models.CharField(max_length=300, blank=True, null=True)
    tf = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'review_tbl'


=============================중간 생략==============================




3. 적재결과 확인

데이터들이 다 잘 적재되었는 지 확인하기 위해 admin(http://127.0.0.1:8000/admin/) 으로 들어가서 Django info_tbl과 review_tbl을 확인하였고, 다음과 같이 해당 테이블에 모든 데이터가 잘 적재되있는 것을 확인 할 수 있었다.

정보어드민

<그림 6> Django Info tbls



리뷰어드민

<그림 7> Django Review tbls



4. 카페 테마 SQL 쿼리문 작성

앞서 (5) 서울 카페 추천 웹사이트 만들기 - 결과값에 대한 카페 요소 분석 및 이용 목적 테마 분류 에서 설정한 10가지 카페 이용목적 테마를 선택하면 그 해당하는 값의 데이터가 제공되도록 SQL 쿼리문을 작성하였다.

쿼리

<그림 8> 10가지 카페 이용목적 테마



서울특별시 25개 “구”와 10가지 카페 이용목적 “테마”를 데이터를 기반으로 하여 쿼리문을 설정하였다.

만약 이용자가 “강남구”+“디저트카페”를 선택한다면 다음과 같은 쿼리문으로 작성할 수 있다.

쿼리문

<그림 9> "구"+"테마" 쿼리문



카페 특성 요소를 10가지 카페 이용 목적 테마에 적합하도록 각 테마 함수에 쿼리문을 작성하여 이용자가 특정 테마를 선택하면 그에 해당하는 데이터를 제공할 수 있게 하였다.


# view.py 

def cafe_theme(request):
    return render(request, 'survey/cafe_theme.html')


def cafe0_dessert(request):
    GU_CODE = request.GET['gu_code']
    lst = ReviewTbl.objects.raw('''select current_timestamp as seq, info_tbl.gu, info_tbl.id, info_tbl.name, info_tbl.tel, info_tbl.addr, info_tbl.hour, info_tbl.photo, max(review_tbl.tf) as max_tf
                                        from review_tbl join info_tbl
                                        on review_tbl.gu = info_tbl.gu and info_tbl.id = review_tbl.id
                                        where (review_tbl.keyword ='디저트' or keyword='케이크' or keyword ='빙수' or keyword='케익' or keyword='번' or keyword='와플'
                                        or keyword='스콘' or keyword='팬케이크' or keyword='샐러드' or keyword= '베이글') and review_tbl.gu = '{}'
                                        group by info_tbl.gu, info_tbl.id, info_tbl.name, info_tbl.tel, info_tbl.addr, info_tbl.hour, info_tbl.photo
                                        order by max_tf desc
                                        '''.format(GU_CODE))


    item_list = []
    for item in lst:
        arg = {}
        arg['name'] = item.name
        arg['addr'] = item.addr
        arg['tel'] = item.tel
        arg['hour'] = item.hour

        item_list.append(arg)
    # html에 렌더

    args = {'lst': item_list}

    return render(request, "survey/cafe0_dessert.html", args)



이렇게 쿼리문을 작성하여 이용자가 “구”“테마”를 선택하기만 하면 해당 테마에 대한 카페 정보를 제공할 수 있도록 Django와 MySQL에서의 기본 설정을 완료하였다.

Leave a comment