Speak And Plan It!
ποΈ λ΄ λͺ©μλ¦¬λ‘ λΉλ΄λ λλ§μ νλλ, Splanet ποΈ
νλͺ© |
---|
π μκ° |
π μ£Όμ κΈ°λ₯ |
π» κΈ°μ μ€ν |
π μμ€ν μν€ν μ² |
ποΈ λ°μ΄ν°λ² μ΄μ€ ERD |
π λͺ¨λν°λ§ |
π€ AI νμΈ νλ |
π κ°λ° κ΄λ ¨ λΈλ‘κ·Έ |
π₯ νμ |
κ³νμ μΈμ°λ μΌ λ§μ κ³νμΈ μ¬λ¬λΆλ€κ» μ μ¬ν©λλ€.
Splanet μ λΉμ μ΄ ν΄μΌ ν μΌμ κΈ°λ°μΌλ‘, λΉμ μκ² λ§λ μΌμ νλ₯Ό μΆμ²ν΄λ립λλ€.
πΌ νλμΈμ μν λλν μΌμ 맀λμ
π£ λ§ νλ§λλ‘ λλλ μΌμ λ±λ‘
β μΉκ΅¬μ ν¨κ» λ μ¦κ²κ², λ ν¨μ¨μ μΌλ‘
π€ μ€λ§νΈν μΌμ κ΄λ¦¬λ‘ μκ° μ μ½
μ¬μ©μκ° ν΄μΌν μΌμ μ
λ ₯ν©λλ€.
λͺ©μλ¦¬λ‘ μ§μ λ§ν΄λ³΄μΈμ!
μμ± μΈμμ ν΅ν μ λ ₯ |
μ¬μ©μκ° μ
λ ₯ν μꡬμ¬νμ λ°νμΌλ‘ λ§μΆ€ νλμ μμ±ν©λλ€.
3κ°μ§μ μΆμ² νλ μ€ λ§μμ λλ κ²μ μ ννμΈμ!
μ¬μ©μλ λλκ·Έ μ€ λλ‘ λ° μΉ΄λ ν¬κΈ° μ‘°μ μ ν΅ν΄ νλμ μμ λ‘κ² κ΄λ¦¬ν μ μμ΅λλ€.
λλκ·Έ μ€ λλ‘ |
μΉ΄λ ν¬κΈ° μ‘°μ λ° μλ£ |
λ€λ₯Έ μ¬μ©μμ μΉκ΅¬λ₯Ό λ§Ίκ³ μλ‘μ νλμ 곡μ νλ©° λκΈμ λ¨κΈΈ μ μμ΅λλ€.
μΉκ΅¬ λͺ©λ‘ λ° μμ² |
νλ 곡μ λ° λκΈ |
μΉ νΈμ μλ¦Όμ ν΅ν΄ μΌμ μλ¦Όμ λ°μ μ μμ΅λλ€. (iOS νκ²½μμλ λΈλΌμ°μ β ν νλ©΄μ νμ΄μ§ μΆκ° μ΄ν μλ¦Όμ νμ©ν΄μΌν©λλ€.)
κ΅¬μ± μμ | μ€λͺ |
---|---|
λ°°ν¬ λ§ν¬ | νλ‘ νΈμλ (Vercel λ°°ν¬): https://www.splanet.co.kr λ°±μλ (EC2 λ°°ν¬): https://api.splanet.co.kr |
νλ‘ νΈμλ | νλ‘ νΈμλλ Vercelμμ λ°°ν¬λλ©°, Reactμ Viteλ‘ κ΅¬μ±λμ΄ μμ΅λλ€. |
λ°±μλ | λ°±μλλ AWS EC2 μΈμ€ν΄μ€μμ Docker 컨ν
μ΄λλ‘ λ°°ν¬λ©λλ€. MySQL(Amazon RDS) μ μ°λνμ¬ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ©°, Redisλ₯Ό ν΅ν΄ μΊμ± λ° ν ν°μ μ²λ¦¬ν©λλ€. |
무μ€λ¨ λ°°ν¬ (Blue-Green Deployment) | Elastic Load Balancer (ELB) λ₯Ό μ¬μ©νμ¬ λ κ°μ λ°±μλ μΈμ€ν΄μ€(Blueμ Green)λ‘ νΈλν½μ λΆμ°μμΌ λ¬΄μ€λ¨ λ°°ν¬λ₯Ό μ§μν©λλ€. μλ‘μ΄ λ²μ μ΄ λ°°ν¬λ λ, λ¨Όμ νλμ μλ² μ»¨ν μ΄λκ° μ λ°μ΄νΈλκ³ , μ΄ν ELBλ₯Ό ν΅ν΄ νΈλν½μ μ 컨ν μ΄λλ‘ μ ννμ¬ μ¬μ©μμκ² λκΉ μλ μλΉμ€λ₯Ό μ 곡ν©λλ€. (λ€μ΄νμ 1μ΄ λ―Έλ§) |
CI/CD νμ΄νλΌμΈ | GitHub Actionsλ₯Ό ν΅ν΄ μλνλ CI/CD νμ΄νλΌμΈμ ꡬμ±νμμΌλ©°, μ½λ μ λ°μ΄νΈκ° λ°μν λλ§λ€ Vercelκ³Ό EC2μμ μλμΌλ‘ λΉλ λ° λ°°ν¬κ° μ΄λ£¨μ΄μ§λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°κ³Ό λ°°ν¬ κ³Όμ μ ν¨μ¨μ±μ λμμ΅λλ€. |
ν μ΄λΈ | μ€λͺ |
---|---|
User | μ¬μ©μ μ 보(nickname , profile_image , kakao_id λ±)λ₯Ό μ μ₯ν©λλ€. |
μΉκ΅¬ κ΄κ³ | friend μ friend_request ν
μ΄λΈμ ν΅ν΄ μ¬μ©μ κ° μΉκ΅¬ κ΄κ³λ₯Ό κ΄λ¦¬ν©λλ€. |
ν | team , team_user_relation , team_invitation ν
μ΄λΈμ ν΅ν΄ μ¬μ©μμ ν μμ±, κ°μ
, μν μ κ΄λ¦¬ν©λλ€. |
FCM ν ν° | fcm_token ν
μ΄λΈλ‘ νΈμ μλ¦Ό ν ν°μ κ΄λ¦¬νκ³ , μλ¦Ό λ‘κ·Έλ notification_log ν
μ΄λΈμ μ μ₯λ©λλ€. |
κ³ν(Plan) | plan ν
μ΄λΈμ κ°μΈ κ³νμ, team_plan ν
μ΄λΈμ ν λ΄ κ³νμ κ΄λ¦¬νλ©°, κ³ν μ 보μ μλ£ μ¬λΆλ₯Ό κΈ°λ‘ν©λλ€. |
ꡬλ (Subscription) | subscription ν
μ΄λΈμ μ¬μ©μμ ꡬλ
μνλ₯Ό, payment ν
μ΄λΈμ ꡬλ
κ²°μ λ΄μμ κΈ°λ‘ν©λλ€. |
λκΈ(Comment) | comment ν
μ΄λΈμμ κ° user μ μμ±λ λκΈμ κ΄λ¦¬νλ©°, μμ±μμ μ μ IDλ₯Ό μ°κ²°ν©λλ€. |
ID: splanet
PW: splanet3
Amazon CloudWatch
λ₯Ό νμ©νμ¬ μμ€ν
μ±λ₯μ λͺ¨λν°λ§νκ³ , Log κ·Έλ£Ήκ³Ό μ¬μ©μ μ μ Logλ₯Ό μμ±ν΄ μλΉμ€ μνμ μ€λ₯ λ‘κ·Έλ₯Ό κ΄λ¦¬ν©λλ€.
Docker Compose
λ₯Ό ν΅ν΄ μΉ μ ν리μΌμ΄μ
μ ꡬμ±νλ©°, κ° μ»¨ν
μ΄λμ λ΄λΆ λ‘κ·Έλ₯Ό μΈλΆ νμΌλ‘ λκΈ°ννμ¬ μ€μκ° λ‘κ·Έ μμ§μ΄ κ°λ₯ν©λλ€.
Grafana
μ Prometheus
λ₯Ό κ²°ν©νμ¬ μκ°νλ λμ보λλ₯Ό μ 곡νκ³ , μ ν리μΌμ΄μ
λ° μΈνλΌμ€νΈλμ²μ λ€μν λ©νΈλ¦μ μ€μκ°μΌλ‘ λͺ¨λν°λ§ν©λλ€.
μ΄λ₯Ό ν΅ν΄ CPU μ¬μ©λ, λ©λͺ¨λ¦¬ μ¬μ©λ, λ€νΈμν¬ νΈλν½, μμ² μ λ± μ£Όμ μ±λ₯ μ§νλ₯Ό μ§κ΄μ μΌλ‘ νμ ν μ μμ΅λλ€.
μ΄λ¬ν λͺ¨λν°λ§ λ° λ‘κ·Έ κ΄λ¦¬ μμ€ν μ ν΅ν΄ μμ€ν μμ μ±κ³Ό μλΉμ€ κ°μ©μ±μ λμμ΅λλ€.
νλͺ© | μ€λͺ |
---|---|
MAU (Monthly Active Users) | μ΅κ·Ό 30μΌκ°μ μκ° νμ± μ¬μ©μ μλ₯Ό λνλ λλ€. |
DAU (Daily Active Users) | μ΅κ·Ό 7μΌκ°μ μΌκ° νμ± μ¬μ©μ μλ₯Ό λνλ λλ€. |
μνμ½λ μ§ν | 1μκ° κΈ°μ€μΌλ‘ μ±κ³΅ μμ²(success_requests), ν΄λΌμ΄μΈνΈ μλ¬(client_error_requests), 리λλ μ μμ²(redirect_requests)μ λΉμ¨μ λνλ λλ€. |
λμ μ μμ | μ΅κ·Ό 24μκ° λμμ λμ μ μ μ¬μ©μ μλ₯Ό νμν©λλ€. |
DB Connections | λ°μ΄ν°λ² μ΄μ€ μ°κ²° μνλ₯Ό λνλ λλ€. νΉμ μκ°λμ μ°κ²° μκ° μ¦κ°νλ ν¨ν΄μ 보μ¬μ€λλ€. |
DB λΉ κ³΅κ° | RDSμ FreeStorageSpace μ§νλ‘, λ°μ΄ν°λ² μ΄μ€ μΈμ€ν΄μ€μ μ¬μ© κ°λ₯ν μ μ₯ 곡κ°μ λνλ λλ€. |
CPU μ¬μ©λ | μμ€ν μ CPU μ¬μ©λμ λνλ΄λ©°, μκ°λλ³ CPU μ¬μ©λ₯ λ³νλ₯Ό 보μ¬μ€λλ€. |
λ€νΈμν¬ μμ²/μμ | λ€νΈμν¬ μμ² μμ μμ λ λ°μ΄ν°λ₯Ό μκ°λλ³λ‘ λνλ΄λ©°, μμ² μμ λ³νλ₯Ό μκ°μ μΌλ‘ μ 곡ν©λλ€. |
Request Count | API μμ² μλ₯Ό λνλ λλ€. μ΅κ·Ό μμ² μμ λ³νλ₯Ό 보μ¬μ£Όλ κ·Έλνμ λλ€. |
μ΄λΉ μ½κΈ°/μ°κΈ° μμ μ | μμ€ν μμ μ΄λΉ μ½κΈ° λ° μ°κΈ° μμ μλ₯Ό 보μ¬μ€λλ€. |
κ²½λ‘λ³ μμ² μ | κ° API κ²½λ‘λ³λ‘ μμ² μλ₯Ό λνλ΄λ©°, κ°μ₯ λ§μ΄ νΈμΆλ κ²½λ‘ μμΌλ‘ μ λ ¬λ©λλ€. ) |
Splanetμ OpenAI APIλ₯Ό νμ©νμ¬
chatGPT 4o mini
λͺ¨λΈμ κΈ°λ°μΌλ‘ ν μ§λ₯ν μΌμ κ΄λ¦¬ κΈ°λ₯μ μ 곡ν©λλ€.JSONL νμμ νμ΅ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ λͺ¨λΈμ μ¬μ©μ μꡬμ¬νκ³Ό 컨ν μ€νΈμ λ§κ² fine-tunning μ μ§ννμμ΅λλ€.
JSONL νμ΅ λ°μ΄ν° νμ
{
"messages": [
{
"role": "user",
"content": "\"μ€λ 22μμ μ½μ μμ\" μ 곡λ κ°μ΄λλΌμΈμ λ°λ₯΄μ§ μμΌλ©΄ νλν°κ° λΆκ³Όλ κ²μ
λλ€. λͺ¨λ μ§μΉ¨μ μ£ΌμκΉκ² μ½κ³ κ·Έμ λ°λΌ νλνμΈμ. (κΈ°μ‘΄ startDateμ endDateμ¬μ΄μ μΌμ μ μμ±νμ§ λ§μμ€. κΈ°μ‘΄ startDate, endDate:[{\"startDate\": \"2024-11-13T18:30:00\", \"endDate\": \"2024-11-13T20:30:00\"}] νμ¬ μκ° μ΄νλ‘ μ¬μ μκ² λͺ¨λ μΌμ μ μμν μ μλλ‘ κ³νν΄μ€ . μνμ΄λ κ³Όμ κ° ν¬ν¨λ κ²½μ°, μν λΉμΌμ΄λ μ μΆ λΉμΌμ΄ μλ μ λ κΉμ§ μ€λΉκ° μλ£λλλ‘ ν΄μ€ νμ¬ μκ°: (2024-11-13T20:41:00 κΈ°μ€). λͺ¨λ μΌμ μ νκ΅ μκ°(UTC+9)μ κΈ°μ€μΌλ‘ μ€μ ν΄μ€. λν, κΈ°μ‘΄ μΌμ μ μκ°νκ³ μλ‘μ΄ μΌμ μ μ λΉν κ°κ²©μ λκ³ λ°°μΉν΄μ€.)"
},
{
"role": "assistant",
"content": "{\"deviceId\": \"<USER_DEVICE_ID>\", \"groupId\": <GROUP_ID>, \"planCards\": [{\"title\": \"μ½μ\", \"description\": \"μ€λ 22μμ μμνλ μ½μ\", \"startDate\": \"2024-11-13T22:00:00\", \"endDate\": \"2024-11-13T23:00:00\", \"accessibility\": true, \"isCompleted\": false}]}"
}
]
}
-
μ¬μ©μ μ λ ₯ (Role:
user
)- μ¬μ©μκ° λͺ¨λΈμ μ 곡νλ ν둬ννΈλ μ§μμ¬νμ ν¬ν¨ν©λλ€.
- μΌμ μΆ©λ λ°©μ§, μ€λΉ λ§κ° κΈ°ν λ± κ΅¬μ²΄μ μΈ μ μ½ μ‘°κ±΄μ ν¬ν¨ν©λλ€.
-
λͺ¨λΈ μλ΅ (Role:
assistant
)- νμΈ νλλ λͺ¨λΈμ JSON νμ μλ΅μ ν¬ν¨ν©λλ€.
- μμ μλ΅:
deviceId
: μ¬μ©μμ κΈ°κΈ° μλ³μ.groupId
: κ΄λ ¨ κ·Έλ£Ήμ μλ³μ(μλ κ²½μ°).planCards
: μΌμ κ°μ²΄ λ°°μ΄λ‘ ꡬμ±.title
: μ΄λ²€νΈ μ λͺ©.description
: μ΄λ²€νΈ μ€λͺ .startDate
: ISO 8601 νμμ μ΄λ²€νΈ μμ μκ°.endDate
: ISO 8601 νμμ μ΄λ²€νΈ μ’ λ£ μκ°.accessibility
: μ΄λ²€νΈ μ κ·Ό κ°λ₯ μ¬λΆ.isCompleted
: μ΄λ²€νΈ μλ£ μ¬λΆ.
νμΈ νλ κ°μ΄λλΌμΈ
-
νμ΅ λ°μ΄ν° μ€λΉ
- ν둬ννΈμ μλ΅μ΄ JSONL νμμ λ°λ₯΄λλ‘ λ³΄μ₯ν©λλ€.
- μΌμ μΆ©λ, μ€λΉ λ§κ° κΈ°ν λ± λ€μν μ¬μ©μ μλ리μ€λ₯Ό ν¬ν¨νμ¬ ν μ€νΈν©λλ€.
-
λͺ¨λΈ νμΈ νλ
- μ€λΉλ JSONL λ°μ΄ν°μ μ μ¬μ©νμ¬ OpenAIμ νμΈ νλ APIλ‘ νμ΅μν΅λλ€.
-
ν μ€νΈ λ° κ²μ¦
- λͺ¨λΈ μλ΅μ κ²μ¦νμ¬ μνλ μΌμ κ΄λ¦¬ λ Όλ¦¬μ μ μ½ μ‘°κ±΄μ λΆν©νλμ§ νμΈν©λλ€.
μλ΅ μμ
{
"deviceId": "<USER_DEVICE_ID>",
"groupId": "<GROUP_ID>",
"planCards": [
{
"title": "μ½μ",
"description": "22μμ μ½μ λκ°κΈ°",
"startDate": "2024-11-13T22:00:00",
"endDate": "2024-11-13T23:00:00",
"accessibility": true,
"isCompleted": false
}
]
}
- JSONL νμμΌλ‘ νμ΅ λ°μ΄ν°λ₯Ό μμ±ν©λλ€.
- OpenAIμ νμΈ νλ APIλ₯Ό μ¬μ©νμ¬ λͺ¨λΈμ νμ΅μν΅λλ€.
- λͺ¨λΈμ λ°°ν¬νκ³ μΌμ κ΄λ¦¬ μ ν리μΌμ΄μ μ ν΅ν©ν©λλ€.
μ κ³Όμ μ ν΅ν΄ Splanet ν₯μλ μΌμ κ΄λ¦¬ κΈ°λ₯μ μ 곡ν μ μλ μ΅μ νλ νμΈ νλ λͺ¨λΈμ ꡬμΆν μ μμ΅λλ€.
μ€λͺ | λ§ν¬ | μ€λͺ | λ§ν¬ |
---|---|---|---|
μΉ νΈμ μλ¦Ό - μ€μΌμ€λ§ 쿼리 μ΅μ ν | Blog | GPT Model Fine-Tuning κ³Όμ | Blog |
CLOVA Speech μ€μκ° μ€νΈλ¦¬λ° | Blog | λͺ¨λν°λ§ | Blog |
Redis μ¬μ©κΈ° | Blog | 무μ€λ¨ λ°°ν¬ κ΅¬ν | Blog |
μ 체μ μΈ λ΄μ©μ λ΄μ Medium Medium