명리학시스템으로 배우는 Ruby 학습 패키지 제작기

소개



시도하고자 했던 것

4주간 Ruby와 Rails를 학습하므로 기존에 개발한 한바둑 명리학 시스템(HTML/JavaScript 기반)을 Ruby로 재구현하고자 했습니다.

그 이유

실전 학습: 단순 문법 공부가 아닌, 실제 프로젝트 데이터를 활용한 학습

기술 스택 확장: JavaScript에서 Ruby로 기술 스택을 확장하여 백엔드 개발 역량 강화

Rails 프레임워크 준비: Ruby 기초를 탄탄히 한 후 Rails로 웹 애플리케이션 개발

데이터베이스 연동: 1.1M 조합 데이터를 효율적으로 처리할 수 있는 백엔드 시스템 구축



진행 방법



사용한 도구

Ruby 3.2.3: 스크립트 언어

Claude with Computer Use: Ruby 개발 환경

한바둑 프로젝트 데이터: 24절기 JSON, 사주 파서, 185필드 스키마

프롬프트

루비와 레일즈를 설치해 줘.

→ Ruby 설치 완료, Rails는 네트워크 제한으로 대안 제시

3

→ "프로젝트 요구사항 확인" 옵션 선택

4주간 루비와 레일즈를 공부하므로 한바둑시스템을 응용하려고 ... 그러므로 d가 아닐지 ...

→ 학습 목적 명확히 전달

1 2 3 전부다 해줘.

→ 3가지 핵심 스크립트 개발 요청

개발된 3가지 Ruby 스크립트

1️⃣ 절기 데이터 분석기 (jeolgi_analyzer.rb)

class JeolgiAnalyzer
  # 24절기 정보 (순서대로)
  JEOLGI_ORDER = %w[
    입춘 우수 경칩 춘분 청명 곡우
    입하 소만 망종 하지 소서 대서
    입추 처서 백로 추분 한로 상강
    입동 소설 대설 동지 소한 대한
  ]

  def initialize(json_file_path)
    @data = load_json(json_file_path)
    @jeolgi_list = parse_jeolgi_data
  end

  def analyze_all
    puts "📊 한바둑 시스템 - 24절기 데이터 분석기"
    analyze_by_year
    analyze_by_jeolgi
    analyze_by_season
    analyze_by_month
    analyze_by_hour
  end
end

ruby

class JeolgiAnalyzer # 24절기 정보 (순서대로) JEOLGI_ORDER = %w[ 입춘 우수 경칩 춘분 청명 곡우 입하 소만 망종 하지 소서 대서 입추 처서 백로 추분 한로 상강 입동 소설 대설 동지 소한 대한 ] def initialize(json_file_path) @data = load_json(json_file_path) @jeolgi_list = parse_jeolgi_data end def analyze_all puts "📊 한바둑 시스템 - 24절기 데이터 분석기" analyze_by_year analyze_by_jeolgi analyze_by_season analyze_by_month analyze_by_hour end end

주요 기능:

연도별/절기별/계절별/월별 분포 분석

시간대별 절기 발생 빈도 시각화

특정 날짜의 현재 절기 조회

절기 간 간격 분석

2️⃣ 사주 계산 엔진 (saju_engine.rb)

class SajuEngine
  # 천간 (10개)
  CHEONGAN = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계']
  
  # 지지 (12개)
  JIJI = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']

  def calculate_saju(birth_year, birth_month, birth_day, birth_hour, gender)
    # 년주 계산
    year_gan, year_ji = calculate_year_pillar(birth_year)
    
    # 월주 계산
    month_gan, month_ji = calculate_month_pillar(birth_year, birth_month, birth_day, year_gan)
    
    # 일주 계산
    day_gan, day_ji = calculate_day_pillar(birth_year, birth_month, birth_day)
    
    # 시주 계산
    hour_gan, hour_ji = calculate_hour_pillar(birth_hour, day_gan)
    
    # 오행 분석
    analyze_ohaeng([year_gan, year_ji, month_gan, month_ji, 
                    day_gan, day_ji, hour_gan, hour_ji])
  end
end

ruby

class SajuEngine # 천간 (10개) CHEONGAN = ['갑', '을', '병', '정', '무', '기', '경', '신', '임', '계'] # 지지 (12개) JIJI = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해'] def calculate_saju(birth_year, birth_month, birth_day, birth_hour, gender) # 년주 계산 year_gan, year_ji = calculate_year_pillar(birth_year) # 월주 계산 month_gan, month_ji = calculate_month_pillar(birth_year, birth_month, birth_day, year_gan) # 일주 계산 day_gan, day_ji = calculate_day_pillar(birth_year, birth_month, birth_day) # 시주 계산 hour_gan, hour_ji = calculate_hour_pillar(birth_hour, day_gan) # 오행 분석 analyze_ohaeng([year_gan, year_ji, month_gan, month_ji, day_gan, day_ji, hour_gan, hour_ji]) end end

주요 기능:

생년월일시 → 사주팔자 자동 계산

천간지지 60갑자 순환 계산

오행(목화토금수) 분포 분석

대운(10년 주기) 계산

3️⃣ 185필드 데이터 변환기 (field_185_converter.rb)

class Field185Converter
  # 185필드 스키마 정의
  SCHEMA_185 = {
    basic: ['id', 'birth_date', 'birth_time', 'gender', ...],      # 10필드
    wonguk: ['wonguk_seongpum', 'wonguk_jinro', ...],              # 7필드
    daeun: (1..5).flat_map { |i| ["daeun#{i}_ages", ...] },        # 50필드
    sewun_groups: (1..4).flat_map { |i| [...] },                   # 40필드
    sewun_yearly: (1..10).flat_map { |i| [...] },                  # 30필드
    meta: ['source', 'parsed_at', 'version', 'notes']              # 4필드
  }

  def convert_to_185_fields(nested_json)
    flat_data = {}
    # 중첩 JSON을 평탄화
    # 기본 정보, 원국, 대운, 세운 등 모든 필드 변환
    flat_data
  end
end
```

**주요 기능:**
- 중첩 JSON → 141필드 평탄화 (실제 사용 필드)
- JSON, CSV, SQL 3가지 포맷 변환
- 배치 처리 지원 (여러 데이터 동시 변환)
- 필드별 데이터 채움율 통계

### 실행 결과

**절기 분석기 출력:**
```
📊 한바둑 시스템 - 24절기 데이터 분석기
총 절기 데이터 수: 24개
연도 범위: 1945년 ~ 1945년

🌸 절기별 상세 정보
입춘 (IC)
  의미: 봄의 시작
  평균 날짜: 4일
  출현 횟수: 1회
```

**사주 계산 엔진 출력:**
```
🔮 한바둑 시스템 - 사주팔자 계산
생년월일: 1990년 3월 15일
출생시간: 오시
성별: 남자

🎯 완성된 사주팔자
     시주   일주   월주   년주
천간  경     기     병     경
지지  오     유     인     오

사주: 경오 병인 기유 경오
⭐ 일간(기)이 바로 '나' 자신을 나타냅니다!

🌟 오행 분석
목(木): █ 1개 (12.5%)
화(木): ███ 3개 (37.5%)
토(木): █ 1개 (12.5%)
금(木): ███ 3개 (37.5%)
수(木):  0개 (0.0%)

ruby

class Field185Converter # 185필드 스키마 정의 SCHEMA_185 = { basic: ['id', 'birth_date', 'birth_time', 'gender', ...], # 10필드 wonguk: ['wonguk_seongpum', 'wonguk_jinro', ...], # 7필드 daeun: (1..5).flat_map { |i| ["daeun#{i}_ages", ...] }, # 50필드 sewun_groups: (1..4).flat_map { |i| [...] }, # 40필드 sewun_yearly: (1..10).flat_map { |i| [...] }, # 30필드 meta: ['source', 'parsed_at', 'version', 'notes'] # 4필드 } def convert_to_185_fields(nested_json) flat_data = {} # 중첩 JSON을 평탄화 # 기본 정보, 원국, 대운, 세운 등 모든 필드 변환 flat_data end end ``` 주요 기능: - 중첩 JSON → 141필드 평탄화 (실제 사용 필드) - JSON, CSV, SQL 3가지 포맷 변환 - 배치 처리 지원 (여러 데이터 동시 변환) - 필드별 데이터 채움율 통계 ### 실행 결과 절기 분석기 출력: ``` 📊 한바둑 시스템 - 24절기 데이터 분석기 총 절기 데이터 수: 24개 연도 범위: 1945년 ~ 1945년 🌸 절기별 상세 정보 입춘 (IC) 의미: 봄의 시작 평균 날짜: 4일 출현 횟수: 1회 ``` 사주 계산 엔진 출력: ``` 🔮 한바둑 시스템 - 사주팔자 계산 생년월일: 1990년 3월 15일 출생시간: 오시 성별: 남자 🎯 완성된 사주팔자 시주 일주 월주 년주 천간 경 기 병 경 지지 오 유 인 오 사주: 경오 병인 기유 경오 ⭐ 일간(기)이 바로 '나' 자신을 나타냅니다! 🌟 오행 분석 목(木): █ 1개 (12.5%) 화(木): ███ 3개 (37.5%) 토(木): █ 1개 (12.5%) 금(木): ███ 3개 (37.5%) 수(木): 0개 (0.0%)

생성된 파일:

jeolgi_analyzer.rb (282줄)

saju_engine.rb (309줄)

field_185_converter.rb (440줄)

myeongli_185_fields.json (9.1KB)

myeongli_185_fields.csv (3.7KB)

myeongli_185_fields.sql (2.4KB)

README.md (353줄)

Ruby_Rails_4주_학습_가이드.md (551줄)




결과와 배운 점



배운 점

1. Ruby의 강력한 표현력

# JavaScript
const springJeolgi = jeolgiList.filter(j => [3,4,5].includes(j.date.month));

# Ruby - 훨씬 간결하고 읽기 쉬움
spring_jeolgi = jeolgi_list.select { |j| [3,4,5].include?(j[:date].month) }

ruby

# JavaScript const springJeolgi = jeolgiList.filter(j => [3,4,5].includes(j.date.month)); # Ruby - 훨씬 간결하고 읽기 쉬움 spring_jeolgi = jeolgi_list.select { |j| [3,4,5].include?(j[:date].month) }

2. 클래스 기반 설계의 중요성

절기, 사주, 데이터 변환을 각각 독립된 클래스로 분리

재사용성과 유지보수성이 크게 향상

JavaScript의 함수형 접근과는 다른 객체지향적 사고 필요

3. Ruby의 메타프로그래밍

# 동적으로 필드 생성
daeun: (1..5).flat_map do |i|
  [
    "daeun#{i}_ages",
    "daeun#{i}_pillar",
    "daeun#{i}_summary"
  ]
end

ruby

# 동적으로 필드 생성 daeun: (1..5).flat_map do |i| [ "daeun#{i}_ages", "daeun#{i}_pillar", "daeun#{i}_summary" ] end

4. 데이터 변환의 체계화

중첩 JSON → 평탄화 구조의 명확한 매핑 필요

스키마 정의의 중요성 (SCHEMA_185 상수로 관리)

다양한 종류의 꽃이 있는 한국 화분

시행착오

문제 1: Rails 설치 실패

원인: 네트워크 제한으로 rubygems.org 접근 불가

해결:

네트워크 설정 변경 방법 안내

Ruby만으로도 학습 가능한 대안 제시

로컬 환경에서 Rails 설치 권장

문제 2: 한글 인코딩 이슈

# 해결책: 파일 상단에 인코딩 선언
# encoding: UTF-8

# 파일 읽기 시 명시적 인코딩 지정
content = File.read(file_path, encoding: 'UTF-8')
```

**문제 3: 185필드 → 실제 141필드**
- 처음 설계는 185필드였으나 실제 구현 시 중복 제거하여 141필드로 최적화
- 스키마 설계 시 실제 사용 패턴을 먼저 분석하는 것이 중요

### 나만의 꿀팁

**1. 단계별 학습 전략**
```
Week 1: jeolgi_analyzer.rb 분석 (배열, 해시, 메서드)
  ↓
Week 2: saju_engine.rb 분석 (클래스, OOP)
  ↓
Week 3: field_185_converter.rb 분석 (데이터 변환)
  ↓
Week 4: Rails로 웹 앱 만들기

ruby

# 해결책: 파일 상단에 인코딩 선언 # encoding: UTF-8 # 파일 읽기 시 명시적 인코딩 지정 content = File.read(file_path, encoding: 'UTF-8') ``` 문제 3: 185필드 → 실제 141필드 - 처음 설계는 185필드였으나 실제 구현 시 중복 제거하여 141필드로 최적화 - 스키마 설계 시 실제 사용 패턴을 먼저 분석하는 것이 중요 ### 나만의 꿀팁 1. 단계별 학습 전략 ``` Week 1: jeolgi_analyzer.rb 분석 (배열, 해시, 메서드) ↓ Week 2: saju_engine.rb 분석 (클래스, OOP) ↓ Week 3: field_185_converter.rb 분석 (데이터 변환) ↓ Week 4: Rails로 웹 앱 만들기

2. 실제 데이터로 학습

토이 프로젝트보다 실제 프로젝트 데이터가 훨씬 학습 효과 좋음

한바둑의 24절기, 사주팔자 데이터는 복잡도가 적당해서 학습에 최적

3. 주석과 문서의 중요성

코드 282~440줄에 상세한 주석 추가

README.md로 사용법 명확히 설명

학습 가이드로 로드맵 제시

4. IRB로 즉시 실험

irb
> require './saju_engine'
> engine = SajuEngine.new
> engine.calculate_saju(1990, 3, 15, '오시', '남자')
```

### 도움이 필요한 부분

1. **Rails 환경 구축**: 로컬에서 Rails 설치 후 실습 필요
2. **대용량 데이터 처리**: 1.1M 조합 데이터를 효율적으로 처리하는 방법
3. **Dify AI 연동**: Rails API를 Dify와 연결하는 구체적인 방법

---

## 5. 앞으로의 계획

### 단기 계획 (1개월)

**Week 1-2: Ruby 마스터**
- 3가지 스크립트 완전 분석
- 새로운 기능 추가 실습
- RSpec으로 테스트 코드 작성

**Week 3-4: Rails 기초**
- 로컬 환경에 Rails 설치
- Hanbadook Rails 앱 생성
- 사주 조회 CRUD 구현

### 중기 계획 (3개월)

**Month 2: 데이터베이스 구축**
- PostgreSQL로 마이그레이션
- 185필드 데이터 전체 임포트
- 복잡한 쿼리 최적화

**Month 3: API 개발**
- RESTful API 설계
- JSON 응답 최적화
- 인증/인가 시스템 구현

### 장기 계획 (6개월~1년)

**1. 완전한 웹 플랫폼**
- 사용자 인증 시스템
- 상담 예약 기능
- 결제 연동

**2. Dify AI 통합**
- Rails API를 Dify 워크플로우에 연결
- RAG 시스템으로 명리학 지식 활용
- 자동 상담 생성

**3. 모바일 앱**
- React Native로 iOS/Android 앱 개발
- Rails API와 연동
- 푸시 알림 기능

**4. 1.1M 조합 데이터 완성**
```
60년 주기 × 12월 × 60일 주기 × 13시간대 × 2성별 = 1,123,200 조합

bash

irb > require './saju_engine' > engine = SajuEngine.new > engine.calculate_saju(1990, 3, 15, '오시', '남자') ``` ### 도움이 필요한 부분 1. Rails 환경 구축: 로컬에서 Rails 설치 후 실습 필요 2. 대용량 데이터 처리: 1.1M 조합 데이터를 효율적으로 처리하는 방법 3. Dify AI 연동: Rails API를 Dify와 연결하는 구체적인 방법 --- ## 5. 앞으로의 계획 ### 단기 계획 (1개월) Week 1-2: Ruby 마스터 - 3가지 스크립트 완전 분석 - 새로운 기능 추가 실습 - RSpec으로 테스트 코드 작성 Week 3-4: Rails 기초 - 로컬 환경에 Rails 설치 - Hanbadook Rails 앱 생성 - 사주 조회 CRUD 구현 ### 중기 계획 (3개월) Month 2: 데이터베이스 구축 - PostgreSQL로 마이그레이션 - 185필드 데이터 전체 임포트 - 복잡한 쿼리 최적화 Month 3: API 개발 - RESTful API 설계 - JSON 응답 최적화 - 인증/인가 시스템 구현 ### 장기 계획 (6개월~1년) 1. 완전한 웹 플랫폼 - 사용자 인증 시스템 - 상담 예약 기능 - 결제 연동 2. Dify AI 통합 - Rails API를 Dify 워크플로우에 연결 - RAG 시스템으로 명리학 지식 활용 - 자동 상담 생성 3. 모바일 앱 - React Native로 iOS/Android 앱 개발 - Rails API와 연동 - 푸시 알림 기능 4. 1.1M 조합 데이터 완성 ``` 60년 주기 × 12월 × 60일 주기 × 13시간대 × 2성별 = 1,123,200 조합

배치 처리로 전체 조합 생성

분산 처리 시스템 구축

캐싱 전략 수립

5. AI 기능 강화

GPT-4 기반 맞춤 상담

이미지 생성 (사주 차트 시각화)

음성 상담 기능




도움 받은 글 (옵션)



참고한 외부 자료

Ruby 공식 문서: https://www.ruby-lang.org/ko/

Rails 가이드: https://guides.rubyonrails.org/

한국천문연구원(KASI): 24절기 데이터의 출처

한바둑 프로젝트 관련 문서

24절기 데이터 전문 가이드

한바둑 시스템 완전 통합 가이드

명리 통변 30개 스키마 데이터베이스 설계

영감을 받은 컨셉

실전 중심 학습: 토이 프로젝트가 아닌 실제 시스템으로 학습

점진적 구축: 작은 스크립트 → 웹 앱 → 대규모 플랫폼

데이터 주도 개발: 실제 데이터가 있으니 학습이 구체적



2

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요