소개
시도하고자 했던 것
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 dbconsoleStep 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:migrateStep 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건배운 점 & 꿀팁
Codespaces 드래그앤드롭
파일은 맨 위 프로젝트 폴더에 드롭!
잘못 들어갔으면
find . -name "파일명"으로 찾기
PostgreSQL vs SQLite 차이
NOW()→datetime('now')마이그레이션 전 기존 컬럼 확인 필수!
ERB 파일 디버깅
<% if개수와<% end %>개수가 맞아야 함.each도end필요!grep -c "<% if"/grep -c "<% end %>"로 확인
sed 명령어 활용
bash
# 문자열 치환
sed -i 's/원본/대체/g' 파일명
# 특정 줄 삭제
sed -i '/삭제할패턴/d' 파일명시행착오
마이그레이션 중복 컬럼 에러
health,lawsuit컬럼이 이미 존재sed -i '/add_column :daeuns, :health/d'로 해당 줄 삭제 후 재실행
ERB 문법 에러
%%가%로 변환되지 않아 태그가 그대로 출력sed -i 's/<%%/<%/g'로 해결
필드명 불일치
daeun_namevsname- DB 컬럼명 확인 필수!rails runner "puts Model.column_names.join(', ')"
앞으로의 계획
UI 세부 수정 - 데이터 일일이 체크하며 표시 형식 개선
100만건 데이터 확장 - 60일주 × 조합으로 대량 데이터 생성
Dify AI 연동 - RAG 기반 명리 상담 챗봇 구현
모바일 앱 - React Native로 iOS/Android 앱 개발
도움 받은 글 (옵션)
Day 1 사례글: Rails 환경 구축 및 기본 데이터 Import
Claude AI 프로젝트 지식 문서들