개요
-
프로젝트 이름
Fit Mate: 개인 맞춤형 운동을 위한 헬스케어 서비스
-
내용
Open AI의 Chat GPT API를 사용하여 사용자의 체성분 데이터와 요구사항을 바탕으로 DB에 있는 운동 및 보조제 정보를 탐색, 맞춤형 운동, 보조제를 추천해주는 웹서비스.
-
플랫폼
Web Application
-
제안 배경
a. 최신 기술을 반영한 풀스텍 웹어플리케이션 제작 b. 헬스, 홈트레이닝, 필라테스 등 자기관리에 대한 관심 증가 c. 사용자의 상황에 따른 맞춤형 운동 추천 서비스의 부재
-
제안 목적 및 주요 기능
a. 개인 맞춤형 운동 및 보조제 추천 기능 제공 b. 사용자의 체성분 데이터 변화량에 따른 시각 자료 제공 c. 운동 방법, 영상 등의 운동 기본 정보 제공 d. 보조제 가격, 성분 등의 보조제 기본 정보 제공
구현한 코드는 다음 GitHub Page에 가면 확인할 수 있다.
진행 기간
2023.03.02 ~ 2023.06.07
소감
본 프로젝트는 본인 외에 2명의 같은 학과 학생과 진행한 졸업 프로젝트로 지금까지 진행했던 프로젝트 중 가장 스케일이 큰 프로젝트였다.
처음 2주 가량은 프로젝트 주제를 두고 많은 고민과 토의가 있었다. 지도 교수가 데이터베이스 전문이었기 때문에 데이터베이스 성능 개선을 우선적으로 염두해두고 세부적인 내용을 논의했지만 성능 개선을 시도하기 위해선 DBMS 전반에 대해 깊고 넓게 알아야 했다. 다들 의욕이 충만했기 때문에 “지금부터 열심히 알아가면 되지!”, “지도교수가 잘 가이드해줄거야!” 로 각자 분야를 정해서 발표식으로 DBMS 스터디를 시작했지만, 지도교수와의 회의 끝에 지금 시작하기엔 시간이 너무 적다는 결론이 나와 웹 서비스를 제작하는 것으로 프로젝트의 방향을 돌렸다.
주제를 정하는 회의에서 최근 화두가 되는 Chat GPT를 사용하는 것이 시의성이 있을 것 같으며, 세명 모두 운동에 관심이 있었기 때문에 내가 제시한 FitMate 에 대한 초기 아이디어가 긍정적인 반응을 얻었다.
수차례 회의를 통해 FitMate의 기능적인 요구사항들, ChatGPT API에 대한 검증을 거쳐 아이디어가 어느정도 윤곽이 잡혔다. 기능적인 내용 외에 구체적으로 구현을 어떻게 할 것인가에 관련된 내용이 논의되기 시작했고, 여기서 구현해야할 내용이 크게 React를 활용한 Web Front-end, Spring을 활용한 Web Back-end 두가지로 나뉘게 되었다. 역할 분담을 해야했는데 세명 모두 Backend 분야기 때문에 약간 곤란한 상황이 되었다. 역할 배분을 논의 하기 위해 과업에 대해 조금 더 명확히 하는 회의가 진행되었고, Front 를 진행하는 사람을 문서작업에서 배려해주기로 협의했다. 팀원 중 유일하게 React 사용 경험이 있었기에 “내가 해야 하나?”를 고민하던 와중에 팀원 중 한명이 자원했다. 나와 다른 팀원은 Front를 맡기로 한 팀원에게 감사를 표했다.
역할 분담은 다음과 같다. (실명은 언급하지 않겠다.)
Front: 팀원 A
Back: 나, 팀원 B
Back-end 서버를 구현하기 전에 API 명세서를 먼저 정의하고 구현에 들어가는게 Front의 혼란이 적겠다고 생각해서 Back-end를 맡은 나와 B는 1주에 걸쳐서 API 명세서를 노션으로 제작했으며 그 과정에서 조금 더 서비스에 대해 구체적인 사항들을 정할 수 있었다. 이 시기에 A는 React에 대한 강의를 들으며 활용할 기술에 대해 학습했다.
API 명세서가 완성되고 A에게 공유하며 우리들이 설계한 서비스의 구체적인 모습들에 대해 공유하는 시간을 가졌고, 추가적으로 서비스에 대한 통일된 이해를 바탕으로 나와 B는 E-R Diagram, Class Diagram 만들었고, A는 와이어프레임을 만들어 서로 공유하고 설명하며 서비스에 대한 이해를 굳혔다.
다음 확정된 Diagram들을 바탕으로 데이터베이스를 설계하고, Spring application 설계와 구현을 진행했다. 외부 API(Chat GPT, DeepL)를 애플리케이션 내에서 활용하기 위해 API 활용에 대한 테스트를 각자 하나씩 맡아서 진행했다. 나는 Chat GPT에 대한 테스트를 맡았는데 fine-tunning 을 할지 여부를 판단하기 위해 직접 fine-tunning을 시도해보았지만, 고작 십수개의 학습 데이터를 넣는 것으로는 원하는 결과를 얻을 수 없었다. 이 과정을 통해 fine-tunning에 엄청난 양의 데이터와 고도로 숙련된 전문가가 필요하다는것을 느끼며, fine-tunning은 포기했다. 결론적으로 Chat GPT의 수많은 모델 중 비용과 입력 가능 토근수를 고려하여 gpt-3.5-turbo 모델을 사용하기로 결정하고, 그것을 활용하는 기능을 Spring application 내에 구현했다. request 전송부터 Chat GPT의 응답이 도착하기까지 약 40초 가량의 시간이 소요되었기 때문에 이를 따로 멀티 쓰레드 작업으로 분리하였고, client 에게는 Chat GPT의 응답을 기다리는 동안 다른 작업을 할 수 있도록 요청이 생성되어 진행중임을 알리고, 생성된 요청을 열람할 수 있는 ID를 response 를 보내는 식으로 연결을 40초간 기다리는 일을 방지했다.
B는 번역을 담당하는 DeepL API를 테스트하는 것을 맡았으며 DeepL이 아직 한국에 정식 출시하지 않았기 떄문에 API 키를 받을 수 없다는것을 발견한다. B는 Rapid API라는 API 우회 사용 서비스를 활용해 DeepL API를 간접적으로 활용할 수 있는 키를 확보하고 이를 활용해 DeepL의 기능을 활용할 수 있도록 하는 기능을 Spring application 내에 구현했다.
나와 B는 많은 시도 끝에 각자 맡은 보충제, 운동 추천에 대한 영문 질의 템플릿 또한 만들었고, 이를 Chat GPT request를 보내고, response를 받아 DeepL을 이용해 번역하는 기능을 구현완료했다.
가장 서비스에 핵심이 되는 부분은 이렇게 끝났고 그 외에 API들을 프론트와 주 3회 이상의 회의를 가지며 구현해 나갔다.
이후에는 프론트와 백엔드를 통합하는 테스트를 진행 한 뒤 내 소유의 NAS에 배포환경을 만들어 배포했다.
There are currently no comments on this article
Please be the first to add one below :)
내용에 대한 의견, 블로그 UI 개선, 잡담까지 모든 종류의 댓글 환영합니다!!