TRENDSHIFT #14 · 2026-06-08

ziwei-doushu 딥다이브
— 동양 점성술 "자미두수"를 코드로 푼 오픈소스 엔진

ziwei-doushu는 천 년 묵은 동양 점성술 자미두수(紫微斗數)의 계산 규칙을 통째로 TypeScript 코드와 데이터로 옮긴 Next.js 웹 엔진입니다. 생년월일시를 넣으면 12궁(宮)에 별을 배치한 "명반(命盤)"을 그려주고, 41종의 격국(格局)을 고전 출처와 함께 자동 판정합니다. 진짜 배울 거리는 점술이 아니라 — 모호한 전통 지식을 타입 시스템·룩업 테이블·규칙 엔진으로 정형화하는 방법입니다. (Renhuai123/ziwei-doushu · Next.js 15 + React 19 · TypeScript ~13,100줄 · MIT)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트
  7. 하드웨어/시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

한 문장으로 — 이게 뭐 하는 물건인가

"생년월일시를 입력하면, 자미두수 점성술의 명반을 자동으로 그리고 길흉 격국까지 판정해 주는 웹 계산 엔진"입니다. 점술 그 자체보다도, 천문 계산 + 규칙 기반 패턴 인식 + 지식 베이스가 하나로 묶인 도메인 엔진의 구조가 학습 가치의 핵심입니다. 별점 앱이 아니라 "규칙이 복잡한 도메인을 코드로 모델링하는 법"의 교본으로 읽으세요.

핵심 비유

세무 신고 소프트웨어와 똑같은 구조다

자미두수는 겉보기엔 신비롭지만, 실제로는 "입력값(생년월일시) → 규칙표 룩업 → 결과 배치 → 패턴 판정"의 결정론적 계산입니다. 세금 계산 소프트웨어가 소득을 넣으면 세법 조항을 적용해 세액을 뱉어내는 것과 똑같습니다.

이 레포는 그 "세법"에 해당하는 천간·지지 룩업 테이블, 사화(四化) 변환표, 격국 판정 규칙 41종을 전부 TypeScript로 박아 넣었습니다. 점성술을 믿든 안 믿든, "모호한 인간 지식을 어떻게 결정론적 코드로 굳히는가"를 보여주는 살아있는 사례입니다.

용어
자미두수 (紫微斗數, Zi Wei Dou Shu)
중국 송나라에서 비롯됐다는 동양 점성술. 사람의 생년월일시를 12개의 "궁(宮)"에 14개 주성(主星)과 보조성을 배치해 운명을 읽습니다. 서양 점성술의 황도 12궁과 비슷하지만, 천체 위치가 아니라 천간·지지(60갑자) 기반의 규칙 계산으로 별을 배치한다는 점이 다릅니다. 그래서 컴퓨터로 정확히 재현 가능합니다.
용어
명반 (命盤, chart)
자미두수의 결과물. 12궁 격자에 별들이 배치된 "운명의 지도"입니다. 이 레포에서는 ZiweiChart라는 타입으로 정의된 JSON 데이터 구조이며, 12개의 Palace 객체와 각 궁의 Star[] 배열로 표현됩니다.

2왜 주목받는가

트렌딩에 오른 이유와 비슷한 프로젝트 대비 차별점

① "닫힌 전통 지식"을 통째로 MIT 라이선스로 열었다

자미두수는 보통 비싼 강의나 폐쇄적인 유료 앱으로만 접할 수 있었습니다. 이 레포는 배치 알고리즘 · 사화 시스템 · 1,100줄짜리 격국 지식 베이스 · 고전 원문 데이터를 전부 코드로 공개했습니다. README는 한발 더 나아가 51만 8,400개의 명반 샘플 데이터셋(5.5GB)까지 GitHub Releases로 풀었습니다 — 소형 모델 파인튜닝·RAG 검색 소스로 쓰라는 의도입니다.

용어
51만 8,400개 데이터셋의 정체
연(60갑자) × 월(12) × 일(30) × 시(12) × 성별(2) = 518,400. 즉 가능한 모든 생년월일시 조합의 명반을 미리 다 계산해 둔 것입니다. 각 샘플은 명반 JSON + 13개 주제(명격·재운·사업·감정·건강…)의 해석 텍스트로 구성. 이것이 "결정론적 계산 엔진"이기에 전수 생성이 가능합니다.

② AI 시대의 "도메인 지식 공급원"이라는 포지셔닝

이 프로젝트의 진짜 노림수는 점술 앱이 아니라 LLM에게 먹일 정형 지식입니다. README는 "AI 해석 프롬프트와 백엔드 API는 일부러 뺐으니, 공개된 지식 베이스를 근거로 /api/interpret를 직접 만들어 아무 LLM에나 붙이라"고 안내합니다. 격국 판정(코드) + 고전 원문(데이터) + 51만 샘플(파인튜닝) = 전통 점술을 위한 RAG/파인튜닝 풀스택 재료를 한 레포에 담은 셈입니다.

③ "유파 분쟁"을 코드 주석으로 못 박은 고집

자미두수에는 여러 유파가 있는데, 이 레포는 倪海厦(니하이샤)의 정통 노선을 따르며 "비성파(飛星派)"를 명시적으로 거부합니다. 코드 곳곳에 "사화성은 영원히 고정, 움직이지 않는다(四化星永遠固定不動)"는 주석이 박혀 있고, 비성파의 핵심 기법인 "궁간자화(宮干自化)"는 함수로 구현은 해놓되 배치 과정에서 일부러 비활성화했습니다. 학술적 입장을 코드 설계로 표현한 흔치 않은 사례입니다.

비슷한 선택지와의 비교

ziwei-doushuiztro (라이브러리)유료 점술 앱맨몸 LLM에 질문
명반 계산iztro 래핑핵심 기능있음(블랙박스)부정확
격국 자동 판정41종 + 출처없음일부환각 위험
고전 원문 데이터3대 고서 내장없음없음없음
학습용 코드 공개MIT 전체MIT 전체폐쇄해당 없음
AI 학습 데이터51만 샘플 제공없음없음해당 없음
솔직하게 짚을 점
이 레포는 "그대로 돌아가는 완성 앱"이 아니다

중요한 한계를 분명히 해둡니다. 일부러 불완전한 스냅샷으로 공개됐습니다. 백엔드 API(/api/interpret 등)와 인증·결제 관련 코드가 빠져 있습니다. 반면 UI 컴포넌트(ChartBoard·InsightPanel 등)와 lib/ziwei/db-analysis.ts(stub)는 포함돼 있어 npm installnpm run dev로 프런트는 실행됩니다. npm run build는 미완성 API import 때문에 실패할 수 있습니다.

따라서 이 레포의 가치는 "실행"이 아니라 읽고 배우는 데 있습니다 — 핵심 알고리즘·지식 라이브러리(lib/)는 온전하며, 그게 본체입니다. 커밋 이력이 소수(초기 공개 기준 12개, 대부분 README·문서 수정)이며 코드 자체는 단일 스냅샷으로 공개된 점을 감안하세요.

3기술 스택 전체 지도

웹앱 껍데기 + 도메인 라이브러리 + 지식 데이터의 3중 구조

이 레포는 평범한 Next.js 앱처럼 보이지만, 무게중심은 화면(프론트)이 아니라 lib/ 아래의 순수 함수·데이터에 있습니다. 계층별로 끊어 보면 이렇게 됩니다.

계층구성 요소기술 / 버전역할
프레임워크Next.js App Routernext ^15.5.15페이지 라우팅·SSR·SEO. README엔 "14"라 적혔으나 실제 핀은 15
UIReact + Tailwind + Framer Motionreact ^19.2.5 / tailwind ^3.4 / framer-motion ^11.3명반 보드·랜딩 애니메이션·반응형
언어TypeScripttypescript ^5도메인 타입(ZiweiChart, Palace, Pattern) 정의
점성 코어 ★iztroiztro ^2.5.8실제 명반 계산 엔진. 이 레포는 이걸 래핑
역법 변환lunar-javascriptlunar-javascript ^1.7.3양력↔음력 변환, 간지(干支) 산출
지식(본체)lib/ziwei/, lib/classics/, lib/nihai/순수 TS 데이터·함수격국 규칙·사화표·고전 원문·니하이샤 三紀 전집
AI(미사용)@anthropic-ai/sdk^0.27.0OSS엔 미사용. .env 기본값은 DeepSeek
인프라(닫힘)pg / ioredis / Vercel·Cloudflarepg ^8.20 / ioredis ^5.10Postgres·Redis·배포. 백엔드는 비공개
공유/내보내기html2canvas^1.4.1명반을 이미지로 캡처해 공유
비유

자동차에 비유하면 — 엔진(명반 계산)은 iztro라는 기성품을 사 왔습니다. 이 레포가 직접 만든 건 그 위에 얹은 계기판과 내비게이션(타입 모델 + 격국 판정 + 고전 지식 DB)입니다. "엔진을 직접 안 만들었다"가 약점이 아니라, 검증된 엔진 위에서 도메인 가치(해석·판정·지식)에 집중한 합리적 설계입니다.

용어
iztro / lunar-javascript
iztro: 오픈소스 자미두수 명반 계산 라이브러리. astro.bySolar('2000-1-1', 시, '남', ...) 한 줄로 12궁·별 배치를 계산합니다. lunar-javascript: 양력 날짜를 음력·간지(천간지지)로 바꾸는 역법 엔진. 자미두수는 음력·간지 기반이라 이 변환이 필수입니다.

4아키텍처 심화 분석

"입력 → 변환 → 배치 → 판정 → 해석"의 파이프라인

전체 동작 흐름

사용자 입력: 생년월일시 + 성별 (+ 출생도시 → 진태양시 보정) │ ▼ ┌─ 역법 계층 ──────────────────────────────────────────────┐ │ lunar-javascript : 양력 → 음력 + 간지(干支) │ │ lib/ziwei/cities.ts : 도시 경도로 진태양시(眞太陽時) 보정 │ └──────────────┬───────────────────────────────────────────┘ ▼ ┌─ 계산 계층 (lib/ziwei/algorithm.ts) ─────────────────────┐ │ iztro.astro.bySolar(...) 호출 → 12궁 + 별 배치 raw │ │ generateChart() 가 raw 를 타입드 ZiweiChart 로 매핑 │ │ · mapStarType() 별 분류: major/minor/lucky/sha │ │ · mapBrightness() 묘旺 → bright / 함陷 → dim │ │ · 五行局·命宮·身宮·紫微 위치 계산 │ │ · 大限(10년 운) 범위 + 借對宮(빈 궁 빌려오기) │ └──────────────┬───────────────────────────────────────────┘ ▼ ┌─ 변환 계층 (lib/ziwei/sihua.ts + constants.ts) ──────────┐ │ SI_HUA_TABLE : 천간 10개 → [化祿,化權,化科,化忌] │ │ 본명/대한/유년/유월 4겹 사화 오버레이 합성 │ │ (비성파 기법 detectSelfSihua 는 구현돼 있으나 배치엔 미적용)│ └──────────────┬───────────────────────────────────────────┘ ▼ ┌─ 판정 계층 (lib/ziwei/patterns.ts · 1118줄) ─────────────┐ │ detectPatterns(chart) : 41종 격국 판정 디스패처 │ │ 각 격국 = 必須 + 加分 + 破格 3겹 조건 + 古書 출처 │ │ 삼방사정·협궁·대궁 기하 계산으로 별 조합 검사 │ └──────────────┬───────────────────────────────────────────┘ ▼ ┌─ 지식/해석 계층 ─────────────────────────────────────────┐ │ lib/classics/ : 3대 고서 원문 + 전문(full-text) 검색 │ │ lib/nihai/ : 니하이샤 三紀 전집(천기·인기·지기) │ │ /api/interpret : ★비공개★ — 직접 만들어 LLM에 연결 │ └──────────────────────────────────────────────────────────┘

설계 패턴 ① "외부 엔진 래핑 + 자체 타입 모델" (Anti-Corruption Layer)

핵심 함수 generateChart()는 점성 계산을 직접 하지 않고 iztro에 위임한 뒤, iztro의 출력을 이 프로젝트만의 타입 ZiweiChart로 다시 매핑합니다. 외부 라이브러리의 데이터 모양에 앱 전체가 종속되지 않도록 "번역 막(膜)"을 한 겹 둔 것입니다. DDD에서 말하는 부패 방지 계층(Anti-Corruption Layer)의 교과서적 예시입니다.

// lib/ziwei/algorithm.ts (요지)
const astrolabe = astro.bySolar(`${y}-${m}-${d}`, hour, gender, true, 'zh-CN');
const palaces = astrolabe.palaces.map(p => ({
  name: p.name,                              // 命宮·財帛·官祿…
  branch: p.earthlyBranch,
  stars: [...p.majorStars, ...p.minorStars, ...p.adjectiveStars]
           .map(s => ({ name:s.name, type: mapStarType(s),
                        brightness: mapBrightness(s.brightness) })),
}));
// → 외부 iztro 모델을 우리 ZiweiChart 타입으로 격리 변환

설계 패턴 ② 데이터 주도 룩업 테이블 (Table-Driven)

자미두수 규칙은 if-else 지옥이 되기 쉽습니다. 이 레포는 대신 규칙을 데이터(배열·맵)로 표현합니다. 대표가 사화표입니다 — 천간 10개 각각에 대해 [녹·권·과·기] 4개 별을 매핑한 2차원 표 하나로, 수십 줄의 분기를 인덱싱 한 번으로 대체합니다.

// lib/ziwei/constants.ts — 四化表 (일부)
export const SI_HUA_TABLE = {
  甲: ['廉貞','破軍','武曲','太陽'],   // [化祿, 化權, 化科, 化忌]
  庚: ['太陽','武曲','太陰','天同'],
  // … 천간 10개 전부
};
// 연도 → 천간 인덱스 : 결정론적 산식
const getYearStemIndex = (year) => (((year - 4) % 10) + 10) % 10;
왜 이게 중요한가

전통 지식은 보통 "갑년에는 염정이 녹이 되고…"처럼 표(table)로 전승됩니다. 그 표를 그대로 코드의 표로 옮기면, 원전과 코드를 1:1로 대조 검증할 수 있고 버그도 줄어듭니다. "전문가가 읽는 표 ≈ 프로그램이 읽는 표"가 되도록 만든 게 이 설계의 묘미입니다.

설계 패턴 ③ 규칙 엔진 + 디스패처 (격국 판정)

가장 무거운 파일 patterns.ts(1,118줄)는 작은 규칙 엔진입니다. detectPatterns(chart) 하나가 detectJunChenQingHui()(군신경회), detectShaPoLang()(살파랑) 같은 독립된 판정 함수 41개를 차례로 호출합니다. 각 격국은 동일한 타입으로 표준화됩니다.

// 격국 타입 — 모든 패턴이 같은 모양
interface Pattern {
  name: string;
  level: 'excellent' | 'good' | 'neutral' | 'caution';  // 上格~惡格
  conditions: { required: ...; bonus: ...; breaking: ... }; // 必須/加分/破格
  source: string;   // 예: 《紫微斗數全書·君臣慶會格》 — 古書 출처 명시
}
// 기하 헬퍼 — 한 궁에서 三方四正 네 자리 계산
const sanFangSiZheng = (m) => [m, (m+4)%12, (m+8)%12, (m+6)%12];
배울 디테일
모든 판정에 "출처(source)"를 강제한다

각 격국 객체에 source 필드로 어느 고서 몇 장에서 나온 규칙인지를 박아둡니다. 이는 brooks-lint가 코드 진단마다 책을 인용하게 만든 것과 똑같은 발상 — "근거 없는 판정은 판정이 아니다"를 타입 차원에서 강제해, 점술의 자의성을 줄이고 검증 가능성을 높입니다.

핵심 데이터: 12궁과 14주성

개념코드 표현설명
12궁Palace[] (length 12)命宮·兄弟·夫妻·子女·財帛·疾厄·遷移·僕役·官祿·田宅·福德·父母
지지 인덱스(branch+6)%12 = 대궁맞은편 궁(對宮) 계산. +4·+8은 삼합(三合)
별 분류major/minor/lucky/shaSHA_STARS(擎羊·陀羅·火星·鈴星…) vs LUCKY_STARS(文昌·文曲·左輔…)
밝기bright / dim廟·旺 → 길하게 작용 / 陷·不 → 흉하게 작용
오행국水二·木三·金四·土五·火六대한(大限) 시작 나이를 정하는 기준

5디렉토리 구조 해부

화면(app/)은 껍데기, 두뇌(lib/)가 본체
ziwei-doushu/ ├── app/ # Next.js App Router (페이지) │ ├── page.tsx # 랜딩 (1197줄, framer-motion 별밤 인트로) │ ├── chart/page.tsx # ★ 명반 작업대 — 입력폼→보드→격국 패널 │ ├── heming/page.tsx # 합반(궁합) 페이지 │ ├── knowledge/[star]/[topic]/ # 백과·SEO 동적 페이지 │ ├── library/page.tsx # 고전 원문 리더/검색 │ ├── robots.ts / sitemap.ts # SEO 자동 생성 │ └── globals.css # Tailwind + CSS 변수 ├── lib/ # ★★ 진짜 본체 (순수 함수·데이터) ★★ │ ├── ziwei/ │ │ ├── algorithm.ts # generateChart() — iztro 래핑·매핑 │ │ ├── sihua.ts # 四化(녹권과기) 4겹 오버레이 로직 │ │ ├── patterns.ts # 격국 41종 판정 엔진 (1118줄) │ │ ├── constants.ts # 천간·지지·四化表·納音五行 룩업 │ │ ├── cities.ts # 도시 경도 → 진태양시 보정 (511줄) │ │ ├── heming-knowledge.ts # 합반 지식 (夫妻宮 14주성 해설) │ │ └── famous.ts # 유명인 명반 데모 데이터 │ ├── classics/ # 3대 고서 원문 (정적 TS 객체) │ │ ├── index.ts # getBookBySlug · searchClassics() │ │ └── data/{gusuifu,quanji,quanshu}.ts # 骨髓賦·全集·全書 │ ├── nihai/ # 니하이샤 三紀 전집 (~107KB) │ │ ├── tianji.ts # 天紀: 자미·역경·풍수 (548줄) │ │ ├── renji.ts # 人紀: 침구·경방 (659줄) │ │ └── diji.ts # 地紀 │ └── seo/knowledge.ts # 별×주제 → 182개 SEO URL 생성 ├── components/ # (일부 하위 폴더 미커밋 — 빌드 시 주의) ├── package.json # name: ziwei-master, private, v0.1.0 ├── .env.example # AI_PROVIDER=deepseek … └── LICENSE # MIT (Copyright 2026 紫微研究) ⚠ 비공개(의도적 제외): /api/* 백엔드 라우트 — AI 해석·인증·결제 관련. scripts/* → 현재 상태로는 build 실패 lib/ziwei/db-analysis.ts는 stub(빈 내용)으로 포함돼 있으며, UI 컴포넌트는 components/ 루트에 전체 포함.
구조 읽기 포인트

app/(화면)과 lib/(로직)가 칼같이 분리돼 있습니다. 페이지는 'use client'로 브라우저에서 generateChart()를 직접 부르고, 계산 로직은 화면을 전혀 모릅니다 — "두꺼운 도메인 라이브러리, 얇은 UI"입니다. 이 레포를 공부할 땐 app/은 건너뛰고 바로 lib/ziwei/부터 읽으세요. 거기에 90%의 배울 거리가 있습니다.

6학습 포인트

이 레포에서 무엇을 배워갈 수 있는가

① 도메인 모델링 — 모호한 지식을 타입으로 굳히기

이 레포의 최고 교본 가치입니다. "운명"처럼 막연한 개념을 ZiweiChart → Palace[] → Star[], Pattern{level, conditions, source}처럼 닫힌 타입 계층으로 표현했습니다. 점술이 아니라 법률·세무·보험·게임 룰처럼 "전문가만 아는 복잡한 규칙"을 코드로 옮길 때 그대로 응용할 수 있습니다.

실습 아이디어 — 여러분이 아는 규칙 복잡한 도메인(예: 보드게임 점수 계산, 등급 산정)을 하나 골라 patterns.ts처럼 "조건 + 출처"를 가진 판정 객체 배열로 모델링해 보세요.

② 테이블 주도 개발 (Table-Driven) 실전

constants.tsSI_HUA_TABLE, TIANKUI_TABLE, LUCUN_TABLE은 분기문을 데이터로 바꾸는 기법의 살아있는 예제입니다. 조건이 많을수록 코드가 아니라 표를 늘리는 방식이 왜 유지보수에 유리한지 체감할 수 있습니다. 원전(전문가의 표)과 코드(프로그램의 표)가 1:1 대응돼 검증도 쉽습니다.

③ 외부 라이브러리 격리 (Wrapper/ACL 패턴)

generateChart()가 iztro를 직접 노출하지 않고 자체 타입으로 번역하는 방식은, 실무에서 결제 SDK·지도 API·LLM SDK 같은 외부 의존성을 다룰 때 그대로 쓰는 패턴입니다. 외부 모델이 바뀌어도 번역 함수 한 곳만 고치면 되는 안전망의 가치를 배울 수 있습니다.

④ 전통 도메인을 AI 학습 데이터로 정형화하기

"결정론적 엔진 → 전수 데이터 생성 → 파인튜닝/RAG"라는 파이프라인은 이 레포만의 독특한 학습거리입니다. 규칙이 명확한 도메인이라면 가능한 입력을 전수 계산해 (입력→출력) 쌍을 무한 생성할 수 있다는 발상은, 합성 데이터(synthetic data) 전략의 실전 예시입니다.

⑤ 정적 데이터로 만든 전문(full-text) 검색

classics/index.tssearchClassics(query)는 DB 없이 정적 TS 객체만으로 ±40자 문맥 스니펫과 <mark> 하이라이트를 만들어냅니다(HTML 이스케이프 포함). "검색에 꼭 DB·엘라스틱서치가 필요한 건 아니다"는 걸 보여주는 가벼운 예제입니다.

주의
점술의 "진위"와 코드의 "학습가치"를 분리해서 보라

자미두수의 예언 능력 자체는 과학적으로 검증된 바 없습니다. 이 자료는 그 믿음을 옹호하지 않습니다. 여기서 배울 것은 점술의 효력이 아니라, 복잡한 규칙 체계를 깔끔한 코드 구조로 옮기는 엔지니어링 기법입니다. 결과 해석을 인생 결정의 근거로 삼지는 마세요.

7하드웨어/시스템 요구사항

로컬 학습엔 가벼움 — 단, 그대로는 빌드 안 됨
항목요구사항
필수Node.js 18+ , npm/pnpm
설치git clonenpm install (.npmrc에 legacy-peer-deps=true 설정됨, React19↔@types/react18 충돌 회피)
실행cp .env.example .env.localnpm run dev (Next.js :3000)
주의미커밋 컴포넌트·API 때문에 npm run build는 실패. 코드 읽기 학습용으로 권장
AI 해석 연결 시DeepSeek/OpenAI 호환 API 키 (직접 /api/interpret 구현 필요)
데이터셋51만 샘플은 Releases v3.0-samples 별도 다운로드 (5.5GB, 3분할 zip)
하드웨어일반 노트북이면 충분. 명반 계산은 순수 JS 연산이라 매우 가벼움

8직접 해볼 수 있는 실습 과제

난이도 순 5개 — 코드 읽기에서 엔진 재구성까지
과제 1 · 입문

algorithm.ts 한 파일만 정독하기 ★☆☆☆☆

레포를 클론하고 lib/ziwei/algorithm.ts(7.3KB)만 끝까지 읽으세요. generateChart()가 입력을 받아 iztro를 부르고, 그 결과를 어떻게 ZiweiChart 타입으로 매핑하는지 — mapStarType·mapBrightness의 분기 기준을 종이에 옮겨 적어 보면 도메인 모델링이 한눈에 들어옵니다.

과제 2 · 입문+

사화표를 원전과 대조 검증하기 ★★☆☆☆

constants.tsSI_HUA_TABLE 10줄을, 위키백과나 자미두수 입문 자료의 "천간사화표"와 한 칸씩 비교해 보세요. 코드의 표 = 전문가의 표임을 직접 확인하면, 테이블 주도 개발이 왜 검증에 유리한지 체감됩니다. 틀린 칸이 있는지도 찾아보세요(좋은 PR 기회).

과제 3 · 중급

iztro만으로 미니 명반 CLI 만들기 ★★★☆☆

이 레포의 무거운 UI를 걷어내고, iztrolunar-javascript만 설치해 "생년월일시 입력 → 12궁 별 배치를 콘솔에 출력"하는 30줄짜리 Node 스크립트를 작성하세요. 그러면 이 레포가 "iztro 위에 무엇을 더했는지"가 선명해집니다.

과제 4 · 중급+

나만의 격국 판정 함수 한 개 추가하기 ★★★★☆

patterns.tsdetectShaPoLang 같은 기존 함수를 본떠, 새 격국 판정 함수를 하나 작성하고 detectPatterns 디스패처에 등록하세요. 삼방사정((m+4)%12 등) 헬퍼로 별 조합을 검사하고, source에 출처를 붙이는 것까지가 핵심 — 규칙 엔진 확장 패턴을 손에 익힙니다.

과제 5 · 고급

격국 판정 결과를 LLM으로 해석하는 /api/interpret 만들기 ★★★★★

비공개인 백엔드를 직접 재구성하세요. generateChart() + detectPatterns()의 JSON 결과와 classics/의 관련 원문을 RAG 컨텍스트로 묶어 LLM에 던지고, 한국어 해석을 받아오는 API 라우트를 작성합니다. "구조화된 도메인 데이터 + 원전 근거 → LLM 해석"이라는 RAG 파이프라인 전체를 한 바퀴 돌려보는 종합 과제입니다.

9관련 기술 심화 학습 로드맵

4주 코스 — 도메인 모델링에서 RAG까지
주차주제할 일
1주차도메인 읽기lib/ziwei/ 전체 통독. ZiweiChart 타입 트리를 직접 그려보고, 자미두수 입문 글 1편으로 도메인 배경 잡기
2주차테이블 주도 + 규칙 엔진《Code Complete》의 Table-Driven Methods 장 읽기. patterns.ts 구조를 분석해 "조건+출처" 규칙 객체 패턴 정리. 과제 4 수행
3주차외부 의존성 격리DDD의 Anti-Corruption Layer 개념 학습. generateChart의 매핑 계층을 본떠, 임의의 외부 API를 자체 타입으로 래핑하는 연습
4주차합성 데이터 + RAG51만 샘플 생성 원리(전수 계산) 이해. 과제 5로 "구조화 데이터 + 원전 → LLM 해석" RAG 파이프라인 구축

10핵심 키워드 사전

이 레포를 읽는 데 필요한 용어들
용어
紫微斗數 (자미두수)생년월일시로 12궁에 별을 배치해 운명을 읽는 동양 점성술. 천간·지지 규칙 기반이라 컴퓨터로 정확히 재현 가능
命盤 (명반)자미두수의 결과물. 12궁 격자에 별이 배치된 "운명 지도". 코드로는 ZiweiChart 타입
宮 (궁) / 12궁명반의 12개 영역. 命宮(자아)·財帛(재물)·官祿(직업) 등 삶의 영역별로 별을 담는 칸
主星 (주성) / 14주성紫微·天機·太陽·武曲 등 운명을 좌우하는 핵심 14개 별
四化 (사화)천간에 따라 특정 별이 화록(化祿)·화권(化權)·화과(化科)·화기(化忌)로 변하는 시스템. SI_HUA_TABLE로 구현
格局 (격국)특정 별 조합이 이루는 길흉 패턴. 君臣慶會·殺破狼 등. patterns.ts가 41종 판정
三方四正 (삼방사정)한 궁을 볼 때 함께 보는 네 자리(자기·삼합 2개·대궁). [m,(m+4)%12,(m+8)%12,(m+6)%12]
大限 (대한)10년 단위의 운(運) 구간. 五行局에 따라 시작 나이가 정해짐
眞太陽時 (진태양시)출생지 경도에 따른 실제 태양 시각 보정. cities.ts가 도시 경도로 계산
Table-Driven (테이블 주도)분기문 대신 룩업 테이블(배열·맵)로 규칙을 표현하는 기법. 이 레포 설계의 뼈대
Anti-Corruption Layer외부 라이브러리(iztro)의 모델을 자체 타입으로 번역·격리하는 DDD 패턴
iztro실제 명반 계산을 담당하는 오픈소스 라이브러리. 이 레포가 래핑해 사용
飛星派 (비성파)사화가 움직인다고 보는 자미두수 유파. 이 레포는 倪海厦 노선을 따라 의도적으로 배제
합성 데이터 (Synthetic Data)결정론적 엔진으로 가능한 입력을 전수 계산해 만든 학습 데이터. 51만 샘플이 그 예

11참고 링크

더 깊이 들어가기
링크설명
GitHub 저장소소스 전체. lib/ziwei/가 핵심 읽을거리
TrendShift 페이지트렌딩 추이
iztro (계산 엔진)이 레포가 래핑하는 명반 계산 라이브러리. 직접 써보면 차이가 보임
lunar-javascript양력↔음력·간지 변환 라이브러리
Next.js App Router 문서app/ 디렉토리 구조의 공식 가이드
Anti-Corruption Layer (Fowler)외부 의존성 격리 패턴의 이론적 배경