"μ± μ₯ μ¬μ§ ν μ₯μΌλ‘ μμ±λλ λλ§μ μ€λ§νΈ μμ¬"
μ΄ νλ‘μ νΈλ μ±
μ₯ μ¬μ§μ μ°μΌλ©΄ AIκ° μ±
λ±μ μΈμνμ¬ μλμΌλ‘ λμ μ 보λ₯Ό μ 리ν΄μ£Όλ μΉ μ ν리μΌμ΄μ
μ
λλ€.
Google Geminiμ κ°λ ₯ν λΉμ μΈμ λ₯λ ₯κ³Ό λ€μ΄λ² μ±
κ²μ API, Google Books APIλ₯Ό κ²°ν©νμ¬ νκ΅ μ±
κ³Ό μΈκ΅ μ±
λͺ¨λ μ ννκ³ νλΆν λμ μ 보λ₯Ό μ 곡ν©λλ€.
-
πΈ AI 촬μ λ° λΆμ
- μ± μ₯μ΄ λμ¨ μ¬μ§μ μ λ‘λνκ±°λ λ°λ‘ 촬μνλ©΄, Google Gemini 2.0 Flash λͺ¨λΈμ΄ μ΄λ―Έμ§ λ΄μ λͺ¨λ μ± λ±μ λΆμνμ¬ μ λͺ©, μ μ, μΆνμ¬λ₯Ό μΆμΆν©λλ€.
-
π μλ λ°μ΄ν° 보μ (Auto Enrichment)
- AIκ° μ½μ΄λΈ μ 보λ₯Ό λ°νμΌλ‘ λ€μ΄λ² μ± κ²μ APIμ Google Books APIλ₯Ό μ€μκ°μΌλ‘ μ‘°ννμ¬ ISBN, μ€κ±°λ¦¬, μΆνμΌ, μ μ νμ§ μ΄λ―Έμ§λ₯Ό μλμΌλ‘ μ±μ λ£μ΅λλ€.
- λ€μ΄λ² API μ°μ κ²μ: νκ΅ μ± νμ§ κ²μλ₯ λν ν₯μ
- μ€λ³΅ λ°©μ§: ISBN λλ μ λͺ©+μ μλ‘ μ€λ³΅ μ μ₯ λ°©μ§
-
π΅οΈ κΌΌκΌΌνκ² λ€μ μ°ΎκΈ° (Deep Retry)
- νμ§λ μ λ³΄κ° λλ½λ μ± μ΄ μλ€λ©΄? "κΌΌκΌΌνκ² λ€μ μ°ΎκΈ°" λ²νΌ νλλ‘ AIκ° κ²μ 쑰건μ μννμ¬(λΆμ μ κ±°, ν€μλ κ²μ λ±) μ§μνκ² μ 보λ₯Ό μ°Ύμλ λλ€.
-
π μμ λ΄λ³΄λ΄κΈ° (Excel Export)
- μ 리λ λλ§μ μμ¬ λͺ©λ‘μ ν΄λ¦ ν λ²μΌλ‘
.xlsxμμ νμΌλ‘ λ€μ΄λ‘λν μ μμ΅λλ€.
- μ 리λ λλ§μ μμ¬ λͺ©λ‘μ ν΄λ¦ ν λ²μΌλ‘
-
π¨ κ°μ±μ μ΄κ³ μ§κ΄μ μΈ UI
- ν|μ λͺ¨λ: νκ΅μ΄/μμ΄ μΈμ΄ μ ν μ§μ
- λ μ λͺ μΈ: λΆμ μ€ 50κ°μ λ μ λͺ μΈμ λλ€μΌλ‘ νμ
- μΉ΄μ΄νΈλ€μ΄: 5μ΄ μλ λΆμ μμ κΈ°λ₯
- Dynamic UX: μλκ° λμΉλ λΆμ λ‘λ© λ°μ λ°μν λμμΈμΌλ‘ μ§λ£¨ν ν μλ μ¬μ©μ κ²½νμ μ 곡ν©λλ€.
μ΄ νλ‘μ νΈλ AWS EC2 νκ²½ μμ LAMP Stack κΈ°λ°μΌλ‘ ꡬμΆλμμ΅λλ€.
- Server: AWS EC2 (Linux)
- Web Server: Apache HTTP Server
- Language: PHP 8.x
- Database: MySQL (MariaDB)
- Core: HTML5, JavaScript (Vanilla ES6+)
- Styling: Tailwind CSS (CDN λ°©μ, No Build Tool)
- Libraries: SheetJS (xlsx) for Excel export, FontAwesome for icons
- Vision AI: Google Gemini API (
gemini-2.0-flash) - Data Source:
- λ€μ΄λ² μ± κ²μ API (νκ΅ μ± μ°μ )
- Google Books API (μΈκ΅ μ± /ν΄λ°±)
/opt/bitnami/apache/htdocs/BOOKSCAN/
βββ index.html # λ©μΈ UI (μ±κΈ νμ΄μ§ μ ν리μΌμ΄μ
)
βββ api_vision.php # ν΅μ¬ λ‘μ§: μ΄λ―Έμ§ μ
λ‘λ -> Gemini λΆμ -> 1μ°¨ DB μ μ₯
βββ api_retry_enrich.php # 보μ λ‘μ§: λλ½λ μ 보 μ¬κ²μ λ° μ
λ°μ΄νΈ
βββ api_books.php # μ‘°ν λ‘μ§: DBμ μ μ₯λ λμ λͺ©λ‘ μ‘°ν (JSON)
βββ api_reset.php # μ΄κΈ°ν λ‘μ§: λͺ¨λ λ°μ΄ν° μμ
βββ config.php # νκ²½ λ³μ λ° μ€μ κ΄λ¦¬
βββ common.php # κ³΅ν΅ ν¨μ λͺ¨λ (API μμ², λ‘κΉ
λ±)
βββ db_connect.php # λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ€μ
βββ init_db.sql # λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§
βββ .env # νκ²½ λ³μ (μλ²μλ§ μ‘΄μ¬)
βββ uploads/ # μ
λ‘λλ μ±
μ₯ μ΄λ―Έμ§ μ μ₯μ
PHP 8.xμ MySQLμ΄ μ€μΉλ μΉ μλ²(Apache/Nginx)κ° νμν©λλ€.
mysql -u root -p < init_db.sqlμλ²μ .env νμΌμ μμ±ν©λλ€:
cp .env.example .env
nano .env # λλ μνλ μλν°λ‘ νΈμ§.env.example νμΌμ μ°Έκ³ νμ¬ μ€μ κ°μΌλ‘ μμ νμΈμ.
- Google Gemini API: Google AI Studio
- νμ κΆν: Generative Language API (Gemini)
- λ€μ΄λ² μ±
κ²μ API: λ€μ΄λ² κ°λ°μ μΌν°
- μ ν리μΌμ΄μ λ±λ‘ β "κ²μ" API μ ν
- Client ID, Client Secret λ°κΈ
chmod 755 uploads/ chmod 666 app.log debug_log.txt
./deploy.sh
- λμ©λ μ΄λ―Έμ§ μ²λ¦¬ μ μλ² νμμμμ λ°©μ§νκΈ° μν΄ λ‘μ§μ μ΅μ ν
- ν΄λΌμ΄μΈνΈ μΈ‘μμ λΉλκΈ°(
fetch) μ²λ¦¬λ‘ UX κ°μ - λ€μ΄λ² API μ°μ κ²μμΌλ‘ νκ΅ μ± κ²μ μλ ν₯μ
- μ λ‘λλ μ΄λ―Έμ§λ μ λν¬ν νμΌλͺ μΌλ‘ μ μ₯
- SQL Injection λ°©μ§λ₯Ό μν΄ PDO Prepared Statement μ¬μ©
- νμΌ μ λ‘λ κ²μ¦ (νμ , ν¬κΈ°, MIME νμ )
- νκ²½ λ³μλ‘ λ―Όκ°ν μ 보 κ΄λ¦¬
- μ€λ³΅ λ°©μ§: ISBN λλ μ λͺ©+μ μλ‘ μ€λ³΅ μ μ₯ λ°©μ§
- μλ¬ μ²λ¦¬: μμΈν μλ¬ λ‘κΉ λ° μ¬μ©μ μΉνμ λ©μμ§
- νΈλμμ : λ°μ΄ν° μΌκ΄μ± 보μ₯
- λ‘κΉ μμ€ν : ꡬ쑰νλ λ‘κ·Έ λ 벨 κ΄λ¦¬
- λͺ¨λν: κ³΅ν΅ ν¨μλ₯Ό
common.phpλ‘ λΆλ¦¬ - μ€μ κ΄λ¦¬:
config.phpλ‘ μ€μνλ μ€μ κ΄λ¦¬ - λ°°ν¬ μλν:
deploy.shμ€ν¬λ¦½νΈλ‘ κ°νΈν λ°°ν¬
- CHANGELOG.md - λ³κ²½ μ΄λ ₯
- DEPLOYMENT_GUIDE.md - λ°°ν¬ κ°μ΄λ
- SETUP_GUIDE.md - μ€μ κ°μ΄λ
κ°λ°μ: Jinho Jung
λΌμ΄μ μ€: MIT
λ²μ : 2.0