framework/ReactNative

πŸ“˜ [3편] μžμ—°μ–΄ → ν•  일 λ³€ν™˜ν•˜κΈ° – GPT 응닡을 TODO λ°μ΄ν„°λ‘œ λ°”κΎΈμž

octo54 2025. 6. 2. 10:52
λ°˜μ‘ν˜•

πŸ“˜ [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 할일 μžλ™λ“±λ‘