이설아seola12e
전체 프로젝트
PROJECT 03AI 감정 분석 · 자립 지원팀 프로젝트

Leap

자립준비청년의 홀로서기를 위한 감정 분석 기반 맞춤형 지원 시스템. 감정일기 · AI 챗봇 리피 · 맞춤형 미션 · 커뮤니티 · 자립 지원 정보를 하나의 앱으로 연결했습니다.

PERIOD
2025.03.04 — 2025.06.05 (약 3개월)
TEAM
5인 (BE 2 · FE 2 · AI 1)
ROLE
PM · 인증 · 미션 · 챗봇 · AI 모델 연동 · 관리자
LINKS
GitHub
Leap 앱 화면 — 챗봇 리피가 있는 홈과 감정일기 캘린더

01프로젝트 개요

자립준비청년은 아동복지시설 · 위탁시설 등에서 보호받다가 만 18세가 되어 보호가 종료된 뒤 독립적인 생활을 시작하는 청년입니다. 2023 자립지원 실태조사에서 자립준비청년의 46.5%가 자살을 생각해 본 적이 있다고 답했고, 그럴 때 가장 필요한 도움으로 ‘이야기할 수 있는 친구나 멘토’(30.3%)를 꼽았습니다. 정서적 교감 대상의 부재, 감정 표현과 이해의 어려움, 사회적 연대의 결여, 맞춤형 자립 정보의 부족에 주목해 감정 → 관계 → 목표 · 성장 → 공동체 → 정보로 이어지는 서비스를 기획했습니다. 저는 팀장(PM)이자 백엔드 담당으로 인증 · 온보딩 · 미션 · 챗봇 · 관리자 기능 등 사용자 API 19개와 관리자 미션 API 5개를 구현하고, AI 팀원이 만든 감정 분석 · 요약 모델을 서버에 연동했습니다.

GOAL 1자기 이해 — 감정일기 AI 감정 분석 · 요약
GOAL 2정서적 교감 — 단짝 친구 같은 AI 챗봇 리피
GOAL 3경험 기반 성장 — 자립 영역별 맞춤형 미션

02담당 역할

인증 · 회원 · 온보딩회원가입 · 로그인과 JWT 인증 필터, CustomUserDetails 기반 사용자 · 관리자 권한 분리, 온보딩(챗봇 · 자립목표영역 선택), 로그아웃 · 소프트 삭제 기반 회원 탈퇴, 마이페이지
AI 챗봇 · 모델 연동OpenAI API 연동 챗봇(성격 4종, 최근 대화 15개 기억), 감정일기 작성 흐름(팀원 담당)에 감정 분류 · 요약 모델 연동, 분석 결과를 챗봇 시스템 프롬프트에 반영
미션 · 홈 · 자립정책정보자립지원표준화프로그램 기준으로 구성한 자립 영역별 미션 부여(영역 선택 시 5개), 진행 중 · 완료 미션 조회, 수행일지 작성 · 조회, 영역 완료 시 레벨 상승, 홈 대시보드와 자립정책정보 목록(전체 · 카테고리별) 조회 API
관리자 · 설계 · PM관리자 인증과 회원 · 미션 관리 API, 관리자 웹 연동, 학과 서버 배포 설정. 설계서의 ERD · 테이블 명세 · 로그 · 오류코드 설계와 사용자 REST API 설계를 작성하고, 팀장(PM)으로 Jira 일정 관리와 주간 정기 회의 진행

03기술 스택

OpenAI APIWebClient로 Chat Completions API를 호출. 시스템 프롬프트에 사용자가 고른 챗봇 성격과 최근 감정일기 분석 결과를 넣고, 최근 대화 15개를 함께 보내 맥락을 유지
PyTorch 모델AI 팀원이 학습한 KoBERT 감정 분류 · KoBART 요약 모델을 ProcessBuilder로 Python 스크립트를 실행해 연동. 학과 서버 환경에 맞춰 CPU 추론으로 전환
Spring SecurityJWT 인증 필터와 CustomUserDetails로 사용자 · 관리자 권한을 분리. 기본 로그인 폼을 끄고 미인증은 401, 권한 없음은 AccessDeniedHandler로 403을 반환
MariaDB학과 서버(Rocky Linux)의 MariaDB에서 회원 · 채팅 · 미션 · 일기 관계를 관리(로컬은 MySQL). 연관 데이터가 많은 회원 · 미션은 isDeleted 소프트 삭제로 데이터를 보존하면서 조회에서 제외
Java 17Spring Boot 3.3Spring Data JPAJWTWebClientSwaggerPythonJira

04시스템 아키텍처

감정일기 · 챗봇 · 미션 흐름. 감정일기를 쓰면 감정 분류와 요약 결과가 저장되고, 챗봇은 이 결과와 최근 대화를 바탕으로 대답합니다. 자립 영역을 고르면 미션이 부여되고, 영역을 마치면 레벨이 올라갑니다.
Leap 시스템 아키텍처 — 모바일 앱 · 사용자 웹 · 관리자 웹, 학과 서버의 Spring Boot 애플리케이션(Spring Security · REST API · JPA · AI Model Bridge · OpenAI Client), Python AI 런타임(KoBERT · KoBART), MariaDB, OpenAI API · Hugging Face Hub
전체 시스템 아키텍처. 가천대학교 학과 서버의 Spring Boot 애플리케이션이 REST API와 사용자 · 관리자 웹 정적 리소스를 함께 서빙하고, 감정 분석 · 요약은 Python AI 런타임(KoBERT · KoBART)을 하위 프로세스로 실행해 처리합니다. 데이터는 MariaDB에 저장하고, 챗봇 응답은 OpenAI API로 생성합니다.

05주요 구현 기능

5.1

감정일기를 기억하는 AI 챗봇 리피

메시지를 보내면 어제 · 오늘 작성한 감정일기의 요약과 감정 점수, 온보딩에서 고른 리피의 성격(4종)으로 시스템 프롬프트를 만들고, 최근 대화 15개와 함께 OpenAI API에 전달합니다. 학과 서버 DB에 이모지를 저장할 때 오류가 나서, 프롬프트로 이모지 사용을 막고 응답에서도 이모지를 제거한 뒤 저장합니다.

String systemPrompt = SystemPromptFactory.getSystemPrompt(findUser.getChatbotType(), recentAnal);
List<Message> pastMessages = messageRepository.findByMessagesByChatId(chat.getId());
int MAX = 15; // 최대 대화 기억 개수
if (pastMessages.size() > MAX) {
    pastMessages = pastMessages.subList(pastMessages.size() - MAX, pastMessages.size());
}
5.2

감정 분류 · 일기 요약 모델 연동

팀원이 만든 감정일기 작성 흐름에 AI 분석을 연결했습니다. 일기가 저장되면 Python 스크립트를 실행해 KoBERT 모델로 7가지 감정(불안 · 분노 · 상처 · 슬픔 · 당황 · 기쁨 · 놀람)을 분류하고 KoBART 모델로 일기를 요약한 뒤, 출력에서 예측 감정과 감정별 점수, 요약문을 추출해 분석 결과로 저장합니다. 이 결과는 감정 캘린더 · 상세 조회와 챗봇에서 사용합니다. 두 모델은 AI 팀원이 학습했으며, 테스트에서 감정 분류 F1 0.94(6,213건), 요약 ROUGE-1 · 2 · L 0.51 · 0.36 · 0.44(500건)를 기록했습니다.

5.3

자립 영역 미션과 관리자 기능

자립 영역을 선택하면 자립지원표준화프로그램 기준으로 구성한 해당 영역의 미션 5개를 부여하고, 이미 마친 영역은 다시 고를 수 없게 했습니다. 수행일지를 작성하면 미션이 완료되고, 영역의 미션을 모두 완료하면 회원 레벨이 오릅니다. 관리자 웹에서는 회원 목록 조회 · 강제 삭제, 미션 생성 · 수정 · 삭제를 할 수 있고, 삭제된 미션은 새 회원에게 부여되지 않습니다.

06트러블슈팅

ISSUE 01

변경한 회원 정보가 DB에 반영되지 않던 문제

문제
온보딩에서 자립 영역이나 챗봇을 설정하면 요청은 성공하는데, 변경 내용이 DB에 저장되지 않았음
원인
인증 정보(userDetails.user())에서 꺼낸 User는 인증 시점에 조회된, 현재 영속성 컨텍스트가 관리하지 않는 객체여서 JPA 변경 감지 대상이 아니었음
해결
userRepository.findById()로 영속 상태의 엔티티를 다시 조회한 뒤 변경하도록 수정하고, 같은 방식을 다른 서비스 로직에도 적용
결과
자립 영역 · 챗봇 설정이 정상 저장 · 이후 회원 정보를 변경하는 로직은 영속 엔티티를 기준으로 처리
ISSUE 02

연관관계로 인해 회원 탈퇴가 실패하던 문제

문제
회원 탈퇴 시 채팅 · 미션 · 일기 등 회원과 연결된 데이터 때문에 삭제가 되지 않았음
원인
탈퇴를 DB에서 회원 행을 바로 삭제하는 방식으로 구현해, 회원을 참조하는 연관 데이터와 충돌했음
해결
User 엔티티에 isDeleted 필드를 추가해 소프트 삭제로 변경하고, 인증 시 탈퇴한 회원인지 확인하는 로직을 추가. 관리자 미션 삭제도 같은 방식으로 처리하고, 삭제된 미션이 새 회원에게 부여되던 버그도 수정
결과
연관 데이터를 보존하면서 탈퇴 처리 · 탈퇴한 계정은 로그인 · 인증 단계에서 차단

07회고

KEEP · 잘한 점

팀장으로서 기획 · 설계 · 개발 전 과정을 책임감 있게 이끌며 팀원들과 함께 문제를 풀어 갔습니다. Spring을 처음 사용한 프로젝트라 시행착오가 많았지만, 하나하나 부딪히며 해결해 처음보다 훨씬 성장한 상태로 프로젝트를 마무리했습니다.

PROBLEM · 아쉬운 점

객체지향적으로 개발하려고 노력했지만, Spring에 익숙하지 않은 상태로 시작해 기능이 늘어날수록 코드가 복잡해지고 관리하기 어려워졌습니다. AI 모델을 요청마다 Python 프로세스로 실행하고 출력 문자열을 파싱하는 구조처럼, 구조와 유지보수성 측면에서 아쉬운 부분이 남았습니다.

TRY · 다음에는

처음부터 아키텍처를 분명히 정하고, 확장성과 유지보수성을 고려한 설계로 시작하고 싶습니다. 팀장으로서도 소통 방식 · 역할 분배 · 일정 조율을 더 깊이 준비해 더 안정적이고 효율적으로 팀을 운영해 보고 싶습니다.