사주알다 · 직접 세워보며 배우는 명리학

작품 설명
사주를 봐 주는 앱이 아니라, 명리학을 한자와 용어부터 단계적으로 배우고 사주를 직접 세워 보는 학습 앱입니다. 홈·학습·탐구·사전·나 5개 탭으로 구성했고, 절기·간지·십신·강약·용신·대운을 계산하는 사주 엔진과 문제 생성기, 33장짜리 인앱 매뉴얼까지 Claude Code를 활용해 혼자 기획·개발했습니다. 모든 정답은 손으로 쓰지 않고 지식 테이블과 결정적 계산 엔진에서 만들고, 그 과정을 vitest 테스트로 고정했습니다.
기획 의도
명리학은 공부하려고 하면 처음부터 낯선 한자와 용어가 한꺼번에 쏟아지고, 사주 하나를 세우는 데도 절기·간지 계산이 얽혀 있어 어디서부터 이해해야 할지 막막했습니다. 제가 더 쉽고 재미있게 공부하고 싶어서 직접 만들었습니다. 그래서 한자와 용어부터 레벨을 나눠 하루 몇 분씩 짧게 끊어 배우게 했고, 만세력이 표로 감춰 둔 계산은 실제 숫자(절입 시각·태양 황경·율리우스일)로 되짚어 보여 줍니다. 기둥을 하나씩 직접 세워 보며 틀린 지점을 해설로 짚어 주는 것도 외우는 대신 손으로 풀어 보며 익히기 위해서입니다.
주요 기능
레벨별 학습 커리큘럼
∙
한자·음양·오행에서 십신·통근·용신까지 레벨 0~5, 개념마다 설명 → 예시 → 문제 3~5개로 이어지는 짧은 학습 단위
∙
홈에 오늘의 학습·오늘의 5문제·오답 복습을 모아 하루 3~7분 분량으로 끊어 줌
∙
간격 반복(SRS) 복습과 숙련도 추적, 레벨 평가 20문항으로 다음 레벨 해제




진단으로 시작 레벨 추천
∙
난이도가 올라가는 7문제로 측정하고, 정답률이 확실하면 측정 레벨을 그대로 추천
∙
자가진단은 참고값으로만 쓰고 정답률이 흔들릴 때만 상한으로 작동 — "조금 알아요"를 고르고 전부 맞혀도 Level 0에 묶이지 않음


직접 세워보기
∙
출생 시각을 주고 연·월·일·시주를 한 기둥씩 고르게 하는 연습장. 기본·절입 경계·입춘 경계·자시 경계 네 종류를 섞어 냄
∙
정답은 엔진이 내고, 해설은 60갑자 나머지 계산·오호둔 표·율리우스일 같은 실제 숫자로 보여 줌
∙
오답 보기는 "앞뒤 해, 오호둔 표 한 줄 잘못 읽기, 야자시를 당일 일간으로 세우기"처럼 실제로 자주 하는 실수에서 만듦



풀이 과정 — 이 사주는 이렇게 세웠어요
∙
표준시 → 절기 → 연·월·일·시주 순서로 계산 단계를 카드로 펼쳐, 만세력이 생략한 중간값을 그대로 보여 줌
∙
진태양시 보정을 켜면 경도 보정과 균시차 단계가 끼어들고, 단계 번호와 참조가 함께 바뀜
∙
각 단계가 가리키는 개념으로 바로 이동해 모르는 용어를 그 자리에서 배울 수 있음


사주 읽기 가이드
∙
원국 표에서 글자를 누르면 뜻과 관계가 열리고, "이 화면 읽는 순서" 가이드가 자리마다 데려다 주며 짚어 줌
∙
일간 강약은 월령·통근·세력 점수의 근거를 문장으로 적고, 용신은 억부·조후·통관 세 관점을 따로 이름 붙여 보여 줌(학파에 따라 다름을 명시)
∙
합·충·형·파·해 관계, 신살·귀인, 대운·세운·월운·일운을 한 화면에서 위에서 아래로 좁혀 읽게 배치



오늘 날짜로 간지 읽기
∙
오늘 날짜의 간지와 절기를 읽는 연습 화면. 운세가 아니라는 점을 화면에 적어 둠
∙
같은 날짜 기준으로 오늘의 개념·단어·연습용 사주를 묶고, iOS 위젯(WidgetKit)에도 같은 스냅샷을 발행

홈 화면 위젯
∙
SwiftUI WidgetKit 확장으로 소형·중형 두 크기 지원. 소형은 오늘의 간지·절기와 오늘의 5문제, 중형은 오늘의 단어(한자·한글·뜻)와 레벨·연속 학습일까지 표시
∙
위젯은 네트워크를 쓰지 않고, 앱이 App Group에 써 둔 오늘 스냅샷만 읽음. 자정이 지나면 다음 날 내용으로 다시 그림

인앱 매뉴얼 33장
∙
명리학 이론을 책처럼 읽는 매뉴얼. 부(部)별 목차와 "이어 읽기", 17pt 조판, 표와 도해 포함
∙
챕터 하단의 블러 내비바로 앞뒤 장을 넘기고, 본문 안의 용어를 누르면 사전으로 연결
∙
마크다운 원고를 빌드 스크립트로 시드 데이터에 넣어 앱 배포 없이 콘텐츠만 갱신(OTA)



사전과 통합 검색
∙
개념·용어·한자·학습용 사주·문제를 한 검색창에서 찾고, 개념 상세에는 추천 선행 학습을 체크리스트로 보여 줌
∙
북마크·단어장·오답 노트로 다시 볼 것을 모아 둠


사주 계산 엔진
절기와 음력을 표 없이 계산
∙
astronomy-engine(VSOP87)의 겉보기 태양 황경을 이분법으로 풀어 24절기 절입 순간을 계산. 2024년 12개 절입이 한국천문연구원 발표값과 날짜는 모두 같고 시각은 ±1분 이내
∙
음력은 변환표 없이 합삭과 중기로 직접 계산. 시헌력 규칙대로 동지 든 달을 11월로 두고, 13개월인 해는 중기 없는 첫 달을 윤달로 잡으며, 날짜 경계는 한국 표준시로 판정
∙
음력 변환 결과는 설날·추석·윤달 기준값과 일치하는지 테스트로 고정
출생 시각 보정
∙
한국 표준시 이력 반영 — 1908년 4월 이전 서울 지방평균시, 1908~11·1954~61년 UTC+8:30, 1948~51·1955~60·1987~88년 서머타임
∙
진태양시 = 경도항 + 균시차. 균시차는 항성시와 태양 적경의 차이로 정의대로 구하고 11월 3일 +16.4분, 2월 11일 −14.2분 기준값으로 검증
∙
기준 자오선은 그 시각의 표준시에서 구함(UTC+8:30은 127.5°, 서머타임 UTC+10은 150°). 보정은 날과 시진 판정에만 쓰고, 절입은 실제 출생 순간으로 판정
네 기둥과 경계 처리
∙
연주는 입춘(태양 황경 315°), 월주는 절입과 오호둔, 일주는 율리우스일수, 시주는 오서둔으로 세움. 1984년 甲子년, 2000년 1월 1일 戊午일 같은 기준값으로 검증
∙
23시대는 야자시 — 일주는 당일, 시간(時干)은 다음 날 일간으로 세워 시주가 60갑자 순서로 이어짐
∙
절입 ±120분, 시각을 모르는 절입일, 자정 30분 안쪽, 23시대, 시진 경계 10분 안쪽은 경고로 돌려주고 화면에 반드시 표시
근거를 함께 내는 원국 분석
∙
오행 세력은 천간 1.0, 지지 1.2, 지장간은 분포 일수에 비례해 더하고 월주는 1.5배로 계산. 점수마다 어느 글자에서 왔는지 남기고, 글자 수와 세력을 따로 보여 줌
∙
일간 강약은 돕는 기운의 비율에 월령과 통근을 반영해 5단계로 판정하고 근거 문장을 함께 냄
∙
용신은 억부·조후(궁통보감 표)·통관을 하나로 합치지 않고 따로 이름 붙여 냄
∙
격국은 월지 지장간의 투출을 정기 > 중기 > 여기 순으로 보는 자평진전 순서를 따름. 종격은 세력 45% 이상 같은 보수적 기준으로만 인정하고 내격 이름도 함께 냄
대운에서 일운까지
∙
대운은 연간의 음양과 성별로 순행·역행을 정하고, 절입까지 일수를 3으로 나눠 대운수를 구함
∙
월운은 양력 1일이 아니라 실제 절입 순간으로 달을 자르고, 일운은 율리우스일수로 끊김 없이 이어 감
∙
운 해석은 사건을 예측하지 않음. 운이 들어올 때 오행 비율 변화, 용신·기신 역할, 원국과의 합·충, 강약이 움직이는 방향만 계산
풀이 과정과 문제까지 같은 엔진
∙
엔진은 UI·DB·네트워크에 의존하지 않는 순수 함수로 작성해 같은 입력이면 항상 같은 결과가 나오고, 결과에 계산 버전을 붙임
∙
풀이 과정의 각 기둥 결론이 엔진 결과와 같은 글자인지 테스트가 매번 확인 — 규칙을 바꾸면 설명 문장도 함께 고쳐야 통과
∙
문제 은행도 같은 엔진에서 생성해 손으로 쓴 정답이 없음
데이터 경계와 운영
사람 정보는 기기 안에만
∙
이름·생년월일시·출생지는 로컬 SQLite 전용으로 두고 자동 업로드하지 않음
∙
학습 데이터(진도·오답·숙련도)는 로컬에 먼저 쓰고 아웃박스로 Supabase에 동기화(RLS로 본인만)
∙
지식 콘텐츠는 Supabase에서 받아 캐시하고 실패하면 번들 시드로 폴백 — 오프라인에서도 전부 동작
검증 게이트와 빌드
∙
typecheck · lint · vitest · iOS 번들 export를 GitHub Actions에서 돌림
∙
EAS 없이 prebuild → xcodebuild로 아카이브하고 App Store Connect API로 TestFlight 업로드하는 스크립트 작성
∙
Xcode 26.3에서 깨지는 네이티브 모듈은 patch-package로 고정
Claude Code로 개발한 방식
앱 안에 AI 기능은 넣지 않았고, 코드·콘텐츠·리뷰·QA까지 개발 과정에 Claude Code를 활용했습니다. 명리학은 틀린 답이 곧바로 틀린 학습이 되므로, AI가 만든 결과를 믿는 대신 기계가 판정하는 구조를 먼저 세웠습니다.
규칙은 문서로, 판정은 기계로
∙
불변 규칙과 엔진 검증 기준값(일주 기준일, 절입 오차, 음력·균시차 기준값)을 CLAUDE.md에 적어 에이전트가 세션마다 같은 기준으로 작업하게 함
∙
완료 여부는 AI의 답변이 아니라 typecheck · lint · vitest · iOS 번들 export 결과로 판정
∙
AI가 정답을 직접 쓰지 못하도록 문제 은행은 지식 테이블과 계산 엔진에서 생성
AI로 리뷰하고 재현한 것만 고침
∙
에이전트로 저장소 전체를 리뷰하고, 코드를 읽거나 스크립트로 재현해 확인한 문제만 기록 — 23시대 시주 순서, 대운이 한 해 일찍 바뀌는 문제, 학습용 사주 14개 중 4개가 불가능한 사주였던 문제를 고침
∙
포트폴리오에 엔진을 정리하려고 코드를 다시 읽다가 표준시가 달랐던 시기의 진태양시가 30~60분 어긋나는 버그를 발견. 실패하는 테스트를 먼저 쓰고 수정
∙
수정한 diff는 맥락을 모르는 새 리뷰 에이전트에게 다시 맡김 — 연초 출생의 대운 시작 연도 오류를 이 단계에서 찾음
콘텐츠와 QA
∙
33장 매뉴얼 원고를 Claude로 쓰고 장마다 참고 자료를 붙임. 장 번호, 이미지 참조, 한자 풀이 형식은 테스트로 검사
∙
시나리오 문서를 만들어 iOS 시뮬레이터에서 화면 흐름을 점검하고 결과를 기록 — 사람 사주 상세에 풀이 과정 카드가 빠진 문제를 이 단계에서 찾음