λ¬Έμ μ§μ μ§μ λ§λ€κ±°λ, AIΒ·OCRλ‘ μλ μμ±νκ³ , CBT νκ²½μμ νκ³ , μ€λ΅μ λΆμνλ μ¬μΈμ νμ΅ νλ«νΌ
| λ°©μ | μ€λͺ |
|---|---|
| π μ§μ λ§λ€κΈ° | κ°κ΄μ / μ£Όκ΄μ λ¬Έμ , μ λ΅ λ° ν΄μ€μ μ§μ μ λ ₯ |
| π€ AI μλ μμ± | μ£Όμ (μ: "μ 보μ²λ¦¬κΈ°μ¬")λ₯Ό μ λ ₯νλ©΄ GPT-4o miniκ° λ¬Έμ λ₯Ό μλ μΆμ |
| π· OCR μ΄λ―Έμ§ λ³ν | μνμ§Β·κ΅μ¬ μ¬μ§Β·PDFλ₯Ό μ λ‘λνλ©΄ AI Visionμ΄ ν μ€νΈλ₯Ό μΈμν΄ λμ§νΈ λ¬Έμ μ§μΌλ‘ λ³ν |
- CBT νκ²½: μ€μ μνκ³Ό μ μ¬ν νμ΄λ¨Έ UIμμ λ¬Έμ νμ΄
- μλ μ±μ : μ μΆ μ¦μ μ μΒ·μ λ΅ μ¬λΆΒ·ν΄μ€ νμΈ
- μ€λ΅λ ΈνΈ: νλ¦° λ¬Έμ λ₯Ό μ μ₯νκ³ λ§μ΄νμ΄μ§μμ μΈμ λ 볡μ΅
- π ν΄λ κ΄λ¦¬: λλκ·Έ μ€ λλ‘μΌλ‘ λ¬Έμ μ§μ ν΄λλ³ μ 리
- λΆλ§ν¬: λ€λ₯Έ μ¬μ©μμ λ¬Έμ μ§μ λ΄ λ³΄κ΄ν¨μ μ μ₯
- νμ΅ ν΅κ³: νΌ λ¬Έμ μ, μ λ΅λ₯ , μ΅κ·Ό κΈ°λ‘μ λμ보λμμ μ‘°ν
- λμ보λ: μ 체 νμ μ, λ¬Έμ μ§ μ λ± νλ«νΌ νν© λͺ¨λν°λ§
- μ½ν μΈ κ΄λ¦¬: λΆμ μ ν λ¬Έμ μ§ μμ λ° νμ κ΄λ¦¬
- Java 17+ / Jakarta EE 10 (Servlet 6.1 κΈ°λ° MVC)
- Apache Tomcat 10.1 (WAS)
- MySQL 8.0 + JDBC (μμ SQL, ORM λ―Έμ¬μ©)
- JSP (μλ² μ¬μ΄λ λ λλ§)
- Tailwind CSS (μ νΈλ¦¬ν° νΌμ€νΈ μ€νμΌλ§)
- Vanilla JS (Fetch API, λλκ·Έ μ€ λλ‘)
| λΌμ΄λΈλ¬λ¦¬ | μ©λ |
|---|---|
| OpenAI GPT-4o mini | λ¬Έμ μλ μμ± (ν μ€νΈ + Vision) |
| Tess4J 5.9 | OCR ν μ€νΈ μΈμ (νκ΅μ΄Β·μμ΄) |
| JBCrypt | λΉλ°λ²νΈ λ¨λ°©ν₯ μνΈν |
| Gson 2.11 | JSON νμ± λ° μ§λ ¬ν |
| Commons FileUpload2 | λ©ν°ννΈ νμΌ μ λ‘λ μ²λ¦¬ |
Quizi/
βββ src/main/java/com/quizi/
β βββ controller/ # Servlet 컨νΈλ‘€λ¬ (μμ² μ²λ¦¬)
β β βββ LoginController.java
β β βββ MainController.java
β β βββ CreateController.java
β β βββ SolveController.java
β β βββ AiGenController.java
β β βββ OcrController.java
β β βββ AdminController.java
β β βββ ...
β βββ dao/ # λ°μ΄ν° μ κ·Ό κ°μ²΄ (DB 쿼리)
β β βββ UserDAO.java
β β βββ WorkbookDAO.java
β β βββ FolderDAO.java
β β βββ SolveHistoryDAO.java
β β βββ WrongNoteDAO.java
β βββ dto/ # λ°μ΄ν° μ μ‘ κ°μ²΄ (λͺ¨λΈ)
β β βββ UserDTO.java
β β βββ WorkbookDTO.java
β β βββ QuestionDTO.java
β β βββ FolderDTO.java
β βββ service/ # λΉμ¦λμ€ λ‘μ§
β β βββ AiService.java # OpenAI API μ°λ (ν
μ€νΈΒ·μ΄λ―Έμ§)
β β βββ OCRService.java # Tess4J OCR μ²λ¦¬
β βββ util/
β βββ DBConnection.java # JDBC μ°κ²°
β βββ ConfigManager.java # νκ²½λ³μ / μ€μ νμΌ λ‘λ
βββ src/main/webapp/
β βββ views/ # JSP λ·°
β β βββ main.jsp # λ©μΈ (λ¬Έμ μ§ νμ)
β β βββ create.jsp # λ¬Έμ μ§ μμ±
β β βββ solve.jsp # λ¬Έμ νκΈ°
β β βββ result.jsp # μ±μ κ²°κ³Ό
β β βββ mypage.jsp # λ§μ΄νμ΄μ§
β β βββ admin.jsp # κ΄λ¦¬μ νμ΄μ§
β β βββ ...
β βββ index.jsp # μ§μ
μ (β /main 리λ€μ΄λ νΈ)
β βββ WEB-INF/
β βββ web.xml
β βββ tessdata/ # OCR μΈμ΄ λ°μ΄ν° (kor, eng)
βββ pom.xml
- JDK 17 μ΄μ
- Apache Tomcat 10.1 μ΄μ
- MySQL 8.0
- Maven 3.6+
CREATE DATABASE quiz_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE quiz_platform;
-- μμΈ μ€ν€λ§: /src/main/resources/db_schema.sql μ°Έμ‘°
-- μ£Όμ ν
μ΄λΈ: users, workbooks, questions, question_options,
-- solve_history, wrong_notes, folders, bookmarkssrc/main/resources/config.properties νμΌμ μμ±νκ³ μλ λ΄μ©μ μ
λ ₯ν©λλ€.
db.url=jdbc:mysql://localhost:3306/quiz_platform?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
db.username=your_db_username
db.password=your_db_password
openai.api.key=sk-your-openai-api-keyλ°°ν¬ νκ²½μμλ νκ²½λ³μ(
DB_URL,DB_USERNAME,DB_PASSWORD,OPENAI_API_KEY)λ‘λ μ€μ κ°λ₯ν©λλ€. νκ²½λ³μκ° μ°μ μ μ©λ©λλ€.
# μμ‘΄μ± μ€μΉ λ° WAR νμΌ λΉλ
./mvnw clean package
# IDE μ¬μ© μ
# Tomcat μλ² κ΅¬μ± β Artifact(Quizi:war exploded) λ°°ν¬ β μλ² μ€νμ μ: http://localhost:8080/Quizi
λ¬Έμ μ§ μμ±Β·μμ μ workbooksμ questions ν
μ΄λΈμ΄ ν¨κ» λ³κ²½λλ―λ‘, setAutoCommit(false)λ‘ λ¨μΌ νΈλμμ
μΌλ‘ λ¬Άμ΄ λ°μ΄ν° 무결μ±μ 보μ₯ν©λλ€. μ€λ₯ λ°μ μ rollback()μΌλ‘ μμμ±μ μ μ§ν©λλ€.
- λΉλ°λ²νΈλ JBCryptλ‘ λ¨λ°©ν₯ ν΄μ±νμ¬ μ μ₯
- API KeyΒ·DB μ 보λ
config.propertiesμ νκ²½λ³μλ‘ λΆλ¦¬ (ConfigManager) - κ΄λ¦¬μ κΆν 체ν¬:
sessionμuser.role == ADMINκ²μ¦
GPT-4o miniμ μλ΅μ ν¬ν¨λ μ μλ Markdown μ½λλΈλ‘(```json)μ μ κ·μμΌλ‘ μ κ±°νκ³ , Gsonμ μ μ°ν νμ±μΌλ‘ λ€μν JSON μλ΅ κ΅¬μ‘°μ λμν©λλ€.
javax.* λμ jakarta.* ν¨ν€μ§ κΈ°λ° λΌμ΄λΈλ¬λ¦¬(commons-fileupload2-jakarta, jstl-api 3.0)λ₯Ό μ¬μ©νμ¬ μ΅μ Tomcat νκ²½κ³Όμ νΈνμ±μ ν보νμ΅λλ€.
νκ²½λ³μλ₯Ό μ°μ μ‘°ννκ³ , μμΌλ©΄ config.propertiesλ₯Ό μ½λ λ°©μμΌλ‘ λ‘컬 κ°λ°κ³Ό λ°°ν¬ νκ²½μ λͺ¨λ μ§μν©λλ€.
This project is licensed under the MIT License.