π [3νΈ] μμ°μ΄ → ν μΌ λ³ννκΈ° – GPT μλ΅μ TODO λ°μ΄ν°λ‘ λ°κΎΈμ
π [3νΈ] μμ°μ΄ → ν μΌ λ³ννκΈ° – GPT μλ΅μ TODO λ°μ΄ν°λ‘ λ°κΎΈμ
μ΄μ κΈμμλ μ¬μ©μμ μμ°μ΄ μ
λ ₯μ GPTλ‘ μ μ‘νκ³ ,
μλ΅μ μ± λ©μμ§ ννλ‘ νλ©΄μ νμνλ κ²κΉμ§ ꡬννμ΅λλ€.
μ΄λ² νΈμμλ κ·Έ μλ΅μ λ¨μν 보μ¬μ£Όλ λ° κ·ΈμΉμ§ μκ³ ,
μ€μ λ‘ Firestoreμ ν μΌ λ°μ΄ν°λ‘ λ±λ‘νλ λ°©λ²μ λ°°μλλ€.
π― λͺ©ν
β
μμ°μ΄ λ¬Έμ₯μ GPTμκ² μ λ¬
β
GPTκ° "ν μΌ λ°μ΄ν°(JSON)"λ‘ μλ΅
β
ν΄λΉ λ°μ΄ν°λ₯Ό Firestoreμ μ μ₯
β
TODO λͺ©λ‘ νλ©΄μ νμ μ€λΉ
π§ μ΄λ€ λ°©μμΌλ‘ ꡬ쑰νν κΉ?
μ¬μ©μ μ λ ₯ μμ:
“λ΄μΌ μ€ν 3μμ ν νμ μμ΄”
GPTκ° λ°νν κΈ°λ νμ:
{
"title": "ν νμ",
"date": "2025-05-23T15:00:00.000Z",
"completed": false
}
μ΄λ° μμΌλ‘ title + date + μνκ° ν¬ν¨λ JSONμ μΆμΆν μ μλ€λ©΄
κ³§λ°λ‘ Firestoreμ μ μ₯ν μ μμ΅λλ€.
βοΈ GPT μμ² ν둬ννΈ λ³κ²½νκΈ°
π chatgpt.js μμ
export const askGPTTodoFormat = async (message) => {
const systemPrompt = `
λλ μΌμ λ±λ‘μ λμμ£Όλ λΉμμΌ.
μ¬μ©μμ λ§μ λ£κ³ μλ JSON νμμΌλ‘λ§ μλ΅ν΄.
{
"title": "μΌμ μ λͺ©",
"date": "ISO νμ λ μ§ (UTC κΈ°μ€)",
"completed": false
}
μ¬μ©μκ° λ μ§λ₯Ό λ§νμ§ μμΌλ©΄ μ€λ λ μ§λ‘ μ²λ¦¬ν΄μ€.
`;
const res = await axios.post(
'https://api.openai.com/v1/chat/completions',
{
model: 'gpt-4',
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: message }
]
},
{
headers: {
'Authorization': `Bearer ${OPENAI_API_KEY}`,
'Content-Type': 'application/json',
}
}
);
const jsonString = res.data.choices[0].message.content;
return JSON.parse(jsonString); // ← JSONμΌλ‘ λ³ν
};
π§ͺ ν μ€νΈ: μ½μμμ νμΈν΄λ³΄κΈ°
const test = async () => {
const result = await askGPTTodoFormat("λ΄μΌ μ€μ 9μμ λ©΄μ μΌμ ");
console.log(result);
};
μΆλ ₯ μμ:
{
"title": "λ©΄μ μΌμ ",
"date": "2025-05-23T09:00:00.000Z",
"completed": false
}
π₯ Firestoreμ μ μ₯νλ μ½λ μμ±
π services/firebase.js
import firestore from '@react-native-firebase/firestore';
export const addTodo = async (todo) => {
await firestore().collection('todos').add({
...todo,
createdAt: new Date().toISOString(),
});
};
π¬ ChatScreen.js ν΅ν©
import { askGPTTodoFormat } from '../services/chatgpt';
import { addTodo } from '../services/firebase';
const sendMessage = async () => {
if (!input.trim()) return;
setMessages(prev => [...prev, { text: input, isUser: true }]);
setInput('');
try {
const todoData = await askGPTTodoFormat(input);
await addTodo(todoData);
setMessages(prev => [...prev, {
text: `β
"${todoData.title}" μΌμ μ΄ λ±λ‘λμμ΅λλ€.`,
isUser: false
}]);
} catch (error) {
console.error('μ€λ₯:', error);
setMessages(prev => [...prev, {
text: 'β μΌμ λ±λ‘μ μ€ν¨νμ΄μ.',
isUser: false
}]);
}
};
β μ΄λ² κΈ μ 리
κΈ°λ₯ ꡬν μλ£
μμ°μ΄ → GPT μ λ¬ | β |
JSON μλ΅ λ°κΈ° | β |
Firestoreμ μ μ₯ | β |
κ²°κ³Ό μ± λ©μμ§ νμ | β |
π§© λ€μ κΈ μκ³
λ€μ νΈμμλ μ€μ λ±λ‘λ TODOλ₯Ό Firestoreμμ μ€μκ°μΌλ‘ λΆλ¬μ€κ³ ,
λ μ§μμΌλ‘ μ λ ¬λ ν μΌ λ¦¬μ€νΈλ₯Ό 보μ¬μ£Όλ νλ©΄μ ꡬμ±ν©λλ€.
React Native GPT JSON νμ±,React Native GPT μΌμ λ±λ‘,chatgpt todo JSON μμ ,GPT μΌμ μΆμΆ ν둬ννΈ,React Native Firestore λ±λ‘,μμ°μ΄ νμ± μΌμ μ±,openai react native μΌμ λ±λ‘,react native firestore todo μ μ₯,chatgpt react native νμ© μμ ,react native ν μΌ μλλ±λ‘