한바둑 명리학 시스템 개발기 Day 2-3 : 대운그룹 1,129건 Import와 UI 개선

소개

시도하고자 했던 것

Day 1에서 Rails 환경 구축과 기본 데이터(profiles 310건, wonkuks 310건, jeolgis 2,568건)를 Import한 이후, 이번에는 더 복잡한 관계형 데이터인 daeun_groups 1,129건을 Import하고, 프로필 상세 페이지의 UI를 대폭 개선하는 작업을 진행했습니다.

그 이유

명리학 통변 시스템에서 대운(大運) 내에는 세부 시기별 해석이 포함되어 있습니다. 예를 들어 "28세37세 癸酉대운" 안에 "28세29세", "30세~32세" 등의 세부 그룹별 운세 해석이 있죠. 이 데이터가 없으면 완전한 명리 상담 서비스를 제공할 수 없기에, 반드시 Import가 필요했습니다.

진행 방법

사용 도구

  • Claude AI (Opus) - 코드 생성, SQL 작성, 문제 해결

  • GitHub Codespaces - 클라우드 개발 환경

  • Rails 8.1.1 + SQLite - 백엔드 프레임워크

  • PostgreSQL 스키마 → SQLite 변환

Step 1: daeun_groups SQL 파일 생성

먼저 Claude에게 JSON 데이터를 SQL INSERT문으로 변환해달라고 요청했습니다.

사용한 프롬프트:

daeun_groups 1,129건 Import를 진행하겠습니다.
JSON 파일을 업로드했습니다. SQL 파일을 생성해주세요.

Claude가 생성한 Python 스크립트로 1,129건의 INSERT SQL이 담긴 파일(1.4MB)이 생성되었습니다.

Step 2: Codespaces 파일 업로드 (드래그앤드롭 학습!)

이번에 처음으로 Codespaces 드래그앤드롭을 제대로 배웠습니다!

핵심 포인트:

  • 파일을 맨 위 프로젝트 폴더 이름 위에 드롭해야 루트에 들어감

  • 다른 폴더에 들어갔을 경우: find . -name "파일명"으로 찾기

  • 파일 이동: mv 원래경로/파일명 .

bash

# 파일 찾기
find . -name "insert_daeun_groups_1129.sql"
# 결과: ./.kamal/insert_daeun_groups_1129.sql

# 파일 이동
mv .kamal/insert_daeun_groups_1129.sql .

Step 3: SQLite 호환성 문제 해결

PostgreSQL용으로 생성된 SQL에서 NOW() 함수가 SQLite에서 작동하지 않았습니다.

bash

# 에러 발생
Parse error: no such function: NOW

# 해결: sed로 일괄 변환
sed -i "s/NOW()/datetime('now')/g" insert_daeun_groups_1129.sql

# 다시 실행
cat insert_daeun_groups_1129.sql | rails dbconsole

Step 4: 중복 데이터 정리

Import 후 데이터 무결성을 확인했습니다.

ruby

# Rails Console에서 중복 체크
[202, 244, 255, 256, 270, 294].each do |pid|
  daeuns = Daeun.where(profile_id: pid).order(:id).to_a
  if daeuns.count > 1
    daeuns[1..-1].each do |d|
      DaeunGroup.where(daeun_id: d.id).destroy_all
      d.destroy
      puts "삭제: Daeun #{d.id}"
    end
  end
end

결과: Daeun 312건 → 306건, DaeunGroup 1,129건 → 1,103건

Step 5: DB 스키마 확장

원본 데이터에 있는 추가 필드들을 저장하기 위해 마이그레이션 생성:

bash

# Wonkuks 테이블 확장
rails generate migration AddFieldsToWonkuks ilgan_desc:text wolji_desc:text gongmang_desc:text sinsal_desc:text bigyeop_desc:text gwanseong_desc:text ohaeng_health:text

# Daeuns 테이블 확장
rails generate migration AddFieldsToDaeuns cheongan_desc:text jiji_desc:text gongmang_desc:text env_social:text env_job:text env_family:text env_personal:text

# Sewuns 테이블 확장  
rails generate migration AddFieldsToSewuns cheongan_desc:text jiji_desc:text gongmang_desc:text env_social:text env_job:text env_personal:text env_etc:text

rails db:migrate

Step 6: 프로필 상세 UI 개선

컨트롤러에 @daeun_groups 추가:

ruby

# app/controllers/profiles_controller.rb
def show
  @profile = Profile.find(params[:id])
  @wonkuk = Wonkuk.find_by(profile_id: @profile.id)
  @daeuns = Daeun.where(profile_id: @profile.id).order(:age_start)
  @sewuns = Sewun.where(profile_id: @profile.id).order(:year)
  @daeun_groups = DaeunGroup.where(daeun_id: @daeuns.pluck(:id)).order(:group_number)
end

뷰 파일을 원국/대운/대운그룹/세운 섹션으로 구성:

  • 기본 정보: 그라데이션 배경

  • 원국 해석: 빨간색 테두리 (성품, 진로, 재물, 가족)

  • 대운 해석: 파란색 테두리 + 대운그룹 세부 시기

  • 세운 해석: 보라색 테두리

결과와 배운 점

결과

현재 DB 현황:

테이블건수profiles310건wonkuks310건daeuns306건daeun_groups1,103건sewuns312건jeolgis2,568건총합4,909건

배운 점 & 꿀팁

  1. Codespaces 드래그앤드롭

    • 파일은 맨 위 프로젝트 폴더에 드롭!

    • 잘못 들어갔으면 find . -name "파일명"으로 찾기

  2. PostgreSQL vs SQLite 차이

    • NOW()datetime('now')

    • 마이그레이션 전 기존 컬럼 확인 필수!

  3. ERB 파일 디버깅

    • <% if 개수와 <% end %> 개수가 맞아야 함

    • .eachend 필요!

    • grep -c "<% if" / grep -c "<% end %>" 로 확인

  4. sed 명령어 활용

bash

   # 문자열 치환
   sed -i 's/원본/대체/g' 파일명
   
   # 특정 줄 삭제
   sed -i '/삭제할패턴/d' 파일명

시행착오

  1. 마이그레이션 중복 컬럼 에러

    • health, lawsuit 컬럼이 이미 존재

    • sed -i '/add_column :daeuns, :health/d'로 해당 줄 삭제 후 재실행

  2. ERB 문법 에러

    • %%%로 변환되지 않아 태그가 그대로 출력

    • sed -i 's/<%%/<%/g'로 해결

  3. 필드명 불일치

    • daeun_name vs name - DB 컬럼명 확인 필수!

    • rails runner "puts Model.column_names.join(', ')"


앞으로의 계획

  1. UI 세부 수정 - 데이터 일일이 체크하며 표시 형식 개선

  2. 100만건 데이터 확장 - 60일주 × 조합으로 대량 데이터 생성

  3. Dify AI 연동 - RAG 기반 명리 상담 챗봇 구현

  4. 모바일 앱 - React Native로 iOS/Android 앱 개발

도움 받은 글 (옵션)

  • Day 1 사례글: Rails 환경 구축 및 기본 데이터 Import

  • Claude AI 프로젝트 지식 문서들

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요