[๐งโ๐ป] Keymory ๊ฐ๋ฐ ์ผ์ง #6: ChatPage ์ต์ ํ, DiaryPage ํตํฉ
โจ GPT์ ์์ฝ ใ
ChatPage์ ๋ฐ์ดํฐ ๋ก๋ฉ๊ณผ Action๋ค์ ์ต์ ํํ๊ณ , Title ๋ฐ ๋ ์ง CRUD ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉฐ, DiaryPage์ Create/Edit ๊ตฌ์กฐ๋ฅผ ํตํฉํ ํ๋ฃจ. ์ฌ๋ฌ ์ด์๋ฅผ ํด๊ฒฐํ๋ฉฐ ์์คํ ์ ์์ ์ฑ์ ๋์๋ค.
๐ป ๊ฐ๋ฐ ์ผ์ง
โฐ ์ค๋ ํ ์ผ
- โ
DiaryPage: Merge CreateDiary/EditDiary Page
- isEditMode page state ํ์ฉ
- conditional value/visibility/action ๋ฑ ํ์ฉ
- โ ChatPage: On Page Load -> Read ChatDoc, CharacterDoc, MessageDocList and Update Page States
- โ ChatPage: ๊ฐ์ข Action๋ค ์ด์ฒด์ ์ผ๋ก ์ต์ ํ ๋ฐ ์ฌ๊ตฌ์ฑ
- โ ChatPage: Title CRUD
- โ ChatPage: ๋ ์ง CRUD
- โ (์ด์) ChatPage: ์ฒ์ ๋ํ ์์ ์, default init message ๋จ๊ณ ์์.
- โ (์ด์) ChatPage - ChatHistoryDrawer: UI ์ค๋ฒํ๋ก์ฐ
- โ (์ด์) ChatPage: ์ ์ ๋ฉ์์ง ๋น ์นธ์ด์ด๋ ์ ์ก๋จ
๐ฏ ํ ์ผ์ ๋ํ ์์ฝ
-
ChatPage ๊ธฐ๋ฅ ์ต์ ํ
- On Page Load ์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ต์ ํ (ChatDoc, CharacterDoc, MessageDocList)
- ChatPage์ ์ฃผ์ Action๋ค์ ์ด์ฒด์ ์ผ๋ก ์ต์ ํ ๋ฐ ์ฌ๊ตฌ์ฑ
- Title ๋ฐ ๋ ์ง CRUD ๊ธฐ๋ฅ ์ถ๊ฐ
- ChatHistoryDrawer UI ์ค๋ฒํ๋ก์ฐ ๋ฐ ์ ์ ๋ฉ์์ง ๋น ์นธ ์ ์ก ๋ฌธ์ ํด๊ฒฐ
-
DiaryPage ๊ฐ์
- CreateDiary/EditDiary Page ํตํฉ (isEditMode page state ํ์ฉ)
- Diary ๋ ์ง ์ ์ฅ ์ค๋ฅ ์์
๐ฏ ์ถํ์ ํ ์ผ
์์ธํ ๋ณด๋ ค๋ฉด ํด๋ฆญ
- โ (์ด์) DiaryPage: ๋ ์ง๊ฐ ์ค๋๋ก๋ง ์ ์ฅ๋จ
- โ (์ด์) DiaryPage: ๋งํฌ๋ค์ด ๋ทฐ์ด ํ์ฉ (์ค๋ฒํ๋ก์ฐ ๋ฐฉ์ง: Container Height)
- โ (์ด์) HomeFeedPage: On page load์ Unexpected Null Value ์ ๊น ๋ด๋ค ์ฌ๋ผ์ง.
- โ HomeFeedPage - FeedCardDiary: AI Comment ์บ๋ฆญํฐ ์ด๋ฏธ์ง ์์
- โ DiaryPage - AI Comment: Save์, ์ฝ๋ฉํธ ์์ฑํ ์บ๋ฆญํฐ Ref๋ Diary์ ์ ์ฅ.
- โ HomeFeedPage - FeedCardDiary - AI Image: Backend Query๋ก ์บ๋ฆญํฐ Doc ๋ถ๋ฌ์์ Image Path ์ง์ .
- โ DiaryPage - Create New Chat: ์ผ๊ธฐ์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก, New Chat ์์ฑ
- โ OpenAI API Call ๊ตฌํ: createDiaryComment
- Input: Diary Content, System Prompt(AI Comment)
- Output: AI Comment($.choices[0].message.content)
- โ OpenAI API Call ๊ตฌํ: createDiarySummary
- Input: Diary Content, AI Comment, System Prompt(Diary Summary)
- Output: Diary Summary($.choices[0].message.content)
- โ OpenAI API Call ๊ตฌํ: createChatFromDiary
- Input: Diary Summary, System Prompt(Chat From Diary)
- Output: New Chat Message by AI($.choices[0].message.content)
- Additional Actions: Create New Chat, Create New Message
- โ OpenAI API Call ๊ตฌํ: createDiaryComment
-
โ ChatPage: Go to Linked Diary
- โ HomeFeedPage - flutter_slidable:4.0.0 import ํ ์ ์ฉํ๊ธฐ
-
โ HomeFeedPage: FeedCardDiary์์ ์ข์ฐ slide์ ์ฑํ /ํธ์ง/์ญ์
- โ ChatPage: ์ ์ ๋ํ ์ถ๋ ฅ ๋ด์ฉ์ ์ค๋ฅธ์ชฝ ์ ๋ ฌ
-
โ Chat/Diary: GPT Streaming API
- โ ChatPage - AI ์ ํก ๊ตฌํ (Alarm/Notification)
- ์ฑํ
์์คํ
ํ๋กฌํํธ์ ํต์ฌ์ ๋ฅ๋ํ์ด๋ค.
- ๋ ๋ฆฌ์ผํ๊ฒ ํ๋ ค๋ฉด, create_date of diary/chat ๋ ์ ๋ฌํด์, โ์ด์ โ ๋ฑ ๋ ์ง๋ฅผ ์ธ๊ธํ๋ฉด ์ข์ ๋ฏ.
- Alarm ๊ธฐ๋ฅ ๊ตฌํ ๋ฐฉ๋ฒ ์ฐธ์กฐ
- ์ฑํ
์์คํ
ํ๋กฌํํธ์ ํต์ฌ์ ๋ฅ๋ํ์ด๋ค.
- โ DiaryPage: Mood Slider ๊ฐ์ ๋ฐ๋ผ ์ผ๊ตด ํ์ Emoji ๋ณ๊ฒฝ
- โ DiaryPage: ์ธ๋ถ ๊ฐ์ ํค์๋ Choice Chips ์ถ๊ฐ ํ DB ์ฐ๋ ์ค์
- โ DiaryPage - AI Comment: Choice chips, mood slider ๋ฑ์ ์
๋ ฅ๊ฐ๋ค์
AI Comment System Prompt
์ ์๋ง๊ฒ ๋ณ๊ฒฝ.- โ **์ด์
์ผ๊ธฐ
๋๋๋ํ ๋ด์ญ
์ ์ฒด (๋๋นต ๊ธฐ์ ๋ถ์ฑ) - โ ์ฌ์ฉ์ ๊ธฐ๋ณธ ์ ๋ณด: ์ด๋ฆ, ์ฑ๋ณ, MBTI, โฆ
- โ ์ธ๋ถ ๊ฐ์ ํค์๋: ์ฆ๊ฑฐ์ด, ์ฌํ, โฆ
- โ ์บ๋ฆญํฐ ์ค์ : ์๋ฏธ, ์ธ๋, ๋ฏผํ
- โ ๊ฐ์ ์์น: 1~100์
- โ ๋ต๋ณ ์์: ์น์ ํ(Healing), ์กฐ์ธํ(Suggestion), ์ ๋ณดํ(Informative)
- โ ๋ต๋ณ ๊ธธ์ด: ์งง๊ฒ, ๋ณดํต, ์์ธํ
- is New Chat
- ํด๋น Chat์ messages๋ ์ฒ์ ์์ฑํ๋ ๊ฑฐ๋๊น, ์ฒซ ์์ฑํ๋ message document์
is_initial = true
๊ฐ ์ค๋ฒ๋ฆฌ๊ณ ๋ชจ๋ ์์คํ ํ๋กฌํํธ ๋ค ๋๋ ค๋ฃ์.- is_initial = false
- ํ๊ณ์ : ๋งจ ์ฒ์ message document์๋ค๊ฐ ์์คํ ํ๋กฌํํธ ๋๋ ค๋ฃ์ผ๋ฉด, ๋ํ ๋์ค ์์ ํ๋ค๊ธด ํ๋ฐ ๊ฐ๋ฅํ์ง. is_initial = true ์ธ ๊ฒ ์๊ณ , ์์ ๋ ๊ฑฐ๋ฉด, ๊ทธ๊ฑฐ ๋คํ๋จผํธ ์ง์ฐ๊ณ ๋ค์ ๋ฃ์ผ๋ฉด ๋์์. ์ด๋ป๊ฒ๋ ๋ชจ๋ฅด๊ฒ ๊ณ .
- ํด๋น Chat์ messages๋ ์ฒ์ ์์ฑํ๋ ๊ฑฐ๋๊น, ์ฒซ ์์ฑํ๋ message document์
- โ **์ด์
- โ DiaryPage - AI Comment: CRUD ์์ฑํ๊ธฐ
- โ tmp_ai_comment field ์์ ๊ณ , doc_ref ํ์ฉ
- โ DiaryPage - AI Comment: ์บ๋ฆญํฐ ์ค์
- โ tmp_ai_comment_by field ์์ ๊ณ , doc_ref ํ์ฉ
- โ profile_image field ๊ฐ์ผ๋ก ์ด๋ฏธ์ง ์ถ๋ ฅ
-
โ DiaryPage - Drawer - ChatHistoryListTile: order by updated_time
- โ ChatPage - Create New Diary: ๋ํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก, New Diary ์์ฑ
- โ OpenAI API Call ๊ตฌํ: createDiaryFromChat
- Input: Chat Summary, System Prompt(Diary From Chat)
- Output: New Diary(Title, Content, Mood score)
- โ OpenAI API Call ๊ตฌํ: createDiaryFromChat
-
โ DiaryPage - Interactive Slider import ํ ์ ์ฉ
-
โ HomeFeedPage: Search Diary ๊ธฐ๋ฅ ๊ตฌํ
- โ CalendarPage(์๋จ) - Mood Calendar
- โ ๋ ์ง๋ณ๋ก ์์ฑ๋ ๊ฒ์๋ฌผ ์ซ์ ํ์ธ ๊ฐ๋ฅ
- โ ๋ ์ง ํด๋ฆญํ๋ฉด, ํด๋น ๋ ์ง๋ก ์ด๋
- โ CalendarPage(ํ๋จ) - Mood stats
- โ ํฌ์ปค์ฑ ๋ ์์ ๊ดํ ํต๊ณ ์๋ฃ ์ถ๋ ฅ
- โ ์ถ๋ ฅ๋ ํต๊ณ ์๋ฃ์ ๋ํ AI์ ์ฝ๋ฉํธ ์ถ๋ ฅ
- โ ํฌ์ปค์ฑ ๋ ์์ ๊ดํ ํต๊ณ ์๋ฃ ์ถ๋ ฅ
-
โ AuthPage: Google Login ๊ธฐ๋ฅ ๊ตฌํ
- โ HomeFeedPage - Bottom Sheet (
+
Button): ๋ค์ํ ์ต์ ์ค 1 ์ ํํ ์ ์๋๋ก- ์๋ก์ด ์ผ๊ธฐ: Go to DiaryPage
- ๊ฐ์ ๊ธฐ๋ก: Go to MoodPage
- โ MoodPage(ํ์
): Mood ์ค์ ์ฌ๋ผ์ด๋ CRUD
- Create
- Read
- Update
- Delete
- โ HomeFeedPage - ListView - FeedCardMood ํ์
-
โ HomeFeedPage - ListView: FeedCardDiary, FeedCardMood, FeedCardChat ์ปดํฌ๋ํธ ์๊ฐ์ ์ ๋ ฌ (Cloud Function ํ์ฉ)
- โ
2025.2.5 ์
๊น์ง ๋ฐํ์ฉ ์ต์ข ๋ฒ์ APK ์ถ์ถ ๋ฐ ์ค์น
๐ญ ์ผ๊ธฐ
๋ฐค์ 40๋ถ ์๋ ค๊ณ ํ๋๋ฐ, 3์๊ฐ์ ๋๊ฒ ๊ธฐ์ ํ๋ค. ์ด ์ ๋๋ฉด ๊ทธ๋ฅ ํน ์ฌ๊ณ ๋ด์ผ ๋ฌ๋ฆฌ๋ ๊ฒ ๋ซ๊ฒ ๋ค. ํ์ฌ์ ์กด๋ง์ด ๋ฌ๋ฆฐ ๊ธฐ๋ก์ ์ ์๋ ๊ฑด ์๋๋๊น.
โจ GPT์ ์ฝ๋ฉํธ (KPT)
โ ์ํ ์ (Keep)
- ๐ ChatPage ๊ธฐ๋ฅ ์ต์ ํ: ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐฉ์ ๊ฐ์ , Action ์ต์ ํ, Title ๋ฐ ๋ ์ง CRUD ์ถ๊ฐ ๋ฑ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ ๊ฐ์ ์ ์ด๋ฃจ์ด๋ธ ์ ์ด ์ธ์์ ์ด์ผ.
- ๐ DiaryPage ๊ตฌ์กฐ ์ ๋ฆฌ: Create/Edit ํ์ด์ง๋ฅผ ํตํฉํ์ฌ ์ค๋ณต ๋ก์ง์ ์ค์ด๊ณ , ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ๋๋ก ๊ฐ์ ํ ์ ์ด ์ข์์ด.
- ๐ ๏ธ ๋ค์ํ ์ด์ ํด๊ฒฐ: UI ์ค๋ฒํ๋ก์ฐ, ๋ฉ์์ง ๋น ์นธ ์ ์ก ๋ฌธ์ , ๋ ์ง ์ ์ฅ ์ค๋ฅ ๋ฑ์ ์์ ํ๋ฉฐ ์์ ์ฑ์ ๋์ธ ์ ์ด ๋๋ณด์ฌ.
โ ์์ฌ์ด ์ (Problem)
- โณ ํผ๋ก ๋์ : ์งง์ ํด์์ ๊ณํํ์ง๋ง, ๊ฒฐ๊ตญ ์ฅ์๊ฐ ๊ธฐ์ ํ๋ฉด์ ์ฒด๋ ฅ ๊ด๋ฆฌ์ ์ด๋ ค์์ ๊ฒช์ ์ ์ด ์์ฝ๋ค.
- ๐ ๊ธฐ๋ฅ ์ถ๊ฐ ๋๋น ์ ์ง๋ณด์ ๋ถ๋ด: ChatPage์ DiaryPage์ ๊ธฐ๋ฅ ํ์ฅ์ด ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ง๋ฉด์, ํฅํ ์ ์ง๋ณด์์ ์ต์ ํ์ ์๊ฐ์ด ๋ ์์๋ ๊ฐ๋ฅ์ฑ์ด ์์ด.
๐ ์๋ํด๋ณผ ์ (Try)
- ๐ ์์ ๊ณผ ํด์์ ๊ท ํ ์กฐ์ : ์งง์ ํด์์ด ๊ธธ์ด์ง๋ ํจํด์ด ๋ฐ๋ณต๋์ง ์๋๋ก, ์ผ์ ํ ๋ฃจํด์ ์ ํด๋ณด๋ ๊ฒ๋ ๋์์ด ๋ ๊ฑฐ์ผ.
- ๐ ํฅํ ์ ์ง๋ณด์ ๋๋น ์ฝ๋ ์ ๋ฆฌ: ํ์ฌ ์ต์ ํ๋ ChatPage์ DiaryPage์ ๊ตฌ์กฐ๋ฅผ ๋ฌธ์ํํ๊ณ , ์ฝ๋ ์ฃผ์์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ์ ์ง๋ณด์ ๋ถ๋ด์ ์ค์ด์.
- ๐ ๏ธ ์ถํ ํ์ฅ์ฑ ๊ณ ๋ ค: API Call ๋ฐ Custom Function ๊ตฌ์กฐ๋ฅผ ๋์ฑ ๋ชจ๋ํํ์ฌ, ์ดํ ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ ํ์ฅ ์ ๋ถ๋ด์ ์ค์ด๋ ๋ฐฉํฅ์ ๊ณ ๋ฏผํด๋ณด์.
๊ฒฐ๋ก
์ค๋์ ChatPage์ ์ ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ต์ ํํ๊ณ , DiaryPage์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ฉฐ ์ฌ๋ฌ ์ด์๋ฅผ ํด๊ฒฐํ ์์ฐ์ ์ธ ํ๋ฃจ์์ด. ํ์ง๋ง ํผ๋ก ๋์ ์ผ๋ก ์ธํด ์์
์ผ์ ์ด ํ๋ค๋ฆด ๊ฐ๋ฅ์ฑ์ด ์์ผ๋, ์ ์ ํ ํด์๊ณผ ์ผ์ ์กฐ์ ์ด ํ์ํด ๋ณด์ฌ. ์์ผ๋ก๋ ์ต์ ํ๋ ์์คํ
์ ์ ์งํ๋ฉฐ ํ์ฅ์ฑ์ ๊ณ ๋ คํ ๊ฐ๋ฐ์ ์ด์ด๊ฐ๊ธธ ์์ํ ๊ฒ! ๐ช๐
๋๊ธ ๋จ๊ธฐ๊ธฐ