데이터 기반 로또 분석 시스템의 설계와 구현
역대 로또 추첨 데이터를 기반으로 통계적 패턴 분석과 AI 예측 모델을 결합한 서비스입니다. 9개 분석 모듈과 머신러닝 알고리즘을 활용하여 데이터 기반의 번호 분석 및 추천 시스템을 제공합니다.
확장 가능한 아키텍처 설계, 사용자 경험(UX) 고도화,성능 최적화, 모듈화를 통한 일관된 데이터 응답 구조 등 다양한 기술적 과제를 해결하며 지속적으로 개선하고 있습니다.
Tech Stack: Next.js 14 (App Router), TypeScript, PostgreSQL, Prisma ORM, Redis, SSE, NextAuth.js, Resend
최신 App Router 아키텍처로 SSR/CSR 하이브리드 렌더링 구현. 서버 컴포넌트로 초기 로딩 성능을 최적화하고, 클라이언트 컴포넌트로 인터랙티브한 UX 제공.
엄격한 타입 시스템으로 런타임 오류를 사전에 방지하고, 코드 자동완성과 리팩토링의 안정성 확보. 인터페이스 우선 설계로 타입 안전성 보장.
유틸리티 퍼스트 CSS로 일관된 디자인 시스템 구축. shadcn/ui 컴포넌트를 활용한 접근성 높은 UI 구현.
복잡한 통계 데이터를 직관적인 차트로 시각화. 반응형 차트 디자인으로 모바일 환경에서도 최적의 가독성 제공.
강력한 관계형 DB로 40,000+ 레코드의 패턴 데이터 관리. Prisma의 타입 안전한 쿼리 빌더로 복잡한 집계 연산을 안정적으로 처리.
RESTful API 설계로 프론트엔드와 백엔드 분리. 17개 분석 API 엔드포인트를 체계적으로 구성하고 일관된 응답 구조 적용.
프로덕션: Supabase PostgreSQL로 안정적인 클라우드 DB 운영.개발환경: 로컬 PostgreSQL 17 구축으로 제약 없는 실험 환경 확보.
Supabase의 사용 제한(API 호출 제한, 연결 풀 제약)을 고려하여 로컬 환경을 별도 구성. 1,000개 이상의 가중치 조합 테스트, 대량 데이터 페이지네이션 실험, 성능 프리셋 최적화 등을 로컬에서 자유롭게 수행하여 개발 효율성을 극대화.
MongoDB Atlas: Mongoose ODM으로 버려진 당첨조합 로그 데이터 구조화 저장. 사용자별/회차별 집계 파이프라인 구현.Winston Logger: 환경별(개발/프로덕션) 로그 레벨 관리, 회차별 파일 로깅.
듀얼 로깅: LOG_TARGET 환경변수로 파일/MongoDB/둘 다 전략 선택. KST 타임스탬프 적용, 비동기 처리로 API 응답 지연 최소화.
Redis: 이메일 인증 코드 임시 저장 (6자리 OTP, 10분 TTL).Resend: 이메일 발송 서비스.
Redis 선택 이유: PostgreSQL에 인증 코드 저장 시 만료된 레코드 관리(배치 삭제)와 빈번한 조회/삭제로 인한 DB 부하 발생. Redis의 TTL 기능으로 자동 만료 처리와 인메모리 고속 접근 구현.
Resend 선택 이유: 로컬 개발 환경에서는 Nodemailer로 이메일 발송 구현. Vercel 프로덕션 배포 시 SMTP 포트(587, 465) 허용 불가 문제 발생. Resend는 HTTP API 기반으로 포트 제한 없이 안정적 작동. 전송 상태 추적과 템플릿 관리 용이. Singleton 패턴으로 연결 효율적 관리. 개발환경(로컬 Redis), 프로덕션(Upstash Redis)으로 환경별 유연한 설정 적용.
Server-Sent Events: HTTP 기반 단방향 실시간 스트리밍으로 WebSocket보다 가벼운 연결 유지.globalThis 활용: API 라우트 간 SSE 연결 공유로 서버리스 환경 호환성 확보.
PostgreSQL Enum: NotificationType으로 알림 유형 타입 안전성 보장.NotificationContext: React Context API로 알림 상태 전역 관리 및 실시간 UI 업데이트.
소셜 로그인: Google OAuth 2.0 연동으로 간편 회원가입/로그인 구현.세션 전략: JWT 기반으로 서버리스 환경 최적화 (DB 쿼리 없이 토큰만으로 인증).
Prisma Adapter: 사용자 정보 및 OAuth 계정 연동 데이터를 PostgreSQL에 저장. 커스텀 어댑터로 Google 프로필의 name을 nickname으로 자동 변환하여 중복 방지.역할 기반 접근 제어: FREE, PREMIUM, ADMIN 등급별 권한을 JWT 토큰에 포함하여 관리.
JavaScript 표준 Math 객체와 커스텀 함수로 구현한 통계 연산. 표준편차, 분산, 상관관계 등 고급 통계 계산을 직접 구현.
LSTM, Transformer, XGBoost 등 ML 알고리즘 개념을 JavaScript로 구현. 통계 기반 패턴 분석과 가중치 앙상블로 번호 예측 제공.
초기에는 Supabase SDK를 사용했으나, 타입 안전성과 복잡한 쿼리 처리의 한계를 경험했습니다.
초기에는 각 분석 기능을 독립적으로 빠르게 구현하다 보니, 9개 분석 모듈이 서로 다른 구조와 네이밍 규칙을 갖게 되었습니다. 같은 데이터를 요청해도 호출 위치에 따라 응답 형식이 달랐고, 이는 프론트엔드 개발 시 혼란을 야기했습니다. 이 문제를 해결하기 위해 전체 모듈을 리팩토링하는 과정에서 모듈화 설계와 일관된 인터페이스 설계의 중요성을 체득했습니다.
초기 로딩 속도와 SEO, 그리고 인터랙티브한 UX를 모두 만족시켜야 했습니다.
상황: Supabase의 1,000개 행 제한으로 인한 데이터 누락 발생
접근: range() 메서드와 while 루프를 활용한 배치 처리 구현
학습: 외부 서비스의 제약사항을 사전에 파악하고 대응하는 것의 중요성
상황: Record<string, unknown> 남용으로 런타임 오류 빈발
접근: Prisma 스키마와 동기화된 명시적 인터페이스 정의, 타입 가드 함수 구현
학습: 초기 타입 설계에 시간을 투자하면 장기적으로 개발 속도가 빨라짐
상황: useEffect 의존성 배열 관리 미흡으로 무한 렌더링 발생
접근: 의존성 배열 최소화, useCallback/useMemo 활용, ESLint 규칙 강화
학습: React의 동작 원리를 깊이 이해하고 성능 최적화 기법 습득
React.memo로 불필요한 리렌더링 방지Promise.allSettled()로 에러 격리 및 안정성 향상WeightConfigPanel: 9개 분석 모듈 가중치 설정 UI를 여러 페이지에서 재사용LottoNumber: 번호 구간별 자동 색상 적용으로 일관된 번호 표시ConstraintsPanel: 13가지 동적 제약 조건 설정 인터페이스 통합9개 독립 분석 모듈(번호대, 유형, 끝자리, 열, 특징수, 최근출현, 주기성, 트렌드, 출현빈도)의 결과를 가중치 기반으로 통합. 룰렛 휠 알고리즘으로 확률적 번호 선택을 구현하여 현실적인 예측 결과 제공.
1,000개 이상의 가중치 조합을 자동으로 테스트하여 최적의 프리셋 발견. 백테스트 시스템으로 과거 데이터 기반 정확도를 검증하고 사용자에게 신뢰도 제공.
선택한 회차 이전 데이터만 사용하여 예측 정확도를 검증하는 시스템. 핵심 8개 번호 적중률과 10게임 생성 결과를 시각적으로 비교하여 예측 성능을 투명하게 공개.
유사 사례 기반 확률 계산 시스템으로 연속 출현 패턴(40%), 유사 패턴(35%), 임계값 도달(25%)을 종합하여 번호대, 유형, 끝자리, 열 분석에 적용.
제약조건으로 버려졌지만 실제 당첨된 조합을 MongoDB에 기록하여 추적. "어떤 제약조건이 당첨 조합을 버리게 만드는가" 데이터 기반 분석으로 동적 가중치 조정 알고리즘 개선에 활용.
이 프로젝트를 통해 Full-Stack 개발의 전 과정을 경험했습니다. 단순히 코드를 작성하는 것을 넘어, 시스템 아키텍처 설계, 데이터베이스 최적화, 사용자 경험 개선, 성능 튜닝까지 전반적인 개발 프로세스를 깊이 있게 다뤘습니다.
특히 문제 해결 과정에서 많은 것을 배웠습니다. Supabase의 페이지네이션 제한, TypeScript 타입 시스템의 복잡성, React의 렌더링 최적화 등 실무에서 마주칠 수 있는 다양한 도전 과제들을 직접 해결하며 성장할 수 있었습니다.
또한 사용자 관점의 사고를 실제 프로젝트에 적용하는 경험이 되었습니다. 단순히 기능을 구현하는 것이 아니라, 사용자가 직관적으로 이해하고 편리하게 사용할 수 있는 인터페이스를 설계하는 것의 중요성을 다시 한번 확인할 수 있었습니다.
TensorFlow.js를 활용한 딥러닝 모델 구축으로 패턴 인식 정확도 향상
동행복권 API 연동으로 최신 당첨 번호 자동 업데이트 시스템 구축
당첨 결과 공유 기능(카카오톡, 클립보드)을 제공하고 있으며, 사용자 커뮤니티, 당첨 후기, 랭킹 시스템으로 확장 예정
다양한 알고리즘과 가중치 조합의 실제 성능을 지속적으로 검증