feat: 약재 효능 태그 시스템 추가

- herb_efficacy_tags 테이블 생성 (효능 마스터)
- herb_item_tags 테이블 생성 (약재-효능 다대다 관계)
- 18개 기본 효능 태그 등록 (보혈, 활혈, 보기 등)
- Git 사용 가이드라인 문서 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
시골약사 2026-02-15 09:48:15 +00:00
parent 40be340a63
commit 808920184f
2 changed files with 234 additions and 0 deletions

76
.claude/git_guidelines.md Normal file
View File

@ -0,0 +1,76 @@
# Git 사용 가이드라인
## ⚠️ 중요한 주의사항
### 1. Git 초기화 금지
- **절대로 `git init`를 실행하지 말 것**
- 이 프로젝트는 이미 Gitea 서버에 연결되어 있음
- 원격 저장소: origin (Gitea 서버)
### 2. 커밋 전 확인 사항
- 항상 `git status`로 현재 상태 확인
- `git log --oneline -n 5`로 최근 커밋 이력 확인
- `git remote -v`로 원격 저장소 확인
### 3. 커밋 시 규칙
```bash
# 상태 확인
git status
# 변경사항 확인
git diff
# 논리적 단위로 나누어서 커밋
git add [파일명]
git commit -m "커밋 메시지"
# 원격 저장소에 푸시
git push origin main
```
### 4. 커밋 메시지 작성 규칙
- **기능 추가**: `feat: 효능 태그 시스템 추가`
- **버그 수정**: `fix: 총금액 표시 오류 수정`
- **문서 작성**: `docs: README 업데이트`
- **리팩토링**: `refactor: 코드 구조 개선`
- **스타일**: `style: 코드 포맷팅`
- **테스트**: `test: 단위 테스트 추가`
- **기타**: `chore: 빌드 스크립트 수정`
### 5. 파일 관리
- 테스트 파일들은 `.gitignore`에 추가 고려
- 업로드 폴더는 커밋하지 않기 (uploads/)
- 데이터베이스 파일은 주의해서 관리
### 6. 브랜치 전략
- 현재 main 브랜치 사용 중
- 큰 기능은 별도 브랜치 생성 고려
```bash
# 브랜치 생성 및 체크아웃
git checkout -b feature/기능명
# 작업 후 main으로 머지
git checkout main
git merge feature/기능명
```
### 7. 실수 방지
- `git push --force`는 절대 사용 금지
- `git reset --hard`는 신중하게 사용
- 작업 전 `git pull` 실행 습관화
## 현재 프로젝트 상태
- Repository: kdrug (한약재 재고관리 시스템)
- Branch: main
- Remote: origin (Gitea 서버)
## 체크리스트
- [ ] git status 확인
- [ ] 논리적 단위로 파일 그룹화
- [ ] 의미있는 커밋 메시지 작성
- [ ] 불필요한 파일 제외 확인
- [ ] push 전 최종 검토
---
작성일: 2026-02-15
작성자: Claude Assistant

View File

@ -0,0 +1,158 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
약재 효능 태그 시스템 추가 스크립트
"""
import sqlite3
def check_and_create_efficacy_system():
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
try:
# 1. 현재 테이블 확인
cursor.execute("""
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name
""")
print("=== 현재 테이블 목록 ===")
for table in cursor.fetchall():
print(f" - {table[0]}")
# 2. herb_items 테이블 스키마 확인
print("\n=== herb_items 테이블 구조 ===")
cursor.execute("PRAGMA table_info(herb_items)")
columns = cursor.fetchall()
for col in columns:
print(f" {col[1]} ({col[2]})")
# 3. 효능 태그 테이블 생성
print("\n=== 효능 태그 시스템 생성 ===")
# 효능 마스터 테이블
cursor.execute("""
CREATE TABLE IF NOT EXISTS herb_efficacy_tags (
tag_id INTEGER PRIMARY KEY AUTOINCREMENT,
tag_name VARCHAR(50) NOT NULL UNIQUE,
tag_category VARCHAR(50), -- (), (), (), ()
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
print("✅ herb_efficacy_tags 테이블 생성")
# 약재-효능 연결 테이블 (다대다)
cursor.execute("""
CREATE TABLE IF NOT EXISTS herb_item_tags (
herb_item_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (herb_item_id, tag_id),
FOREIGN KEY (herb_item_id) REFERENCES herb_items(herb_item_id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES herb_efficacy_tags(tag_id) ON DELETE CASCADE
)
""")
print("✅ herb_item_tags 테이블 생성")
# 4. 기본 효능 태그 추가
basic_tags = [
('보혈', '', '혈을 보하는 효능'),
('보기', '', '기를 보하는 효능'),
('보양', '', '양기를 보하는 효능'),
('보음', '', '음액을 보하는 효능'),
('활혈', '', '혈액순환을 활발하게 하는 효능'),
('거담', '', '가래를 제거하는 효능'),
('온중', '', '속을 따뜻하게 하는 효능'),
('온양', '', '양기를 따뜻하게 하는 효능'),
('청열', '', '열을 내리는 효능'),
('해표', '', '표증을 해소하는 효능'),
('소화', '', '소화를 돕는 효능'),
('이수', '', '수분대사를 돕는 효능'),
('안신', '', '정신을 안정시키는 효능'),
('지혈', '', '출혈을 멈추는 효능'),
('조화제약', '조화', '여러 약재를 조화롭게 하는 효능'),
('대보원기', '대보', '원기를 크게 보하는 효능'),
('보기건비', '', '기를 보하고 비장을 건강하게 하는 효능'),
('보중익기', '', '중초를 보하고 기를 증진시키는 효능'),
]
for tag_name, category, description in basic_tags:
cursor.execute("""
INSERT OR IGNORE INTO herb_efficacy_tags (tag_name, tag_category, description)
VALUES (?, ?, ?)
""", (tag_name, category, description))
print(f"{len(basic_tags)}개 기본 효능 태그 추가")
# 5. 쌍화탕 약재들에 효능 태그 연결
ssanghwa_herbs = [
('숙지황', '보혈'),
('당귀', '보혈'),
('백작약', '보혈'),
('천궁', '활혈'),
('황기', '보기'),
('인삼', '대보원기'),
('백출', '보기건비'),
('감초', '조화제약'),
('생강', '온중'),
('대추', '보중익기'),
('육계', '온양'),
('건강', '온중'),
]
print("\n=== 약재별 효능 태그 연결 ===")
for herb_name, tag_name in ssanghwa_herbs:
# 약재 ID 찾기
cursor.execute("SELECT herb_item_id FROM herb_items WHERE herb_name = ?", (herb_name,))
herb_result = cursor.fetchone()
# 태그 ID 찾기
cursor.execute("SELECT tag_id FROM herb_efficacy_tags WHERE tag_name = ?", (tag_name,))
tag_result = cursor.fetchone()
if herb_result and tag_result:
herb_id = herb_result[0]
tag_id = tag_result[0]
cursor.execute("""
INSERT OR IGNORE INTO herb_item_tags (herb_item_id, tag_id)
VALUES (?, ?)
""", (herb_id, tag_id))
print(f"{herb_name}{tag_name}")
else:
if not herb_result:
print(f" ⚠️ {herb_name} 약재 없음")
if not tag_result:
print(f" ⚠️ {tag_name} 태그 없음")
conn.commit()
# 6. 결과 확인 - 약재별 태그 조회
print("\n=== 약재별 효능 태그 확인 ===")
cursor.execute("""
SELECT
h.herb_name,
GROUP_CONCAT(t.tag_name, ', ') as tags
FROM herb_items h
LEFT JOIN herb_item_tags ht ON h.herb_item_id = ht.herb_item_id
LEFT JOIN herb_efficacy_tags t ON ht.tag_id = t.tag_id
WHERE ht.tag_id IS NOT NULL
GROUP BY h.herb_item_id
ORDER BY h.herb_name
""")
results = cursor.fetchall()
for herb_name, tags in results:
print(f" {herb_name}: {tags}")
print("\n✅ 효능 태그 시스템 구축 완료!")
except Exception as e:
print(f"❌ 오류 발생: {e}")
conn.rollback()
finally:
conn.close()
if __name__ == "__main__":
check_and_create_efficacy_system()