담당한 것 — 대시보드
이 프로젝트에서 제가 맡은 것은 대시보드입니다. 저장소가 비공개라 코드를 걸지 못해서, 무엇을 만들었고 그때 무엇을 판단했는지를 적어 둡니다.
규모
기간 : 2026년 6월 21일 ~ 23일 (실질 2.5일)
인원 : 4명 (팀장은 다른 사람이고, 저는 대시보드 담당이었습니다)
기여도 : 커밋 25/57 (43.9%) · +1,784 / −466 줄. 그중 9건은 팀원 PR 병합이라 통합도 함께 맡았습니다.
만든 화면 둘
위험 고객 맞춤 프로모션 시뮬레이터
고객을 검색해 속성을 가상으로 바꾸면 이탈 확률이 실시간으로 달라지는 화면입니다. 처음 이름은 “What-if 분석”이었는데, 쓰는 사람이 무엇을 할 수 있는지 알 수 있게 바꿨습니다.
모델을 다시 학습하지 않습니다. 저장된 모델의 예측 함수만 호출합니다. 화면에서 학습이 돌면 같은 조작에 다른 답이 나오고, 그러면 시뮬레이터가 아니라 도박이 됩니다.
세그먼트는 원본 값에서 자동으로 다시 계산합니다. 사용자가 직접 못 바꾸게 막았습니다 — 분석 쪽에서 정한 세그먼트 정의와 화면이 어긋나면, 같은 고객이 화면마다 다른 집단에 들어갑니다.
이탈 방어 비용 효과 분석
혜택에 드는 비용과 그렇게 지킨 매출을 비교하는 화면입니다. 이름을 “ROI 시뮬레이션”에서 바꾼 것도 같은 이유입니다.
모르는 값을 지어내지 않았습니다. 오퍼 단가와 전환율은 데이터에 없는 값이라 사용자가 직접 넣게 하고, 가정이라는 사실을 화면에 적었습니다. 숫자를 하나 정해 넣으면 결과가 근거처럼 보입니다.
예산 최적 배분 알고리즘을 만들지 않았습니다. 세그먼트별 비교표까지만 만들고 판단은 사람에게 남겼습니다. 자동으로 나눌 근거가 데이터에 없었습니다.
데이터의 한계를 결과 아래에 적었습니다. 한 시점만 찍힌 데이터라 절대 날짜가 없고, 그래서 잔존 기간은 추정값입니다.
화면 (제출 전 개발 중 버전)
아래 둘은 제출본이 아니라 제출 전 개발 중에 찍어 둔 화면입니다. 이후 위의 두 화면으로 재편됐지만 그때 내린 판단은 그대로 이어졌습니다.

예산이 한정될 때 누구부터 잡을지 — 이탈확률만으로 정렬하면 월요금이 적은 저가 고객이 먼저 올라옵니다. 예상손실액(이탈확률 × 월요금)을 기본 기준으로 두고 두 기준을 나란히 비교하게 했습니다. 대상 인원은 슬라이더로 사람이 정하고, 1개월 근사치라는 가정을 화면에 적었습니다.

모델이 찾은 위험 속성에 사람이 정한 대응 규칙을 붙였습니다 — 카드 위에 통계 검증된 인과관계가 아니라 실행을 위한 제안 이라고 못 박았고, 할인폭과 기간은 [할인폭] · [기간] 으로 비워 뒀습니다. 근거 없는 숫자를 채우면 카드가 분석 결과처럼 읽힙니다.
그 밖에 한 것
CSV 를 올리면 그 데이터로 대시보드가 그려지는 경로 (앱 진입점 · 데이터 계층 · 개요 화면 등 6개 파일)
데이터 접근 계층과 앱 셸 — 화면들이 같은 방식으로 데이터를 읽도록
개요 화면 (팀원과 반씩)
코드 정규화 — 지우는 커밋을 냈습니다
이 프로젝트에서 처음으로 “코드 정규화”를 고민했습니다. 사흘짜리 일정에서 기능을 더하는 대신 구조를 정리하는 커밋을 넷 냈고, 그 넷은 전부 더한 줄보다 지운 줄이 많거나 비슷합니다 — 21+/97− · 122+/135− · 36+/21− · 35+/27−.
여러 화면에 흩어져 있던 같은 로직을 헬퍼로 뽑고, 쓰지 않는 임포트와 변수를 지웠습니다.
캐시를 걸지 않은 함수에는 왜 안 걸었는지를 주석으로 남겼습니다. 다음 사람이 실수로 캐시를 붙이지 않도록.
위험도 개수를 화면에 박아 두던 값을 규칙 기반 계산으로 바꿨습니다. 데이터가 바뀌면 숫자도 따라가야 합니다.
여기 없는 것
분석과 예측 모델 쪽은 다른 팀원들이 맡았고, 제가 그 폴더를 만진 것은 임포트 정리 한 줄씩입니다. 이 페이지에 적은 것은 제가 만든 화면과 그때 내린 판단뿐입니다.