벌써 SSAFY의 특화 프로젝트가 끝나고 자율 프로젝트가 시작되었습니다. 이제 14기가 들어온다 하는데 제가 나갈 기간이 얼마 남지 않았다는 것이 체감이 되기 시작합니다. 나를 더 키워달라 싸피...

그래도 할 것은 해야겠지요. 정말 정말 어려웠던 핀테크 도메인 특화 프로젝트 회고 시작합니다.
이번 팀원은 시작 전 부터 기대가 되었습니다. 이전에 정말 친하게 지내던 사람들과 다시 모이게 되었기 때문인데요? 스택도 적절하게 나뉘었다고 (지금 생각하면 아닌 것 같지만) 생각합니다.
백엔드 3명, 프론트 2명, 인프라 1명 총 6인 구성으로 저는 백엔드를 맡을 생각이었습니다!
하지만 오랜만에 마이크 타이슨 선생님의 명언을 뼈저리게 느껴버렸는데요.

저의 원대한 백엔드 계획은 데이터 펀치 한방에 무너지고 말았습니다.
SSAFY의 특화 프로젝트는 크게 6가지의 도메인으로 나누어 진행됩니다. 그 중 저는 금융권 취업을 노리고 있기 때문에 핀테크를 선택하게 되었는데... 정말로다가 할 게 없는겁니다. 금융 서비스가 오프라인 창구에서 온라인으로 전환이 되면서 정말 많은 서비스가 시중에 나온 상태였고 도메인 특성 상 그들의 도메인 + 데이터를 이용하기 때문에 기획이 너무 어려웠습니다.
그래도 열심히 기획 단계를 준비하며 정말 여러 아이디어를 구상하게 되었습니다. 
혹시 이 글을 읽으시는 분들을 위해 많은 아이디어 중 일부를 공유하겠습니다.
이게 정말 극초반에 막 아이디어를 던질 때 나왔는데 아무리 생각해도 기존에 이미 있거나 메인 MVP가 빈약하다는 생각이 많이 들었습니다.
그러던 중 정부가 마이데이터 2.0을 기획 중인 것을 알게되었고, 현재 제공되는 카드 소비 내역으로는 부족한 마이데이터를 직접 구현 초개인화 추천 서비스를 제공하는 것이 저희의 MVP가 되었습니다.

이에 더해 약속을 잡으며 가장 오래 걸리는 장소 선정에 이 데이터를 이용해 공통 관심사가 가장 많이 겹치는 장소를 추천해주는 서비스를 구상하게 되었습니다.
데이터!!!!!!!!!!!!!! 데이터가 문제였습니다. 
어디에나 있는 데이터, 근데 저희는 직접 만들어야해요. 더미 데이터 생성이 정말 생산성 낮추는 1등 공신이었습니다.

현재 사용되는 마이데이터의 경우 정보 제공자들에게 통합 인증서와 전자 서명을 통해 인증을 통해 해당 고객의 금융 데이터를 활용하게 되는데 저희 서비스! 마이데이터 서비스 인증 X, 사업자 등록 X의 모든 조건 불충족의 상황에 있었습니다.
그래서 생각한 방안이 사람들의 유형을 만들어서 (페르소나) 각자 특정한 소비 패턴을 만들어보자! 였습니다. 하지만 마이데이터 2.0은 호락호락 하지 않았습니다.
왜? 와이? 기존의 카드 or 계좌 거래 내역과 다르게 어떤 가게에서 어떤 물건을 얼마나 결제했는지가 중요해졌거든요. 이 수치의 편향성을 통해 해당 사용자가 어디에 소비를 많이 하는지를 알게되고 결국 이 더미 데이터가 추천 알고리즘 성능의 전부가 되게 됩니다.
그래서....
장소 데이터 크롤링 부터 다시 시작하게 되었습니다. 모든 장소의 대분류 - 중분류 - 소분류와 각 카테고리별 평균 금액대 설정 및 페르소나별 금액대 분포도 설정 등 데이터 전처리를 이렇게 열심히 해본 적이 없을 정도로 해봤습니다.
그렇게 전처리된 장소 데이터 22만건, 영수증 데이터 100만건을 생성하는데 성공하게됩니다.

여기서 멈추지 않았습니다. 핀테크, 이 도메인은 "보안"이 매력 포인트이면서 위험 그 자체였습니다.
처음 핀테크 도메인을 결정하면서 데이터 정합성, 보안 등 일반인이 금융!하면 떠오르는 모든 키워드를 챙기고 싶었습니다. 하지만 세상은 넓고 보안은 복잡했습니다.

보안...은 정말 어렵더라구요. 공동인증서 API를 활용하고 싶으면 사업자 등록이 필요하고, 자체 개발하기엔 7주 프로젝트에 적용하기엔 공수가 어마무시하게 컸습니다. 결국 저희는 빠른 판단을 내렸습니다. 인증 로직을 간소화 하되, 기존의 서비스가 공동인증서 이전에 사용했던 인증 방식을 사용하자고 판단했습니다.

매번 헷갈려서 결국 노션에 정리를 한 인증 로직입니다. 계좌 연결과 마이데이터 갱신 주기는 토스나 카카오페이의 주기와 비슷하게 들고가려했습니다. 다른 점은 저희 서비스는 마이데이터 갱신에 따라 추천이 달라지기 때문에 한달에 한번 모든 사용자가 아닌 서비스를 이용 시 서버단에서 판단하여 한달 이상이면 갱신되도록 처리했습니다.
한달에 한번 모든 사용자를 바라보며 한달 이상인 사용자들을 갱신해주는 방식도 생각했지만 아무리 생각해도 너무 비효율적이라 생각해 저런 갱신 방식을 선택했습니다.
[초반에 러프하게 생각한 나의 추천 알고리즘...]

추천 알고리즘은 제가 이전에 작성한 글에서도 봤듯이 생각보다 더 오래됐습니다. 이 정도 연식이면 관련 라이브러리가 엄청 생기게 되는데 덕분에 쉽게 적용할 수 있었습니다.
저는 python의 surprise 라이브러리의 SVD, SVDpp, NMF방식과 Memory Based 방식을 이용해 평가를 진행했습니다.
그 전에 페르소나를 정해두고 더미 데이터를 생성해 수동적? 클러스터링?이 되었는데 그 상태에서 전통의 0.75 / 0.25 테스트 데이터 셋으로 추천 모델의 MAE 및 TopN 평가를 진행하니 예상외로 SVD가 가장 높은 점수를 획득했습니다.
느려도 SVDpp가 가장 높은 점수를 획득할 줄 알았는데 아마 잠재 요인 평가 반영이 생각보다 미미했거나 너무 페르소나 지정이 빡빡해서 오히려 부정적인 요인으로 적용된 것이 아닌가 생각했습니다.
추천 알고리즘을 구현하고 평가하는 과정은 오히려 적은 시간이 들었고 오래 걸린 것은 더미 데이터 생성 및 각 카테고리의 유사도 분석 (컨텐츠 기반 유사도 분석) 이었습니다.
페르소나에 따라 소분류를 정하는 것도 중요하였고 각 소분류의 유사도를 어떻게 분석할지가 또 하나의 큰 벽이었습니다.
| 방법 | 장점 | 단점 |
|---|---|---|
| 분류끼리 점수 | 분류가 쉬움 | 현실성 반영이 힘듬 (운동 + 고기 조합 반영 X) |
| 의미 기반 텍스트 코사인 유사도 | 자동화 Good | 데이터!!!!!!!!! 데이터가 없음 |
| 장소 동시 등장 기반 | 자동화 | 상관 관계가 부족해 보임 |
| 검색 기반 연관도 | 라이브러리 있음, 괜찮은 결과를 예상 | 시간이 오래 걸릴지도, API 제한 있음 |
| Word2Vec 사용 | 검색 기반에서 벗어나기 가능 | 결과가 정확한지 나도 모르겠음 |
굉장히 다양한 방법을 시도해봤는데 검색 기반 연관도가 볼드체인 것으로 보아 검색 기반 연관도를 사용했을 것 같지만 저거 테스트해보다가 또 시간 뺏기고 결국 Word2Vec을 사용해 분석을 했습니다.
검색 기반 연관도는 Google의 검색량을 기반으로 분석해보면 의미있는 결과가 나오지 않을까? 해서 시도해본 방법입니다. 각 소분류가 만약 고기, 운동이라 하면 운동 + 고기로 검색되는 검색량에 따라 유사도를 분석해보는.. 방법입니다! 각 소분류 별로 연관도를 측정하기에 부족하지 않다 생각했는데 제가 해당 라이브러리의 구조를 정확히 모르기도 했고 각 소분류를 이어 붙여 검색하는 것이 생각만큼 연관도를 분석하기에 좋은 지표가 아님을 알 수 있었습니다. 평가는 이전과 다르게 직접 시각화해서 확인을 했습니다.
현실의 지표를 판단해야하는 부분이라 제가 직접 눈으로 확인하는 것이 정확하다 생각했고, 하나하나 확인하지 않았으면 그냥 이 방법으로 넘어갔을 것이라 생각하니 아찔하긴합니다.
그 다음 채택한 방법이 Word2Vec 입니다. ML/DL을 전공하신 분들이라면 익숙하시겠지만 특정 단어 다음에 어떤 단어가 올지를 라이브러리로 제공해줍니다. 물론 모델이 엄청 무겁지만 저는 한국어만 필요했기 때문에 괜찮았습니다. (싸피가 주는 노트북 스펙이 좋기도 했습니다.)
이 방식으로 소분류 별 연관도를 분석하니 생각보다 더 정확한 분석 결과가 나오더라구요. 물론 정규화를 통해 수치를 조금 만져주긴 해야했습니다.

나를 용서하세요. 구현은 성공했지만, 추천 API를 프론트와 연동한 시점이 마감 이틀 전이었습니다. 다행히 연동까지 성공했지만.............. 일정이 계속 늦어진 것에 대해 너무나도 Sorry...합니다.
지금도 연동을 맡은 프론트 팀원에게 매우 미안합니다. 마음의 빚이 있어요.
회고니까 후회만 하면 안되겠지요. 다음에는 어떻게 해야할까요? 제가 생각한 결과는 다음과 같습니다.
GPT는 과연 짱일까
제가 GPT 거짓 정보를 거르기 위해 블로그에 글도 정리했기에 망정이지 이 요물만 믿고 덤볐다가는 절대 마감안에 알고리즘 구현을 성공하지 못했을 것 같습니다. GPT의 성능이 나날이 개선되고 있지만 여전히 할루시네이션이 있고 데이터 생성 능력이나 MCP를 활용하는 면에서 어색함이 있다고 느껴집니다. 엑셀이나 html을 생성해서 뿌려주는 기능을 특히 많이 사용하게 되었는데 MCP를 활용하는 경우 더 정확한 요구사항 (인코딩, 데이터 형식 등)을 던져줘야 함을 알았습니다.
해본 것도 못하는데 안해본 것을 잘하겠는가
두 번의 프로젝트를 지나고 정확한 이유를 모르겠지만 (이젠 알지만😭) 제가 지친건지 멍청해진건지 점점 생산성이 낮아지고 있습니다. 심지어 이번 프로젝트는 java가 아닌 python을 주로 사용하다보니 이런 경향이 더더욱 심해진 것 같습니다. 제가 생각했던 공수의 1.5~2배 정도는 두고 덤벼야 이런 불상사가 다시 안생길 거라 생각합니다.
이번 자율 프로젝트도 아주..생소한 녀석인데요? 이번엔 절대 이런 일 없도록 미리 준비하도록 하겠습니다.
나에 대한 정확한 판단
이건 제가 아니라 GPT가 해줬습니다. 다들 한번씩 해보면 재밌을 것 같아서 공유합니다. 어떤 영상에서 봤는데

이렇게 질문을 던지니 저의 습관을 관통하는 말을 해주더라구요.
장점보다 단점을 보자면 과도한 구조화와 피드백 의존성 이것이 제 문제점이라더군요. 지금 생각해보면 참 맞는 말입니다. 항상 작은 부분에 집착하는 것이 생산성을 낮추는 가장 큰 요인인 것 같습니다.

너무 맞는 말이라 슬펐습니다.
또 있는데요? 바로 타인의 피드백에 집착하는 성향입니다.

주관이라 생각했던 것을 잘 지켜가고 있는지 한번쯤 다시 생각해봐야겠습니다.
이번 프로젝트는 정말 멍하게 지나갔습니다. 분명 열심히 했다 생각했는데 왜 이렇게 허망한지 모르겠습니다. 개인적인 욕심이 강해서인 것 같습니다. 데이터만 만지게 된 것이 슬픈 것일까요. 근데 이건 순수하게 개인 능력 부족이라 너무 슬픕니다.

그래도 해야지. 다음 글 부터는 새로 시작하는 멋쟁이 프로젝트로 돌아오겠습니다. 이번 프로젝트는 단점을 완벽히 극복한 모습으로 진행해보겠습니다.

글 너무 잘 읽었습니다. 프로젝트 때 기억이 새록새록 나네요 ㅎㅎ