cert-study-app / docs /devlog /2026-06-07.md
Kentlo's picture
Sync from GitHub f8e98d3f03952efd3d7c1b217df60c77c3992aec
87b5875 verified
|
Raw
History Blame Contribute Delete
6.59 kB
# ๊ฐœ๋ฐœ์ผ์ง€: 2026-06-07
## ์˜ค๋Š˜์˜ ๋ชฉํ‘œ
์ž๊ฒฉ์ฆ ๋ฌธ์ œํ’€์ด ์›น ํ”„๋กœ์ ํŠธ๋ฅผ GitHub ํฌํŠธํด๋ฆฌ์˜ค์ฒ˜๋Ÿผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก README์™€ docs ๋ฌธ์„œ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.
๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ ๋ชฉ๋ก๋งŒ ์ ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์™œ ์ด ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€์™€ ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒํƒœ๋ฅผ ์ดˆ๋ณด์ž๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.
## ์˜ค๋Š˜ ์ •๋ฆฌํ•œ ๋ฌธ์„œ
- `README.md`
- `docs/01_overview.md`
- `docs/02_architecture.md`
- `docs/03_data_pipeline.md`
- `docs/04_database.md`
- `docs/05_deployment.md`
- `docs/06_decision_log.md`
- `docs/07_troubleshooting.md`
- `docs/devlog/2026-06-07.md`
## ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ดํ•ด
์ด ํ”„๋กœ์ ํŠธ๋Š” ์ž๊ฒฉ์ฆ ์‹œํ—˜ ๋ฌธ์ œ PDF๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ๊ตฌ์กฐํ™”ํ•œ ๋’ค ์›น์—์„œ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ์•ฑ์ด๋‹ค.
ํ˜„์žฌ ๊ตฌ์กฐ๋Š” Streamlit ์›น ์•ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ๋ฌธ์ œ์™€ ํ’€์ด ๊ธฐ๋ก์€ PostgreSQL์— ์ €์žฅํ•˜๊ณ , ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด Chroma๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. PDF ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ Airflow๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉํ–ฅ์ด๋‹ค.
## ์˜ค๋Š˜ ํ™•์ธํ•œ ์‹ค์ œ ์ฝ”๋“œ ๊ตฌ์กฐ
ํ™•์ธํ•œ ์ฃผ์š” ํŒŒ์ผ:
- `streamlit_app.py`
- `cert_study_app/models.py`
- `cert_study_app/graphs/pdf_ingestion_graph.py`
- `cert_study_app/services`
- `dags/cert_study_pdf_ingestion_dag.py`
- `docker-compose.yml`
์‹ค์ œ ์•ฑ์—๋Š” ๋ฌธ์ œ ํ’€์ด, PDF ์—…๋กœ๋“œ, ์˜ค๋‹ต/๋ณต์Šต, ๊ฐœ๋… ์ •๋ฆฌ, ์ฒ˜๋ฆฌ ํ˜„ํ™ฉ, ์‹œํ—˜ ํ˜„ํ™ฉ, AI ์ƒ‰์ธ ํ๋ฆ„์ด ์žˆ์—ˆ๋‹ค.
๋ฐ์ดํ„ฐ ๋ชจ๋ธ์—๋Š” ๋ฌธ์ œ, ํ’€์ด ๊ธฐ๋ก, ๊ฐœ๋… ๋…ธํŠธ, PDF ์ฒ˜๋ฆฌ ์ž‘์—…, ๋ฌธ์„œ ์ƒ‰์ธ ์ž‘์—…์ด ์ •์˜๋˜์–ด ์žˆ์—ˆ๋‹ค.
## ์˜ค๋Š˜ ๋ฌธ์„œํ™”ํ•œ ํ•ต์‹ฌ ๋‚ด์šฉ
### 1. ํ”„๋กœ์ ํŠธ ๋ชฉ์ 
PDF ๋ฌธ์ œ๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์ •๋ฆฌํ•˜๋Š” ๋ถ€๋‹ด์„ ์ค„์ด๊ณ , ๋ฌธ์ œ ํ’€์ด์™€ ๋ณต์Šต๊นŒ์ง€ ์ด์–ด์ง€๋Š” ํ•™์Šต ์›น์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.
### 2. ์ „์ฒด ์•„ํ‚คํ…์ฒ˜
Streamlit, PostgreSQL, Chroma, Airflow, Docker Compose๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ •๋ฆฌํ–ˆ๋‹ค.
`docs/02_architecture.md`์—๋Š” Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ๋„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
### 3. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ
PDF ์—…๋กœ๋“œ๋ถ€ํ„ฐ ๋ฌธ์ œ ์ €์žฅ๊นŒ์ง€์˜ ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.
์ฃผ์š” ํ๋ฆ„:
1. PDF ์—…๋กœ๋“œ
2. `IngestionJob` ์ƒ์„ฑ
3. Airflow DAG ์‹คํ–‰
4. PDF ํŒŒ์‹ฑ
5. ํŒŒ์‹ฑ ํ’ˆ์งˆ ๊ฒ€์ฆ
6. Quality Gate
7. PostgreSQL ์ €์žฅ
8. Chroma ์ƒ‰์ธ
### 4. PostgreSQL๊ณผ Chroma์˜ ์—ญํ•  ๋ถ„๋ฆฌ
PostgreSQL์€ ์›๋ณธ ๋ฌธ์ œ์™€ ํ’€์ด ๊ธฐ๋ก์„ ์ •ํ™•ํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๊ธฐ์ค€ ์ €์žฅ์†Œ๋กœ ์„ค๋ช…ํ–ˆ๋‹ค.
Chroma๋Š” ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ณด์กฐ ์ƒ‰์ธ์œผ๋กœ ์„ค๋ช…ํ–ˆ๋‹ค.
### 5. ๊ธฐ์ˆ  ์„ ํƒ ์ด์œ 
์˜์‚ฌ๊ฒฐ์ • ๊ธฐ๋ก ๋ฌธ์„œ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ADR ํ˜•ํƒœ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.
- Streamlit ์„ ํƒ ์ด์œ 
- PostgreSQL ์„ ํƒ ์ด์œ 
- Chroma ์„ ํƒ ์ด์œ 
- Airflow ์„ ํƒ ์ด์œ 
- Docker Compose ์„ ํƒ ์ด์œ 
- Oracle Cloud Ubuntu ๋ฐฐํฌ ๊ณ„ํš
- ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ๋‘๋Š” ์ด์œ 
## ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ๋ถ€๋ถ„
์ด ํ”„๋กœ์ ํŠธ๋Š” ์•„์ง ์™„์„ฑ๋œ ์šด์˜ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋กœ ๊ธฐ๋Šฅ๊ณผ ๊ตฌ์กฐ๋ฅผ ๊ณ„์† ๋‹ค๋“ฌ๋Š” ์ค‘์ด๋‹ค.
ํ˜„์žฌ ์ค‘์š”ํ•˜๊ฒŒ ๋ณด๊ณ  ์žˆ๋Š” ๊ฐœ์„ ์ :
- PDF ํŒŒ์‹ฑ ์ •ํ™•๋„ ๊ฐœ์„ 
- ๋ฌธ์ œ ์ฒญํ‚น ํ’ˆ์งˆ ๊ฒ€์ฆ
- ํ’ˆ์งˆ ๋ฆฌํฌํŠธ UI ๊ฐœ์„ 
- ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ
- ์‹œํ—˜๋ณ„ ์ง„๋„์œจ๊ณผ ์ •๋‹ต๋ฅ 
- ์ค‘๋ณต ๋ฌธ์ œ ๊ฐ์ง€
- Oracle Cloud Ubuntu ๋ฐฐํฌ
- ํ…Œ์ŠคํŠธ ์ž๋™ํ™”
## ์˜ค๋Š˜์˜ ๊ฒฐ์ •
๋ฌธ์„œ๋Š” ๊ณผ์žฅ๋œ ์™„์„ฑํ˜• ์„œ๋น„์Šค ์†Œ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ, ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.
๋˜ํ•œ README๋Š” ์งง๊ฒŒ ์ „์ฒด๋ฅผ ์†Œ๊ฐœํ•˜๊ณ , ์ž์„ธํ•œ ๋‚ด์šฉ์€ `docs/` ๋ฌธ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.
## ๋‹ค์Œ ์ž‘์—… ํ›„๋ณด
- `.env.example` ์ ๊ฒ€
- GitHub ์—…๋กœ๋“œ ์ „ ๋ถˆํ•„์š”ํ•œ ๋Ÿฐํƒ€์ž„ ํŒŒ์ผ ์ œ์™ธ ํ™•์ธ
- Oracle Cloud ๋ฐฐํฌ ์ ˆ์ฐจ ์‹ค์ œ ๊ฒ€์ฆ
- PDF ํŒŒ์‹ฑ ํ’ˆ์งˆ ๋ฆฌํฌํŠธ ํ™”๋ฉด ๊ฐœ์„ 
- ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
- README์— ์Šคํฌ๋ฆฐ์ƒท ์ถ”๊ฐ€
## ์ถ”๊ฐ€ ์ง„ํ–‰ ๋‚ด์šฉ
GitHub์™€ Hugging Face Space ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค. Hugging Face์—๋Š” ๋กœ์ปฌ DB๋‚˜ PDF ์›๋ณธ์„ ์ง์ ‘ ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ , ๋ฐฐํฌ์šฉ seed์™€ ํ•„์š”ํ•œ ์ •์  ์ด๋ฏธ์ง€๋งŒ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค.
๋ฐฐํฌ์šฉ seed๋Š” `scripts/export_hf_seed.py`๋กœ ์ƒ์„ฑํ•œ๋‹ค. ๊ธฐ์ค€ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ๋Š” `data/Json/questions.json`์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ณตํ†ต ์ง€๋ฌธ๊ณผ ๊ณตํ†ต ์ง€๋ฌธ ์›๋ฌธ ์ด๋ฏธ์ง€๋Š” `data/parsed_json/reparsed_multipage_images_20260601_205501.json`์—์„œ ๋ณด๊ฐ•ํ•œ๋‹ค.
ํ˜„์žฌ ๋ฐฐํฌ์šฉ seed์—๋Š” 321๋ฌธํ•ญ์ด ๋“ค์–ด ์žˆ๋‹ค. ๊ณตํ†ต ์ง€๋ฌธ์ด ์žˆ๋Š” ๋ฌธํ•ญ์€ `parent_stem`๊ณผ `parent_image_paths`๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง„๋‹ค.
๋ฌธ์ œํ’€์ด UI์—์„œ๋Š” Yes/No ์ง„์ˆ ํ˜• ๋ฌธ์ œ๋ฅผ ์ผ๋ฐ˜ ๊ฐ๊ด€์‹์ด ์•„๋‹ˆ๋ผ ์ง„์ˆ ๋ณ„ `์˜ˆ / ์•„๋‹ˆ์˜ค` ๋งคํŠธ๋ฆญ์Šค๋กœ ํ‘œ์‹œํ•˜๋„๋ก ๊ฐœ์„ ํ–ˆ๋‹ค. `1-A / 1-B / 2-A / 2-B`์ฒ˜๋Ÿผ ํ•ญ๋ชฉ๋ณ„ ์„ ํƒ์ด ํ•„์š”ํ•œ ๋ฌธ์ œ๋Š” ํ•ญ๋ชฉ๋ณ„ select๋กœ ํ‘œ์‹œํ•œ๋‹ค.
์ผ์ž๋ณ„ Git ๋ณ€๊ฒฝ ํ™•์ธ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด `scripts/git_daily_changes.sh`๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
```bash
scripts/git_daily_changes.sh 2026-06-07
```
## ๋ฌธ์ œ ์œ ํ˜•/๋ชจ๋ฐ”์ผ UI ๊ฐœ์„ 
๋ฌธ์ œ ์œ ํ˜•์ด ์—ฌ๋Ÿฌ ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ค๋ฉด์„œ ํ™”๋ฉด ํ‘œ์‹œ์™€ ์ฑ„์  ๊ธฐ์ค€์ด ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `Hotspot (True/False)`, `True/False (In-Context)`, `Hotspot (Drag and Drop)`์ฒ˜๋Ÿผ ์›๋ฌธ์—์„œ ์˜จ ์œ ํ˜•๋ช…์ด ๋‚ด๋ถ€ ๋กœ์ง๊ณผ ์ •ํ™•ํžˆ ๋งž์ง€ ์•Š์œผ๋ฉด Yes/No ๋ฌธ์ œ๊ฐ€ ๊ฐ๊ด€์‹์ฒ˜๋Ÿผ ๋ณด์ด๊ฑฐ๋‚˜, ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๋‹ต์•ˆ์ด ์ผ๋ฐ˜ ๋ณต์ˆ˜ ์„ ํƒ์ฒ˜๋Ÿผ ๋น„๊ต๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
- `answer_normalizer.py`: Yes/No, ๊ฐ๊ด€์‹, ๋ณต์ˆ˜ ์„ ํƒ, ์ˆœ์„œํ˜• ๋‹ต์•ˆ์„ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ •๊ทœํ™”
- `question_type_metadata_service.py`: ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ์œ ํ˜•๋ช…์„ ๋‚ด๋ถ€ ํ‘œ์ค€ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜
- `tests/test_answer_normalizer.py`: ์ •๋‹ต ์ •๊ทœํ™” ํ…Œ์ŠคํŠธ
- `tests/test_question_type_metadata_service.py`: ๋ฌธ์ œ ์œ ํ˜• alias ํ…Œ์ŠคํŠธ
๋ชจ๋ฐ”์ผ ํ™”๋ฉด์€ ๋ฌธ์ œํ’€์ด๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋™์„ ์œผ๋กœ ๋‘๊ณ , ์—…๋กœ๋“œ/์ฒ˜๋ฆฌ ํ˜„ํ™ฉ/AI ์ƒ‰์ธ์€ ๊ด€๋ฆฌ ์˜์—ญ์œผ๋กœ ๋ฌถ์—ˆ๋‹ค. ๋‹ต์•ˆ ์„ ํƒ UI๋Š” ํ„ฐ์น˜ํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋ฒ„ํŠผ๊ณผ radio ์˜์—ญ์˜ ๋†’์ด์™€ ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ–ˆ๋‹ค.
## ๋ฐฐํฌ/ํ’ˆ์งˆ ๋ณด์™„
์ถ”๊ฐ€๋กœ ๋ฐฐํฌ ์ „์— ๋†“์น˜๊ธฐ ์‰ฌ์šด ๋ถ€๋ถ„์„ ์ •๋ฆฌํ–ˆ๋‹ค.
- seed ๊ฐฑ์‹  ์‹œ ์‚ฌ๋žŒ์ด ๊ฒ€์ˆ˜ํ•œ ๋ฌธ์ œ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋„๋ก ๋ณดํ˜ธ
- seed export ๊ฒฐ๊ณผ๋ฅผ `questions_seed.report.json`์œผ๋กœ ์ €์žฅ
- `scripts/check_quality.py`๋กœ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ์™€ ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰
- GitHub Actions `quality-check.yml` ์ถ”๊ฐ€
- `.env.example` ์ถ”๊ฐ€
- Docker Compose์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋ชจ๋ธ ์„ค์ •์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌ
- `CHANGELOG.md` ์ถ”๊ฐ€