π Modam: λλ©΄ λ μ λͺ¨μμ΄ μ΄λ €μ΄ μ¬λλ€μ μν AI μ§νμ κΈ°λ° μ±ν ν λ μ λͺ¨μ μλΉμ€
μ΄ νλ‘μ νΈλ AI κΈ°λ° λΉλλ©΄ λ μλͺ¨μ νλ«νΌμΌλ‘, μ¬μ©μκ° μκ°κ³Ό μ₯μμ μ μ½ μμ΄ μμ λ‘κ² ν λ‘ μ€μ¬μ λ μλͺ¨μμ μ°Έμ¬ν μ μλλ‘ λμ΅λλ€. GPTλ₯Ό νμ©νμ¬ μλμΌλ‘ λ°μ λ¬Έμ μμ±νκ³ , μ€μκ° μ±ν κ³Ό μμ½ κΈ°λ₯μ ν΅ν΄ λͺ¨μμ ν¨μ¨μ μΌλ‘ μ΄μν μ μμ΅λλ€.
λ³Έ νλ‘μ νΈλ λ€μκ³Ό κ°μ νμ€μ μ μ½κ³Ό μ¬μ©μ μꡬλ₯Ό ν΄κ²°νκ³ μ κΈ°νλμμ΅λλ€.
1) μκ°μ ·물리μ μ μ½
- νμ , μν, κ³Όμ λ±μΌλ‘ μ κΈ°μ μΈ μ€νλΌμΈ λͺ¨μ μ°Έμμ΄ μ΄λ €μ
- μ§λ°© κ±°μ£Όμμ κ²½μ°, λͺ¨μ μ₯μκΉμ§μ μ΄λ μκ°κ³Ό λΉμ©μ΄ λΆλ΄
2) μ¬λ¦¬μ λΆλ΄κ°
- λλ©΄ ν λ‘ μμ μ견μ νννλ κ²μ λΆμκ°μ΄λ κΈ΄μ₯κ°μ λλΌλ μ¬μ©μ μ‘΄μ¬
3) λͺ¨μ μ‘°μ§μ λΆλ΄
- λ°μ λ¬Έ μ€λΉ, μ°Έμ¬μ κ΄λ¦¬, νμ°¨ μ΄μ λ± λͺ¨μ μ£Όμ΅Β·μ΄μμ λν λΆλ΄
4) λͺ¨μ μ±μ¬ μ΄λ €μ
- λ§μ΄λν μ₯λ₯΄λ νΉμ μ£Όμ λ₯Ό μ’μνλ κ²½μ°, μ·¨ν₯μ΄ λ§λ μ°Έμ¬μ ν보μ μ΄λ €μ
5) ν λ‘ λ΄μ© μ 리μ μ΄λ €μ
- ν λ‘ ν λ΄μ©μ κΈ°λ‘νκ±°λ ꡬ쑰ννλ λ° μ΄λ €μμ λλΌλ©°, νμμ²λΌ μ 리λ κ²°κ³Όλ¬Όμ μ νΈνλ μ¬μ©μ μ‘΄μ¬
6) μ¨λΌμΈ μ±ν μ λν λΆμκ°
- μμ λ‘μ΄ ννμ μνμ§λ§, λΉμμ΄Β·νμ€ νν λ± λΆμ μ ν λ°μΈμ λν μ°λ €
μ΄λ¬ν λ¬Έμ λ€μ ν΄κ²°νκΈ° μν΄ λ³Έ νλ«νΌμ λ€μ κΈ°λ₯λ€μ μ 곡ν©λλ€.
1) GPT κΈ°λ° λ°μ λ¬Έ μλ μμ±μΌλ‘ μ€λΉ λΆλ΄ κ²½κ°
2) μ€μκ° μ±ν + AI νν°λ§μ ν΅ν μμ νκ³ μμ λ‘μ΄ ν λ‘ νκ²½ μ 곡
3) μμ½ κΈ°λ₯μΌλ‘ λͺ¨μ λ΄μ©μ μλ μ 리
4) λΉλλ©΄Β·μ΅λͺ κΈ°λ°μ μ¬λ¦¬μ μΌλ‘ μμ ν ν λ‘ κ³΅κ° λ§λ ¨
modam-project/
βββ backend/ # Spring Boot μλ²
βββ ai-server/ # Flask AI μλ²
βββ frontend/ # React νλ‘ νΈμλ
βββ docker-compose.yml
βββ .env # νκ²½λ³μ νμΌβοΈ λ°±μλ λλ ν 리 ꡬ쑰
π₯οΈ νλ‘ νΈμλ λλ ν 리 ꡬ쑰
π€ AIμλ² λλ ν 리 ꡬ쑰
- UI/UX μ¬μ©μ νλ©΄ κ΅¬μ± λͺ¨λ
:React μ»΄ν¬λνΈ κΈ°λ°μΌλ‘ μ 체 κΈ°λ₯μ μκ°μ μΈν°νμ΄μ€λ₯Ό κ΅¬μ± - μ¬μ©μ μΈμ¦ λͺ¨λ
: νμκ°μ λ° λ‘κ·ΈμΈ κΈ°λ₯ μ 곡, JWT ν ν° κΈ°λ° μΈμ¦ μ μ§ - μ±ν
νλ©΄ λ λλ§ λͺ¨λ
: STOMPμ SockJS κΈ°λ° WebSocket μ°κ²°λ‘ μ€μκ° μ±ν λ©μμ§λ₯Ό μμ νκ³ νλ©΄μ νμ. λΆμ μ λ©μμ§λ νν°λ§ λ°μ - λ
μ λͺ¨μ λ±λ‘ λ° μ°Έμ¬ λͺ¨λ
: μ λͺ¨μ μμ± λ° μ°Έμ¬, μλ²λ‘ λ°μ΄ν° μ μ‘, μλ΅μΌλ‘ λͺ¨μ λͺ©λ‘ λ λλ§ - λ
νκ° μμ± λ° λ©λͺ¨ μ μ₯ λͺ¨λ
: μ¬μ©μ κ°μλ¬Έ λ° λ©λͺ¨ μ λ ₯, μλ²μ μ μ₯ β λ°μ λ¬Έ μμ± λ° μμ½ μ νμ©
A[μ¬μ©μ μ
λ ₯] --> B[λ‘κ·ΈμΈ μμ² β JWT λ°κΈ]
B --> C[λͺ¨μ μμ± / μ°Έμ¬ β λͺ¨μ λͺ©λ‘ νμ]
C --> D[μ±ν
λ©μμ§ μ
λ ₯ β μ€μκ° μ μ‘ λ° λ λλ§]
D --> E[λ©λͺ¨ μμ± λ° μ μ₯ β AI μμ² μ νμ©]
E --> F[λͺ¨μ μ’
λ£ ν μμ½ μμ² β μμ½ κ²°κ³Ό μμ λ° νμ]
- μ¬μ©μ μΈμ¦ λͺ¨λ
: JWT κΈ°λ° μ¬μ©μ μΈμ¦ μ²λ¦¬ - ν΄λΌμ΄μΈνΈ/μλ² ν΅μ λͺ¨λ
: ν΄λΌμ΄μΈνΈ API μμ² λ° μλ΅ μ²λ¦¬ - μ±ν
λ°© κ΄λ¦¬ λͺ¨λ
: μ€μκ° μ±ν λ°© μμ± λ° μ°κ²° κ΄λ¦¬ - λ©μμ§ μ μ₯ λ° κ΄λ¦¬ λͺ¨λ
: μ±ν λ©μμ§ μ μ₯ λ° μμ½μ© λ°μ΄ν° κ΄λ¦¬ - AI λ©μμ§ μ²λ¦¬ λͺ¨λ
: AI μλ²μ λ©μμ§ μ λ¬ β μμ½/νν°λ§ κ²°κ³Ό μμ - λ°μ λ¬Έ μμ± μμ² λͺ¨λ
: λ νκ° κΈ°λ° λ°μ λ¬Έ μμ± μμ² μ²λ¦¬ - μμ½ μμ² λͺ¨λ
: μ 체 μ±ν λ‘κ·Έ μ μ‘ λ° μμ½ κ²°κ³Ό μ 곡 - νν°λ§ μμ² λͺ¨λ
: λΆμ μ λ°μΈ νμ§ μμ² λ° κ²°κ³Ό μ²λ¦¬
A[ν΄λΌμ΄μΈνΈ μμ²] --> B[JWT μΈμ¦ μ²λ¦¬]
B --> C[λͺ¨μ μμ± / μ°Έμ¬ β DB μ μ₯]
C --> D[WebSocket μ°κ²° β Redis μ€κ³ β μ±ν
μ μ₯]
D --> E[λͺ¨μ μ’
λ£ μ β AI μλ²λ‘ λ‘κ·Έ μ λ¬ β μμ½ κ²°κ³Ό μ 곡]
- μ
λ ₯ λ°μ΄ν° μ²λ¦¬ λͺ¨λ
: PyPDF2 + LangChainμΌλ‘ μ± PDF λΆν λ° μ μ²λ¦¬ - λ²‘ν° μλ² λ© λ° μ μ₯ λͺ¨λ
: HuggingFace λͺ¨λΈλ‘ μλ² λ© ν ChromaDBμ μ μ₯ - λ¬Έλ§₯ κΈ°λ° κ²μ λͺ¨λ (Retriever)
: λ νκ° κΈ°λ° κ΄λ ¨ λ¬Έλ¨ κ²μ - λ°μ λ¬Έ μμ± λͺ¨λ
: κ²μ λ¬Έλ¨ + λ νκ°μ GPT-4oμ μ λ¬ν΄ λ°μ λ¬Έ μμ± - μμ½ μμ± λͺ¨λ
: μ±ν λ‘κ·Έ β PromptTemplate β GPT-4o μμ½ μμ² - μ±ν
νν°λ§ λͺ¨λ
: KSSλ‘ λ¬Έμ₯ λΆλ¦¬ + ν€μλ νν°λ§ β KcELECTRA λͺ¨λΈ κΈ°λ° λ¬Έλ§₯ νλ¨ - API ν΅μ μ²λ¦¬ λͺ¨λ
: (Flask)REST API μμ² μμ β λ°μ λ¬Έ/μμ½/νν°λ§ κ²°κ³Ό μλ΅
A[λ
νκ° + book_id] --> B[ChromaDB κ²μ β μ μ¬ λ¬Έλ¨ μΆμΆ]
B --> C[ν둬ννΈ κ΅¬μ± β GPT-4o λ°μ λ¬Έ μμ±]
D[λͺ¨μ μ’
λ£ β μ 체 μ±ν
λ‘κ·Έ μμ ] --> E[GPT-4o μμ½ μμ² β κ²°κ³Ό μ μ₯ λ° λ°ν]
F[μ±ν
λ©μμ§ μμ ] --> G[KSS β ν€μλ νν° β KcELECTRA β κ²°κ³Ό λ°ν]
- Python 3.10 μ΄μ
- pip 23.x μ΄μ
- Java 17 μ΄μ
- Node.js 18 μ΄μ
- Docker, Docker Compose μ€μΉ
- Git μ€μΉ
git clone https://github.com/your-org/modam-project.git
cd modam-project- κ°μνκ²½ μ€μ
python -m venv venv
.\venv\Scripts\activate # (Windows)
source venv/bin/activate # (macOS / Linux)- ν¨ν€μ§ μ€μΉ
pip install -r requirements.txt- μ€ν
python app.pyνκ²½ λ³μ μ€μ
- .env νμΌ μμ±
modam-project 루νΈμ .env νμΌμ μμ±ν ν, μλ νμμ λ§μΆ° μμ±ν©λλ€.
.env λ―Όκ° μ 보λ κ°μΈ λ©μΌλ‘ κ΅μλκ» μ λ¬ν΄λλ Έμ΅λλ€.
#νλ‘μ νΈ λλ ν λ¦¬λ‘ μ΄λ
cd ../Modam
# .env μΆκ°
nano .env- .env νμΌμ μλμ λ΄μ© μΆκ°
#########################
# μλ² μ 보
#########################
# AI μλ² β Spring μλ² νΈμΆμ© μ£Όμ
SPRING_SERVER_URL=http://be-modam:8080
# Spring μλ² β AI μλ² νΈμΆμ© μ£Όμ
AI_SERVER_URL=http://ai-modam:5000
# React μλ²
WEBSOCKET_ALLOWED_ORIGIN=""
#########################
# MySQL μ€μ
#########################
MYSQL_ROOT_PASSWORD=""
SPRING_DATASOURCE_URL=jdbc:mysql://db-modam:3306/modam_db?serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME=""
SPRING_DATASOURCE_PASSWORD=""
#########################
# JWT μ€μ (Spring Security)
#########################
jwt.secret=""
jwt.expiration=86400000
#########################
# OpenAI API Key (Flask μ¬μ©)
#########################
OPENAI_API_KEY=""- .envλ₯Ό νμ¬ μμ μ μ©
cd Modam
set -a && source .env && set +a- νλ‘μ νΈ λ£¨νΈλ‘ μ΄λ
cd Modam- Docker μ€ν
docker compose up --build- μ΄κΈ° λ°μ΄ν° import pem key νμΌμ κ°μΈ λ©μΌλ‘ κ΅μλκ» μ λ¬ν΄λλ Έμ΅λλ€.
# EC2μ νμΌ λ³΅μ¬ (λ‘컬μμ μ€ν)
scp -i [pemκ²½λ‘] modam_db_fin.sql ubuntu@3.15.72.236:/home/ubuntu/
# Docker 컨ν
μ΄λμ 볡μ¬
docker cp modam_db_fin.sql db-modam:/modam_db_fin.sql
# MySQL 컨ν
μ΄λ μ μ
docker exec -it db-modam bash
# MySQL μ μ ν import
mysql -u modamuser -p modam_db < /modam_db_fin.sql- μμ‘΄μ± μ€μΉ
cd frontend
npm install
npm install @stomp/stompjs sockjs-client- μ€ν
npm startμ€ν ν λ€μ κ²½λ‘μμ νμΈ κ°λ₯:
νλ‘ νΈμλ μλ²: http://localhost:3000
λ°±μλ API: http://localhost:8080
Flask AI μλ²: http://localhost:5000
DB: localhost:3307 (λ΄λΆ ν¬νΈλ 3306)
-
μ¬μ΄νΈ μ μ
-
νμκ°μ , λ‘κ·ΈμΈ
- μ΄λ©μΌκ³Ό λΉλ°λ²νΈλ₯Ό μ΄μ©ν΄ νμκ°μ
μ νκ³ , λ‘κ·ΈμΈν©λλ€.
- ν
μ€νΈμ μ¬μ©ν κ³μ (μ΄λ©μΌ: test01@example.com/ λΉλ°λ²νΈ: pwpwpw01!)
- λ‘κ·ΈμΈμ νλ©΄ λ©μΈ νλ©΄μΌλ‘ μλ μ΄λλ©λλ€.
- μ΄λ©μΌκ³Ό λΉλ°λ²νΈλ₯Ό μ΄μ©ν΄ νμκ°μ
μ νκ³ , λ‘κ·ΈμΈν©λλ€.
-
λͺ¨μ λ±λ‘
- 'λͺ¨μ λ±λ‘'μ λλ¬ μ± μ λͺ©, λ μ§, μκ°, μ€λͺ μ μ λ ₯νλ©΄ λ μ λͺ¨μμ λ±λ‘ν μ μμ΅λλ€.
-
λͺ¨μ νμΈ
- λ±λ‘λμ΄ μλ λ μλͺ¨μ μ€ '1984'λ₯Ό ν΄λ¦νλ©΄ λͺ¨μλͺ , μ± μ λͺ©, μΌμ λ±μ μ 보λ₯Ό νμΈν μ μμ΅λλ€.
-
μ μ²ν λͺ¨μ νμΈ
- μμΈ νμ΄μ§μ λ€μ΄κ°μ μ°Έμ¬ μ μ²ν λͺ¨μμ νμΈν μ μμ΅λλ€.
-
λ νκ° μμ±
- '1984' λ
μ λͺ¨μμ μ ννκ³ 'λ
νκ° μμ±' λ²νΌμ ν΄λ¦ν©λλ€.
- λ νκ°μ μμ±νκ³ μ μΆ λ²νΌμ λλ₯΄λ©΄ λ±λ‘μ΄ λ©λλ€.
- '1984' λ
μ λͺ¨μμ μ ννκ³ 'λ
νκ° μμ±' λ²νΌμ ν΄λ¦ν©λλ€.
-
λͺ¨μ μ§ν(μ±ν )
- μμΈ νμ΄μ§μμ '1984' λͺ¨μμ λλ₯΄κ³ 'λͺ¨μ μ μ²' λ²νΌμ ν΄λ¦ν΄ λ
μ λͺ¨μμ μμν©λλ€.
- λͺ¨μ μ°Έμ¬ λ²νΌμ λλ₯΄λ©΄ κ°μ λͺ¨μμ μ°Έκ°μλ€κ³Ό μ€μκ°μΌλ‘ λ©μμ§λ₯Ό μ£Όκ³ λ°μ μ μμ΅λλ€.
- μ±ν
λ°©μ μ
μ₯νλ©΄ β(μ¬μ©μ μ΄λ¦)λμ΄ μ
μ₯νμ
¨μ΅λλ€β λ©μμ§κ° μλμΌλ‘ μΆλ ₯λ©λλ€.
- μ€μ λͺ¨μ μ§ν μ 4λͺ μ μ°Έμ¬μκ° νμνλ―λ‘, 4κ°μ μ°½μ λμ μλ‘ λ€λ₯Έ Gmail κ³μ μΌλ‘ λ‘κ·ΈμΈν΄ ν μ€νΈν©λλ€.
- Ex) νλμ λΈλΌμ°μ μμ μν¬λ¦Ών/κ²μ€νΈ λͺ¨λ λ±μΌλ‘ μΆκ° λ‘κ·ΈμΈ, λ€λ₯Έ λΈλΌμ°μ (Chrome, Edge, Firefox λ±)λ₯Ό λ³ν μ¬μ©
- ν μ€νΈ κ³μ 2: μ΄λ©μΌ β test02@example.com / λΉλ°λ²νΈ- pwpwpw02!
- ν μ€νΈ κ³μ 3: μ΄λ©μΌ β test03@example.com / λΉλ°λ²νΈ- pwpwpw03!
- ν μ€νΈ κ³μ 4: μ΄λ©μΌ β test04@example.com / λΉλ°λ²νΈ- pwpwpw04!
- λ©λͺ¨ κΈ°λ₯
- λ μλͺ¨μμ ν λ κΈ°λ‘ν κ²λ€μ λ©λͺ¨ μ΄κΈ° νμ λλ¬ μμ±ν©λλ€.
- μ¬μ©μλ λ©λͺ¨ κΈ°λ₯μ ν΅ν΄ λͺ¨μ μ€μ κΈ°λ‘μ ν μ μμ΅λλ€. μμ±ν λ©λͺ¨λ νμ λ«μλ λ΄μ©μ΄ μ μ§λλ©° μΆνμ βμλ£λ λ μλͺ¨μ νμΈβ νμ΄μ§μμ νμΈν μ μμ΅λλ€.
- λ©λͺ¨λ μΈμ λ μμ± λ° μμ κ°λ₯νλ©°, μ μ₯ λ²νΌμ λλ₯΄λ©΄ μ μ₯λ©λλ€.
- λ°μ λ¬Έ μμ±, μμ½
- μ°Έμ¬μκ° λͺ¨λ μ μ₯νλ©΄ AIλ μλμΌλ‘ λ°μ λ¬Έμ μμ±ν©λλ€.
- λͺ¨μμ΄ λλλ©΄ AIλ λͺ¨μμ μμ½νμ¬ μΆλ ₯νκ³ , μ΄λ₯Ό DBμ μ μ₯ν©λλ€.
- μμΈ νμ΄μ§μμ '1984' λͺ¨μμ λλ₯΄κ³ 'λͺ¨μ μ μ²' λ²νΌμ ν΄λ¦ν΄ λ
μ λͺ¨μμ μμν©λλ€.
-
μ°Έμ¬ν λ μλͺ¨μ νμΈ
- 'μΌλ£λ λ μλͺ¨μ' λ²νΌμ λλ₯΄κ³ '1984'λ₯Ό μ νν©λλ€.
- κ°κ°μ νμ λλ¬ μ°Έμ¬νλ λͺ¨μμ λ¨κΈ΄ μμ½λ λ΄μ©, μμ±ν λ νκ°, λ©λͺ¨λ₯Ό λ€μ μ΄λν μ μμ΅λλ€.
-
λ§μ΄νμ΄μ§
- ν€λμ 'λ§μ΄νμ΄μ§'λ₯Ό ν΄λ¦ν©λλ€.
- λλ€μκ³Ό λΉλ°λ²νΈλ₯Ό λ³κ²½ν μ μμ΅λλ€.

