Search
Duplicate

커넥트 지누

목차

커넥트 지누

1. 개 요

프로젝트 명: 커넥트 지누
개발 기간: 2024. 03. 04 ~ 2024. 06. 02
운영 기간: 2024. 06. 03 ~ 현재
인력 구성: 5명
Github 링크
챗봇 API 서버: Server-JavaSpring
학과 인증 API 서버: studentID_OCR
CI/CD 서버: DevOps

2. 기술 스택

COMMON
Notion
Github
Figjam
Slack
FRONT
카카오 i 오픈 빌더
BACK
Flask
Spring
PostgreSQL
Tesseract OCR
DEPLOY
Supabase
Docker
Docker Hub
Nginx
Jenkins
Github Action
Cent OS

3. 팀 구성

4. 시스템 아키텍처

사용자가 카카오톡 챗봇에 요청을 보내면, 챗봇이 사용자의 발화문을 분석하여 의도를 파악한 후, 팀에서 미리 정의한 서버 URL로 요청을 보낸다.
Nginx는 요청을 Node 기반의 API 서버 또는 Spring 기반의 API 서버(이하 ‘정보 전달 API 서버’)로 라우팅한다.
챗봇 API 서버는 학과 공지사항 등 다양한 정보를 데이터베이스에서 꺼내와 사용자에게 맞춤형으로 제공하는 역할을 한다. 이 API 서버 같은 경우 커넥션 풀(Connection Pool)을 통해 데이터베이스를 효율적으로 관리하여, 많은 요청을 처리할 때도 성능을 유지할 수 있다.
데이터의 신뢰성과 정확성을 유지하기 위해 주기적으로 웹 스크래핑 서버를 가동하여 학교 웹사이트에서 데이터를 수집하고 처리한다. 이 서버는 스크래핑된 데이터를 데이터베이스에 저장하거나 업데이트한다.
마지막으로, Github ActionsJenkins를 활용한 CI/CD 파이프라인을 통해 자동으로 빌드, 테스트, 배포가 이루어지며, Docker Hub에 이미지를 푸시하여 각 서버가 이를 최신 상태로 유지한다.

5. 주요 기능

5.1. 공지사항

학교 공지사항 기능은 경상국립대학교에 대한 소식 및 정보를 알려주는 기능이다. 카테고리별로 공지사항을 확인할 수 있으며 날짜순으로 정렬하여 사용자가 가장 최근의 공지를 신속하게 확인할 수 있도록 하였다. 또한 각각의 공지 제목을 클릭하면 해당 공지사항 페이지로 이동하여 자세한 내용을 볼 수 있다.
학과 공지사항 기능은 위의 학교 공지사항과 동일한 기능을 수행하지만  사용 대상이 학교 전체 재학생들이 아닌 해당 학과의 학생들이다. 따라서 학과 인증을 완료한 학생들을 대상으로 사용자의 학과에 해당하는 공지사항들을 카테고리별로 확인 가능하다.

5.2. 학식 메뉴

학식 메뉴 기능은 학생들이 평소에 가장 많이 찾아보고 궁금해하는 정보 중 하나이다. 커넥트 지누에서는 사진과 같이 “오늘 아람관 저녁 뭐 나와?” 와 같은 자연어를 이용해 챗봇에게 질문할 수 있다. 챗봇은 이러한 사용자의 질문 의도를 이해하고, 사용자의 발화문에서 중요한 정보들을 추출하여 그에 맞는 메뉴를 제공하도록 하였다.

5.3. 학사일정

학사 일정 기능도 학생들에게 중요한 정보 중 하나이다. 좌측 사진과 같이 월별 학사일정을 확인할 수도 있고, 우측 사진과 같이 "방학 언제야?” 같은 자연어를 이용해 질문을 해서 답변을 받을 수도 있다.

5.4. 열람실 좌석 조회

열람실 좌석 조회 기능은 중앙도서관 각 열람실의 좌석 수와 좌석 현황을 이미지로 확인할 수 있는 기능이다. 기존에 클리커로 좌석을 조회할 때는 비콘 탐색으로 인해 4~5초 정도의 지연 시간이 발생해 불편함이 컸다. 커넥트 지누에서는 주기적으로 클리커 웹사이트에 직접 접근해 스크린샷을 찍어 유저에게 보여주는 방식으로 이를 개선했다.

5.5. 기본 감정

지누의 캐릭터 이미지를 활용해 상황에 맞는 15개의 감정 메세지를 출력한다.

6. 기술적 고민

내가 팀에서 담당했던 역할은 교내 정보 수집 자동화와 데브옵스 환경을 구축하는 것이다.
이를 위해 다음과 같은 목표와 방법을 추구했다.
1.
사람의 개입 없이 서비스가 돌아갈 수 있도록 정보 수집을 자동화 해야 한다.
2.
오류가 발생할 경우 팀이 즉각 대응할 수 있도록 모니터링 시스템을 구축해야 한다.
3.
장기적인 운영을 고려하여 소프트웨어 운영 비용을 최소화 해야 한다.

6.1. 교내 정보 수집 자동화

교내 정보 수집 자동화를 위해 BeautifulSoup, Selenium 과 같은 웹 스크래핑 라이브러리를 사용한 파이썬 스크립트를 작성하고, 이 스크립트를 Github Actions를 통해 주기적으로 실행하도록 설정하였다. 같은 카테고리에 속하는 교내 정보들의 HTML 구조는 크게 다르지 않았기에, 수집할 웹페이지 URL만 변경하고 공통 스크립트를 재사용하여 효율적으로 데이터를 수집할 수 있도록 하였다.
수집할 웹페이지 URL과 수집된 웹페이지의 정보들을 저장하기 위해 Supabase를 사용하였다. Supabase는 PostgreSQL을 기반으로 하는 오픈 소스 서버리스 클라우드 데이터베이스이다. 온프레미스 환경이 아닌 Supabase를 선택한 이유는 사용자 친화적인 API 및 쉬운 설정으로 개발 생산성을 크게 높일 수 있고 데이터를 읽고 쓰는데 요금이 책정되지 않았기 때문에 비용 부담을 줄일 수 있었기 때문이다.
데이터베이스 설계는 다음과 같이 진행되었다. 우선, 각 학과별로 공지사항 카테고리가 여러 개 존재할 수 있는 One-to-Many 관계이다. 이를 해결 하기 위해 학과 공지사항 카테고리라는 테이블을 설계하여 각 학과와 공지사항 카테고리 간의 관계를 저장하였다. 이 테이블에는 학과 공지사항 카테고리의 URl 정보이 저장된다.
또한, 실제 공지사항 정보를 저장 하기 위해 학과 공지사항 게시글 테이블을 만들었다. 이 테이블은 각 게시글의 제목, 내용, 작성일자 등의 필드를 포함하며, 각 게시글이 어떤 학과의 어떤 카테고리에 속하는지를 외래키로 관리한다.
교내 정보들이 정상적으로 수집되고 있는지 팀원들이 모두 알 수 있도록 Slack을 통해 알림이 전달된다. 이를 통해, 문제가 발생했을 때 신속하게 대응할 수 있었다.

6.2. 배포 자동화

커넥트 지누의 API 서버들은 클라우드 환경이 아닌 학교 연구실 서버 환경에서 운영되고 있다. 연구실 서버의 운영체제는 CentOS이며, 개발 환경과 운영 환경의 일관성을 유지하기 위해 Docker를 도입하였다. 또한, CI/CD 파이프라인을 구축하여 애플리케이션을 패키징하고 배포한다. 커넥트 지누의 CI/CD 파이프라인은 Github, Jenkins, Docker Hub와 같은 도구를 사용하여 자동화된다. 팀원이 코드 변경 사항을 GitHub에 푸시하면, Jenkins가 이를 감지하고 빌드 및 테스트를 자동으로 수행한다. 성공적으로 빌드된 Docker 이미지는 Docker Hub에 푸시되고, 각 서버는 이를 풀링하여 최신 상태로 유지된다.
각 서버의 빌드 및 배포 상태도 마찬가지로 Slack을 통해 팀에 실시간으로 알림이 전달된다.

6.3. 라이브 서비스 장애 대응 경험

Sentry와 Slack을 통합하여 팀의 장애 대응 능력을 강화하였다. Sentry는 우리 API 서버에서 발생하는 오류와 예외를 모니터링하고, 이를 Slack으로 실시간으로 알림을 받을 수 있도록 설정하였다. 이를 통해 발생한 오류에 대한 상세한 정보와 함께 신속하게 대응할 수 있는 환경을 조성하였다.
커넥트 지누 초기 배포 당시, 학생들의 모바일 카드를 이용해 학과 인증을 진행했는데 예상했던과 달리 오류가 많이 발생했다. 모바일 카드를 인증하는 프로세스를 간략히 설명하면 다음과 같다.
1.
이미지 전송: 사용자가 챗봇에게 전자출결 어플리케이션 상단에 있는 모바일 카드를 캡쳐하여 전송한다.
2.
유저 DB 조회: 이미 학과 인증을 진행한 사용자인지 확인한다.
3.
코사인 유사도 계산: 이미지 진위 여부를 확인하기 위해 서버에 저장돼있는 팀장의 모바일 카드와 사용자의 모바일 카드를 비교해서 코사인 유사도가 일정 threshold 값을 넘으면 다음 단계로 넘어간다.
4.
학과 정보 인식: Tesseract OCR을 사용하여 이미지에서 텍스트를 추출한다.
5.
학과 정보 매칭: 이미지에서 추출한 텍스트 중 DB에 등록돼있는 학과 이름과 동일한 학과 이름을 찾아낸다.
6.
유저 DB 저장: 사용자의 카카오톡 식별자와 학과 정보를 유저 DB에 저장한다.
원인을 파악하기 위해 각 단계 별로 오류를 해결하는데 도움이 되는 로그를 남기기 시작하였다.
실제 장애 대응을 할 때 큰 도움을 받았던 대표적인 사례 중 한 가지가 영어영문학부 였다.
영어영문학부는 크게 영어영문학전공영어전공으로 나뉘는데 실제 모바일 카드에서는 세부 전공명이 적혀있지 않아 인증이 되지 않았다.
다행히, Sentry에 모바일 카드에서 추출한 텍스트를 확인할 수 있게 만들어놨기에 빠르게 문제를 해결할 수 있었다.

6.4. 카카오 챗봇 통계 데이터 활용

2024-05-29 ~ 2024-06-27 블록 호출 수
Sentry와 더불어 서비스를 운영하는 데 가장 도움이 됐던 것은 카카오 챗봇 통계 데이터였다. 카카오 챗봇 통계 데이터를 통해 사용자들이 어떤 기능을 많이 사용하는지 알 수 있었기 때문에 자연스럽게 향후에 어떤 기능을 집중적으로 개선하고 발전시켜야 하는지를 파악할 수 있었다.
또한, 재방문사용자와 신규사용자 방문 수를 통해 서비스의 지속 가능성을 확인했다. 아무리 잘 만든 서비스라도 사용자들의 재방문이 없으면 서비스의 장기적인 성장과 발전이 어려울 수 있기 때문이다. 다행히 서비스를 홍보한 이후, 많지는 않지만 꾸준하게 서비스를 방문해주시는 분들이 계셨다.

8. 성과

8.1. 프로젝트 성과 요약

2023년 5월 26일 커넥트 지누는 클로즈드 베타 서비스를 시작한 후, 버그 수정 및 기능 개선 작업을 거쳐 2023년 6월 3일 대학교 커뮤니티 에브리타임을 통해 홍보하여 오픈 베타 서비스를 시작했다. 그 결과 1,000명 이상의 사용자가 챗봇을 방문했으며, 이 중 약 38%인 384명이 친구 추가를 했다. 또한, 이 중 약 45%인 173명이 학과 인증을 완료했으며, 현재는 62개의 학과의 학생들이 서비스를 이용하고 있는 것으로 파악되었다. 이는 많은 수의 경상국립대학교 학생들이 챗봇 서비스를 유용하게 사용하고 있음을 보여준다.

8.2. 만족도 조사

또한, 오픈 베타 서비스 기간 동안 구글 설문지 폼을 이용해 사용자들에게 이용 후기를 수집 하였다. 총 104분이 설문지를 작성해주셨고 93% 정도의 사용자분들이 커넥트 지누 서비스를 만족하면서 사용하고 있는 것으로 확인했다. 주요 긍정 평가로는 “평소에 공지사항 사이트를 귀찮게 들어가서 찾아보고 해야하는데 카카오톡으로 편리하게 볼 수 있어서 너무 좋았다.” 라는 내용이 주를 이루었다. 하지만, 아직 개선할 점도 많다. 주요 부정적인 평가로는 대화가 매끄럽지 않다는 의견이 많았다. 향후에는 이러한 피드백을 바탕으로 챗봇의 자연어 처리 능력을 강화하여 사용자와의 상호작용을 보다 자연스럽고 유연하게 만들고자 한다.

9. KPT 회고

Keep (잘 해와서 유지하고 싶은 것)

1.
팀장으로써 팀원들을 잘 이끌어 프로젝트를 성공적으로 완수하였다!
2.
서비스를 실제로 배포하고 운영할 수 있다는 자신감을 얻었다!
3.
서비스 이용자들과 적극적으로 소통하려고 노력하였다.
에브리타임, 실시간 상담원 연결, 카카오 채널 적극 활용

Problem (어려움을 느껴서 개선하고 싶은 것)

1.
개발에 집중하느라 사용자 UI/UX에 많은 신경을 못쓴 것
이와 관련해서 실제로 구글 폼을 통해서 피드백을 받았다.
2.
팀원들의 강점을 살려 업무 분장을 진행하였지만, 너무 한 사람에게 몰리는 경향이 있었다.
좋은 업무 분장 방법이란 무엇일까?
3.
욕심 조금 내려놓기
개인적인 욕심+빡빡한 일정 때문에 팀원들의 속도보다 조금 빠르게 달린적이 있었다.
단기적으로 봤을 때는 좋을지 몰라도 장기적으로 봤을 때는 좋은 행동은 아닌 것 같다.
4.
알림 서비스를 도입하지 못한 것
카카오톡 챗봇 EVENT API를 통해 메시지 1건당 15원이 소요
사용자가 만명이고 하루에 한 번씩 새로운 공지사항을 알려준다고 가정했을 때, 하루 지출이 15만원으로 계산된다.
이러한 비용 부담으로 인해 현실적으로 적용하기 어렵다고 판단했다.
이를 통해 플랫폼의 힘과 비용 구조의 중요성을 체감했다.

Try (구체적인 시도할 내용)

1.
사용자 UI/UX 개선하기
UI/UX에 관련한 서적을 읽고 사용자 피드백을 수집하여, 서비스를 지속적으로 개선해 나가보자.
2.
효율적인 업무 분장 방법 도입
각 팀원의 강점을 고려하여 업무를 분배할 때, 공평하게 분배하고 너무 한 사람에게 집중되지 않도록 조정하는 능력을 길러보자.
팀원들의 피로도를 고려하여 일정을 계획하고, 일정 내에서의 실질적인 가능성을 더 꼼꼼하게 평가하자. 너무 급한 일정 설정을 지양하고, 장기적인 팀의 지속 가능성을 고려한 일정을 세우자.