[파이썬 챗봇] 4. 오라클 클라우드 DB 연동

지수·2021년 7월 20일
0

플레이데이터

목록 보기
22/50

💡 아이디어

지난 SQL 수업에서 오라클 클라우드 데이터베이스를 생성하고, 접속하여, 파이썬과 연동하는 방법을 배웠다. [ORACLE CLOUD DATABASE 시리즈 참고]

실습 시에는 각자 자신이 만든 데이터베이스에 파이썬을 연동했지만,
한 데이터베이스에 파이썬 챗봇을 연동하면, 여러 컴퓨터로 파이썬 챗봇을 실행하면서 입력되는 데이터를 해당 데이터베이스에 함께 받아올 수 있다. (대박 신기해..!!!)

강사님께서 챗봇 사용 로그를 남겨보는 것이 어떻겠냐고 추천해주셨고,

  • 파이썬 챗봇에 오라클 클라우드 데이터베이스 하나를 연동
  • 해당 데이터베이스에 chatbot 테이블을 생성하고
  • chatbot 테이블 안에 사용자 이름(username), 실행 시간(jointime), 위치(location), 게임 스코어(gamescore), 검색한 뉴스 키워드(newskeyword)를 받아오는 어트리뷰트를 만들었다.
  • 각 값들은 챗봇 실행 과정에서 만들어지고, 챗봇을 종료할 때 한 번에 데이터베이스로 연동된다.

+) 추가적으로 menu_select.py에서 엑셀을 읽어오던 부분을 데이터베이스로 연동하여 기능을 추가 및 수정했다.
+) 또한, 저장한 사용자 로그 데이터를 다시 읽어와서 출력하는 기능도 추가했다.


💻 구현

0. 구상

사실 처음에 파이썬 챗봇을 구상할 때 데이터베이스 연동을 염두에 두고 있지 않아서 데이터베이스 연동을 활용할만한 기능이 딱히 없어 고민이 많았다.

새로운 기능을 구현하는 것이 아니더라도 오라클 클라우드 데이터베이스와 파이썬을 연결하는 실습을 진행할 겸, 사용자 로그 데이터를 받아서 저장하는 것부터 시작하기로 했다.

  1. 오라클 클라우드 데이터베이스에 사용자 로그 저장
  • main.py에서 입력받는 사용자 이름 name
  • main.py에서 챗봇을 실행한 날짜와 시간 now
  • weather.py에서 크롤링 해오는 사용자 위치 location
  • minigame.py에서 합산하는 세 가지 미니게임 총 점수 score
  • news.py에서 입력받는 오늘의 뉴스 검색 키워드 search_keyword
  1. menu_select.py 수정
  • 기존에 엑셀 파일에서 읽어왔던 메뉴 리스트를 데이터베이스에서 읽어오는 것으로 수정
  • '메뉴 추천받기' 기능 실행 시 데이터베이스에서 메뉴가 select 되도록 구현
  • '메뉴 추가하기' 기능 실행 시 메뉴 리스트 데이터베이스에 사용자가 메뉴를 추가할 수 있게 하여 메뉴 리스트의 확장성을 높임
  1. 사용자 로그값을 저장한 테이블을 조회하는 플레이 유저 정보 조회 추가
  • '플레이를 많이 한 회원 확인' 옵션으로 이름이 여러 번 입력된 사용자 정보 출력
  • '개인별 게임 스코어 랭킹 확인' 옵션으로 게임 스코어 리더보드 출력

1. 구현 포인트

✅ 파이썬 챗봇 특성 상 main.py에 여러 파일이 연결되어 있고, 데이터베이스에 저장할 사용자 로그도 여러 파일 내에 흩어져있기 때문에 기존 코드를 망가뜨리지 않고 기능을 추가하는데 초점을 맞췄다.
▶ 때문에 dbconeect.py 파일을 따로 만들고 데이터베이스에 사용자 로그를 저장하는 함수 db()를 정의하고,
▶ main.py에서 채팅이 종료되는 시점에 db() 함수가 실행되도록 했다.

✅ 데이터베이스 connection, cursor를 하나만 만들어 전역변수로 선언, 여기저기서 연결하여 쓰는 구조이기 때문에 챗봇 전체 작동 흐름과 변수 입력 과정, 데이터베이스에 커밋까지 전체 흐름 상 오류가 없는지 많이 신경썼다.
(아래 구현 상 문제점 모두 이 부분과 연결된 문제였다.)


2. 구현 상 문제점/유의점

  1. 파일 실행 중 connection, cursor가 여러 번 설정되면 에러 발생
  2. 사용자 로그 값을 한 번에 insert하지 않으면 각각 다른 행으로 데이터베이스에 저장
  3. 사용자로부터 입력받는 값의 경우 해당 기능을 실행하지 않으면 변수가 비어있어 에러 발생

🐛 디버깅

위의 문제점을 해결하기 위해 아래와 같은 디버깅 방법을 사용하였다.

  1. 챗봇 실행시 connection과 cursor를 생성하고 해당 변수를 global로 선언
  2. 챗봇이 종료되는 시점(endChat())에서 사용자 로그 값 한 번에 insert
  3. 입력 값 할당 전 변수에 None 할당, 해당 기능을 실행하지 않았을 경우 데이터베이스에 null값이 저장되도록 설정

📄 코드

  • main.py를 포함한 각 기능 구현 코드 소폭 수정
  • menuselect.py 메뉴 리스트 데이터베이스 연동
  • db연동을 위핸 dbconnect.py 추가

드디어...드디어 👾파이썬 챗봇👾 최종 코드가 깃헙에 업로드 되었습니다..!👏👏👏
(멀고 험난 했던 git, git-hub 협업이 너무 큰 경험이었기 때문에 더 뿌듯..!)
파이썬 챗봇의 최종 코드가 궁금하다면? 깃허브로!

💬리뷰

한 줄 요약 : 하려고하는 마음이 있으면, 반드시 결과물을 만나게 되는구나😲

개발 능력 향상은 물론 취업 준비에도 프로젝트 경험, 포트폴리오가 얼마나 중요한 지 귀에 딱지가 앉도록 들어왔고, 나 또한 그 의견에 전적으로 동의하는 바이지만 혼자서는 기획 단계에서부터 막막하여 프로젝트를 진행하기가 어려웠다.

그런데 팀원분들과 함께 기능 하나 하나를 만들어가고, 오류를 하나 하나 디버깅해가다보니 처음 아이디어 회의했을 때에는 상상하지도 못할 정도로 큰 결과물이 만들어졌다.

서로 같이 공부하고 배워가면서 프로젝트를 진행할 수 있어서 좋았고 단기간에 정말 많은 것을 배웠다. 이번 프로젝트를 하면서 처음 git으로 협업하고, 기술서도 작성해보고, 여러 파이썬 파일을 연동해보기도하고, 마지막에는 데이터베이스와 연동까지 해보았다. 코드를 작성하고 실행해보고 오류를 하나하나 구글링해서 찾아가며 공부해서 그런지 이전의 이론 공부보다 더 효과적인 학습이 가능했다.

아쉬운 점

처음 프로젝트를 시작할 때, 다들 파이썬으로 어떤 것을 만들 수 있을지에 대해 모호한 인식을 가지고 있었기 때문에 프로젝트의 명확한 클라이언트나 목표를 설정하지 못한 것이 아쉽다.

기획 단계에서 그런 부분을 명확하게 해두었다면, 버전 업을 할 때 추가해야할 기능이나 개선해야 할 부분을 찾기 쉬웠을텐데 그러지 못해서 방향성 없이 기능 확장만 한 느낌이랄까..?💧💧

그치만 이 프로젝트를 하면서 다양한 기능을 익히는 시간을 가질 수 있었기 때문에 파이썬 챗봇은 미니 프로젝트로서 충분한 역할을 수행했다. 다음 프로젝트 때는 더 유의미한 결과물을 만들어 낼 수 있도록 기획 단계에 조금 더 신경을 써보아야겠다.

profile
사부작 사부작

0개의 댓글