ν‹°μŠ€ν† λ¦¬ λ·°

λ°˜μ‘ν˜•

πŸ“˜ [2편] 챗봇 UI κ΅¬μ„±ν•˜κΈ° – μ‚¬μš©μž μž…λ ₯κ³Ό GPT 응닡을 μ—°κ²°ν•˜μž


이번 νŽΈμ—μ„œλŠ” μ‚¬μš©μž μž…λ ₯μ°½κ³Ό GPT의 응닡을 λ³΄μ—¬μ£ΌλŠ” κΈ°λ³Έ 챗봇 UIλ₯Ό λ§Œλ“€μ–΄λ΄…λ‹ˆλ‹€.
μ‹€μ œλ‘œ μ‚¬μš©μžκ°€ λ¬Έμž₯을 μž…λ ₯ν•˜κ³  → GPTλ‘œλΆ€ν„° 응닡을 λ°›μ•„ → 화면에 ν‘œμ‹œν•˜λŠ”
μ±— μΈν„°νŽ˜μ΄μŠ€μ˜ 첫 단계λ₯Ό κ΅¬ν˜„ν•˜λŠ” 것이 λͺ©ν‘œμž…λ‹ˆλ‹€.


🎯 λͺ©ν‘œ

βœ… μ‚¬μš©μž μž…λ ₯μ°½ κ΅¬ν˜„
βœ… λ©”μ‹œμ§€ 전솑 λ²„νŠΌ
βœ… GPT 응닡 λ°›μ•„ 화면에 좜λ ₯
βœ… λ©”μ‹œμ§€ 리슀트 관리 (μ±„νŒ…μ²˜λŸΌ 보이게)


🧱 ν”„λ‘œμ νŠΈ ꡬ쑰

src/
β”œβ”€β”€ components/
β”‚   └── ChatMessage.js       # 말풍선 μ»΄ν¬λ„ŒνŠΈ
β”œβ”€β”€ screens/
β”‚   └── ChatScreen.js        # 전체 μ±„νŒ… ν™”λ©΄
β”œβ”€β”€ services/
β”‚   └── chatgpt.js           # GPT API μš”μ²­
App.js

πŸ§‘‍πŸ’» 1. GPT 응닡 ν•¨μˆ˜ (볡슡)

πŸ“„ src/services/chatgpt.js

import axios from 'axios';
import { OPENAI_API_KEY } from '@env';

export const askGPT = async (message) => {
  const res = await axios.post(
    'https://api.openai.com/v1/chat/completions',
    {
      model: 'gpt-4',
      messages: [{ role: 'user', content: message }],
    },
    {
      headers: {
        'Authorization': `Bearer ${OPENAI_API_KEY}`,
        'Content-Type': 'application/json',
      }
    }
  );
  return res.data.choices[0].message.content;
};

πŸ’¬ 2. 말풍선 μ»΄ν¬λ„ŒνŠΈ

πŸ“„ src/components/ChatMessage.js

λ°˜μ‘ν˜•
import { View, Text, StyleSheet } from 'react-native';

export default function ChatMessage({ message, isUser }) {
  return (
    <View style={[styles.container, isUser ? styles.user : styles.bot]}>
      <Text style={styles.text}>{message}</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    maxWidth: '80%',
    marginVertical: 4,
    padding: 10,
    borderRadius: 10,
  },
  user: {
    alignSelf: 'flex-end',
    backgroundColor: '#007aff',
  },
  bot: {
    alignSelf: 'flex-start',
    backgroundColor: '#e5e5ea',
  },
  text: {
    color: '#fff',
  },
});

πŸ–₯️ 3. 전체 μ±„νŒ… ν™”λ©΄ ꡬ성

πŸ“„ src/screens/ChatScreen.js

import React, { useState } from 'react';
import { View, TextInput, Button, FlatList, KeyboardAvoidingView, Platform } from 'react-native';
import ChatMessage from '../components/ChatMessage';
import { askGPT } from '../services/chatgpt';

export default function ChatScreen() {
  const [input, setInput] = useState('');
  const [messages, setMessages] = useState([]);

  const sendMessage = async () => {
    if (!input.trim()) return;

    const userMessage = { text: input, isUser: true };
    setMessages(prev => [...prev, userMessage]);

    setInput('');
    try {
      const gptReply = await askGPT(input);
      const botMessage = { text: gptReply, isUser: false };
      setMessages(prev => [...prev, botMessage]);
    } catch (error) {
      console.error('GPT 응닡 μ‹€νŒ¨:', error);
    }
  };

  return (
    <KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'padding' : undefined} style={{ flex: 1 }}>
      <FlatList
        data={messages}
        keyExtractor={(item, index) => index.toString()}
        renderItem={({ item }) => <ChatMessage message={item.text} isUser={item.isUser} />}
        contentContainerStyle={{ padding: 16 }}
      />
      <View style={{ flexDirection: 'row', padding: 8 }}>
        <TextInput
          style={{ flex: 1, borderWidth: 1, borderColor: '#ccc', padding: 8, borderRadius: 5 }}
          value={input}
          onChangeText={setInput}
          placeholder="ν•  일을 λ§ν•΄λ³΄μ„Έμš”"
        />
        <Button title="보내기" onPress={sendMessage} />
      </View>
    </KeyboardAvoidingView>
  );
}

πŸ“² 4. App.js에 적용

import ChatScreen from './src/screens/ChatScreen';

export default function App() {
  return <ChatScreen />;
}

βœ… 이번 κΈ€μ—μ„œ λ§Œλ“  κΈ°λŠ₯ μš”μ•½

κΈ°λŠ₯ μ™„λ£Œ μ—¬λΆ€

μ‚¬μš©μž λ©”μ‹œμ§€ μž…λ ₯ βœ…
GPT둜 λ©”μ‹œμ§€ 전솑 βœ…
응닡 λ°›μ•„μ„œ 화면에 좜λ ₯ βœ…
μ±„νŒ… 리슀트 UI κ΅¬ν˜„ βœ…

πŸ“˜ λ‹€μŒ κΈ€ 예고

λ‹€μŒ νŽΈμ—μ„œλŠ” GPT의 응닡을 λ‹¨μˆœν•œ 말풍선 ν…μŠ€νŠΈκ°€ μ•„λ‹ˆλΌ
"ν•  일 등둝"으둜 λ³€ν™˜ν•˜λŠ” ꡬ쑰λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

  • 예: “내일 μ˜€ν›„ 3μ‹œμ— 회의 μž‘μ•„μ€˜” → λ‚ μ§œ + λ‚΄μš© μΆ”μΆœ → Firestore에 등둝

πŸ‘‰ GPT 응닡을 “κ΅¬μ‘°ν™”λœ JSON”으둜 λ°›μ•„μ„œ TODO둜 μ €μž₯ν•˜λŠ” 방법을 λ°°μ›Œλ³Ό μ°¨λ‘€μž…λ‹ˆλ‹€!

 

React Native 챗봇 UI,React Native OpenAI μ—°κ²°,React Native GPT μ±„νŒ… 예제,React Native μ±„νŒ… μ•± λ§Œλ“€κΈ°,React Native GPT 챗봇 ν™”λ©΄,chatgpt react native 예제,OpenAI μ±„νŒ… μ•± react native,챗봇 μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„,react native todo 챗봇,React

β€» 이 ν¬μŠ€νŒ…μ€ 쿠팑 νŒŒνŠΈλ„ˆμŠ€ ν™œλ™μ˜ μΌν™˜μœΌλ‘œ, 이에 λ”°λ₯Έ μΌμ •μ•‘μ˜ 수수료λ₯Ό μ œκ³΅λ°›μŠ΅λ‹ˆλ‹€.
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/06   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
κΈ€ 보관함
λ°˜μ‘ν˜•