대화 세션
사용자와 대화별로 최근 맥락을 저장했습니다
사용자 ID와 대화 ID를 조합한 Redis 키에 세션 JSON을 저장하고 기본 TTL을 30분으로 설정했습니다. 사용자 문장과 서버 계산 근거 요약을 남겨 다음 질문에 활용했습니다.
금융 앱의 백엔드를 개발하고,
개인 게임을 Android로 출시했습니다.
01
청년을 위한 AI 금융 코치
계좌와 거래 데이터를 가져와 소비를 분석하고,
목표를 세우거나 금융 상담을 받을 수 있는 앱입니다.
SSAFY 팀 프로젝트 · 2026.09.02 – 2026.09.29

금융망 연동부터 소비 분석과 AI 상담까지
앱에서 사용하는 백엔드 API를 개발했습니다.
삼성청년SWAI아카데미 2학기
특화프로젝트 우수상
팀 수상 · 구미 1반 2등

시작·만료·완료 시 같은 사용자 금융 연결 행을 잠급니다. 완료 시점에 RUNNING인지 확인하고, 이미 종료된 실행은 상태와 마지막 갱신 시각을 바꾸지 않도록 수정했습니다.
실행 등록과 마감은 별도 트랜잭션에서 처리합니다. 외부 금융망 호출은 상태 관리 트랜잭션 밖에서 수행합니다.
대화 세션
사용자 ID와 대화 ID를 조합한 Redis 키에 세션 JSON을 저장하고 기본 TTL을 30분으로 설정했습니다. 사용자 문장과 서버 계산 근거 요약을 남겨 다음 질문에 활용했습니다.
호출 제한
사용자별 고정 시간창으로 외부 AI 호출 횟수를 제한했습니다. INCR 뒤 EXPIRE 전에 처리가 끊기는 경우를 피하도록 두 연산을 Lua 스크립트에서 함께 실행했습니다.
소비 진단의 맥락을 대화에 전달하고, 저축액이나 소비를 바꿨을 때의 목표 달성일을 기존 서버 계산기로 구하도록 연결했습니다.
외부 전송 직전 대화 이력과 도구 결과의 민감정보 패턴도 재검사했습니다.

발견한 점 · 집계 데이터
사용자·기간·카테고리별 소비를 SQL로 집계했습니다. 수입·이체·저축성 지출·숨긴 거래를 제외하는 조건을 공통화해, 소비 진단과 분석에 사용할 데이터를 제공했습니다.
나의 소비 유형 · K-Means
Python에서 표준화 값과 군집 중심을 JSON으로 내보내고, Spring에서 로딩해 소비 유형을 배정했습니다. 군집 내 위치와 나이대·성별 비교 정보를 확장하고, 군집 이탈 신호를 기존 진단·추천에 연결했습니다.
나이·성별은 비교 기준이며 군집 입력 특징이 아닙니다.
모델·입력 조건 미충족 시 규칙 기반 분석으로 대체합니다.


02
직접 만들고 출시한 주사위 게임
개인적으로 시작한 주사위 게임에 배운 기술을 적용하며
데스크톱 게임을 Android 앱으로 발전시켰습니다.
개인 프로젝트 · Google Play 누적 다운로드 1,000+
주사위 5개로 점수를 겨루는
1:1 실시간 멀티플레이 게임


서버의 역할
Flutter 앱은 굴리기·홀드·점수 칸 선택을 WebSocket으로 요청합니다. 서버는 본인 차례인지, 굴린 횟수가 3회 이내인지, 선택한 점수 칸이 비어 있는지 확인한 뒤 상태를 변경합니다.
상태 전달
서버의 주사위로 점수와 보너스를 계산하고 다음 차례를 준비합니다. 확정한 주사위·점수판·굴린 횟수·차례를 방 참여자에게 전달하고, 계정과 승수는 SQLite에 저장했습니다.
같은 계정이 새 소켓으로 접속한 뒤, 이전 소켓의 종료 이벤트가 도착할 수 있습니다. 종료 이벤트에서 계정 ID만 보고 삭제하면 새 세션까지 사라질 수 있어 소켓을 비교했습니다.
if (activeSessions.get(ws.playerId) === ws) {
activeSessions.delete(ws.playerId);
}종료된 소켓이 현재 등록된 소켓과 같을 때만 세션을 삭제합니다.
GOOGLE PLAY
로컬에서는 되던 Google 로그인이 배포본에서 실패했습니다. 업로드 키와 Play 앱 서명 키가 다르다는 점을 확인하고, 배포용 인증 정보를 등록해 해결했습니다.
RASPBERRY PI
서버가 불규칙하게 멈추거나 재부팅됐습니다. 네트워크와 앱 로그에 이어 커널 로그를 확인하면서 UnderVoltage 경고를 찾았습니다. 정격 전원 어댑터로 교체한 뒤 정지 문제가 해결됐습니다.