Myeongri Seojae
PRODUCT10년 단위 대운을 타임라인으로 보여주는 명리 서비스
- 기간
- 2026.08 ~ 2026.09
- 역할
- 기획 · 구현 · 검증 단독
- 사용 기술
- React · TypeScript · Playwright · golden test
개요
생년월일을 입력하면 사주 원국과 10년 단위 대운, 연도별 세운을 하나의 타임라인으로 보여주는 웹 앱입니다.
대운 시작 시점이 어긋나면 이후 구간 전체가 달라지므로, 해석 문구보다 시간 보정과 계산 결과의 재현성을 우선했습니다.
문제와 해결
- 01
시대별 한국 표준시 보정
한국은 표준자오선과 서머타임 시행 이력이 여러 차례 바뀌어 고정 보정값만으로는 경계 시각을 안정적으로 계산하기 어렵습니다.
입력 시각을
Asia/Seoul기준 UTC로 변환한 뒤 경도 보정을 적용해, 역사적 오프셋은 IANA tzdata가 담당하도록 계산 경로를 단순화했습니다. - 02
계산 결과 교차 검증
외부 라이브러리의 결과가 같아도 같은 계산 전제를 공유한다면 함께 틀릴 수 있습니다.
절기 3,624개를 천체력과 대조하고 일주 73,414일을 전수 확인했습니다. 경계 연도와 과거 오류 사례는 골든 데이터로 저장해 변경 전후 결과를 비교합니다.
- 03
민감한 입력값 보호
생년월일과 출생 시각은 서버 API로 보내지 않고 브라우저에서 계산합니다.
공유 URL에는 원본 입력 대신 필요한 범위만 인코딩하고, Sentry 전송 전 개인정보 필드를 제거했습니다. 외부 웹폰트도 자체 호스팅으로 전환했습니다.
- 04
초기 계산 번들 경량화
절기표와 해석 데이터를 진입 번들에 모두 넣으면 사용자가 입력 화면을 보기 전부터 큰 스크립트를 내려받습니다.
계산 엔진을 동적으로 불러오고 절기 4,824개를 델타·36진수로 압축했습니다. 진입 청크에는 250KB 예산을 두고 CI에서 확인합니다.
- 05
계산 실패 상태 분리
계산 도중 예외가 발생하면 UI는 어느 단계가 실패했는지 구분하기 어렵고, 앞 단계의 결과가 정상처럼 남을 수 있습니다.
각 계산 단계가 성공 또는 원인이 포함된 오류를 반환하도록 계약을 통일하고, 입력 오류·지원 범위·링크 손상·엔진 로딩 실패를 서로 다른 안내로 연결했습니다.
주요 구현
- 대운 인생 타임라인 — 10년 단위로 펼친 대운과 그 안의 세운
- tzdata 기반 진태양시 변환 — 시대 분기 없는 단일 경로
- 대운수 천체력 대조 검증 (golden test)
- 계산 근거를 함께 싣는 리포트 — 결과만 던지지 않는 구성
- 신살 표현 완화 — 겁주는 문구 배제
- Playwright E2E + 골든 데이터 회귀 검사
회고
하나의 정답을 정하기 어려운 계산 도메인에서는 구현만큼 계산 전제를 공개하고 독립된 자료와 대조하는 과정이 중요했습니다.