๐Ÿ“ฒ React Native ์›น๋ทฐ ํ†ต์‹ ํ•˜๊ธฐ

sujinยท2024๋…„ 8์›” 25์ผ
2

React

๋ชฉ๋ก ๋ณด๊ธฐ
17/17
post-thumbnail

๋‚˜๋Š” ํšŒ์‚ฌ์—์„œ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค. ๋ณดํ†ต ์•ฑ ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด React Native, flutter, swift, kotlin์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚˜๋Š” Next.js๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ฐœ๋ฐœํ•œ ํ™”๋ฉด์„ react-native ์›น๋ทฐ๋กœ ๋„์›Œ์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์›น๋ทฐ๋ฅผ ํ†ตํ•œ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ ์ด์ œ๋Š” ์ต์ˆ™ํ•ด์ง€๊ธฐ๋„ ํ–ˆ๊ณ  ํ˜น์‹œ ์˜ˆ์ „์— ๋‚˜์ฒ˜๋Ÿผ ์›น๋ทฐ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด์„œ ๊ถ๊ธˆํ•˜๊ฑฐ๋‚˜ ์–ด๋ ค์šด ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค! โœจ


1. ์›น๋ทฐ๋ž€?


์›น๋ทฐ๋Š” ๋ชจ๋ฐ”์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์›น ์ฝ˜ํ…์ธ (์›น ํŽ˜์ด์ง€)๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๋‚ด๋ถ€์— HTML, CSS, Javascript ๋กœ ์ž‘์„ฑ๋œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฃผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ์™€ ์›น์„ ํ˜ผํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

์šฐ๋ฆฌ ํšŒ์‚ฌ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์•ฑ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํŽ˜์ด์ง€ ๋ฐ ๊ธฐ๋Šฅ๋“ค์„ Next.js๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค. ์ฆ‰, ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ์›น ๊ฐœ๋ฐœ๊ณผ ๋™์ผํ•˜๋ฉฐ Next.js๋กœ ๊ฐœ๋ฐœํ•œ ์›นํŽ˜์ด์ง€๋ฅผ(URL) ์›น๋ทฐ๋ฅผ ํ†ตํ•ด ๋ณด์—ฌ์ค€๋‹ค.

react-native-webview

react-native์—์„œ ์›น๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” react-native-webview ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
react-native ์ดˆ๊ธฐ ๋ฒ„์ „์—๋Š” WebView ๊ฐ€ ๋‚ด์žฅ๋œ ์ปดํฌ๋„ŒํŠธ์˜€์œผ๋‚˜, ํ˜„์žฌ๋Š” ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌ๋˜์–ด react-native-webview ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ œ๊ณต๋˜๊ณ  ์žˆ๋‹ค.

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์›น ํŽ˜์ด์ง€์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ฐ„์˜ ํ†ต์‹ ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

WebView ์ปดํฌ๋„ŒํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ต์…˜์€ ๋งค์šฐ ๋งŽ์ง€๋งŒ ๊ฐ€์žฅ ๊ธฐ๋ณธ์œผ๋กœ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ๋‘๊ฐ€์ง€ ์ •๋„๋งŒ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

import React from 'react';
import { WebView } from 'react-native-webview';

const MyWebView = () => {
  
  const handleMessage = (event) => {
    alert("Message from WebView: " + event.nativeEvent.data);
  };
  
  return (
    <WebView 
      source={{ uri: "https://example.com" }} 
  	  onMessage={handleMessage}
    />
  );
};

export default MyWebView;
  • source
    • ์›น๋ทฐ์—์„œ ๋กœ๋“œํ•  ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
    • URL์„ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ์›น ํŽ˜์ด์ง€๊ฐ€ ์›น๋ทฐ ๋‚ด์—์„œ ๋žœ๋”๋ง๋œ๋‹ค.
  • onMessage
    • ์›น ํŽ˜์ด์ง€์™€ ๋„ค์ดํŠธ๋ธŒ ์•ฑ ๊ฐ„์˜ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
    • ์›น๋ทฐ์—์„œ ์ˆ˜์‹ ํ•œ ๋ฉ”์„ธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€์—์„œ Javascript๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. (์ž์„ธํ•œ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์—์„œ ์‚ดํŽด๋ณด๋„๋ก ํ• ๊ฒŒ์š”)

2. ์›น๋ทฐ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๋•Œ๋Š”?


์›น์—์„œ๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์•ฑ์—์„œ๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•„์š”ํ•  ๋•Œ ์›น๋ทฐ ํ†ต์‹ ์„ ํ•œ๋‹ค. ๋‚ด๊ฐ€ ๊ฒฝํ—˜ํ–ˆ๋˜ ๊ฒƒ์„ ์˜ˆ๋กœ ๋“ค์ž๋ฉด ๋ชจ๋‹ฌ์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” 1์ผ ๋™์•ˆ ๋ณด์ง€ ์•Š๊ธฐ , ์•Œ๋ฆผ ์„ค์ • ํ—ˆ์šฉ/๊ฑฐ๋ถ€ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์กด์žฌํ•œ๋‹ค. ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์€ ์ผ๋ฐ˜์ ์ธ ์›น ํŽ˜์ด์ง€์—์„œ๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ํ™œ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์—์„œ ์ฒ˜๋ฆฌํ•œ ํ›„ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์›น ํŽ˜์ด์ง€๋กœ ๋‹ค์‹œ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.

์ด๋Ÿฐ ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ์€ ์‹ค์ œ ๋””๋ฐ”์ด์Šค๋‚˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ์ค‘์—๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ํ†ต์‹ ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.


3. ์˜ˆ์‹œ ์ฝ”๋“œ


์›น๋ทฐ ํ†ต์‹ ์„ ํ• ๋•Œ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ react-native-webview๋ฅผ ํ†ตํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ ์ž์„ธํ•œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

asyncStorage

asyncStorage ๋Š” ๋‚ด๊ฐ€ ์›น๋ทฐ ํ†ต์‹ ์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฆ„๋ถ€ํ„ฐ ๊ฐ์ด ์˜ค๊ฒ ์ง€๋งŒ ์›น์—์„œ์˜ localStorage์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์›น์—์„œ ํด๋ผ์ด์–ธํŠธ๋‹จ์—์„œ ์–ด๋– ํ•œ ์ •๋ณด๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์ด localStorage์ธ๋ฐ ์•ฑ์—์„œ๋„ ์–ด๋– ํ•œ ์ •๋ณด๋ฅผ ๋””๋ฐ”์ด์Šค์— ์ €์žฅํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด asyncStorage์ด๋‹ค.
localStorage ์ฒ˜๋Ÿผ Key ์™€ value ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์ €์žฅํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

asyncStorage๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ๋‹ค์–‘ํ•˜์ง€๋งŒ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์‹œ ๋ณด์ง€ ์•Š๊ธฐ ๊ฐ€ ์žˆ๋‹ค.

์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ์ƒ๋žต๋œ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ด ์  ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”

1. Next.js -> RN์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ

// Next.js

const EventModal = () => {
	
    // react native ๋กœ ๋ฉ”์„ธ์ง€ ์ „์†ก
    const handleClickClose = () => {
       window.ReactNativeWebView.postMessage("hideOneDay")
    }  
  

	return (
    	<div>
           ...
           <button onClick={handleClickClose}>๋‹ค์‹œ ๋ณด์ง€ ์•Š๊ธฐ</button>
        </div>
    )

}

export default EventModal

  • window.ReactNativeWebView.postMessage("hideOneDay")๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ, ์›น ํŽ˜์ด์ง€์—์„œ React Native ์›น๋ทฐ๋กœ "hideOneDay"๋ผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ด ๋ฉ”์„ธ์ง€๋Š” React Native ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ „๋‹ฌ๋˜์–ด ํŠน์ • ๋™์ž‘(์˜ˆ: "๋‹ค์‹œ ๋ณด์ง€ ์•Š๊ธฐ" ์„ค์ •)์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค.

2. RN์—์„œ ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

// React Native

import { WebView } from 'react-native-webview';
import AsyncStorage from '@react-native-async-storage/async-storage';

const App = () => {
  
  // ์›น๋ทฐ์—์„œ ๋ฐ›์€ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
  const handleMessage = async (event) => {
    const message = event.nativeEvent.data;
    if (message === "hideOneDay") {
      try {
        // AsyncStorage์— ๋ฐ์ดํ„ฐ ์ €์žฅ
        await AsyncStorage.setItem("hideOneDay", "true");
        alert("๋ชจ๋‹ฌ์„ ๋‹ค์‹œ ๋ณด์ง€ ์•Š๋„๋ก ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
      } catch (error) {
        console.error("Error saving data to AsyncStorage", error);
      }
    }
  };

  return (
   <WebView 
      source={{ uri: "https://example.com"}} 
      onMessage={handleMessage}
    />
  )
}


export default App
  • handleMessage๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜์‹ ๋œ ๋ฉ”์„ธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • event.nativeEvent.data๋ฅผ ํ†ตํ•ด ์ˆ˜์‹ ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , ๋ฉ”์‹œ์ง€๊ฐ€ "hideOneDay"์ผ ๋•Œ, AsyncStorage์— "hideOneDay" ํ‚ค๋กœ "true" ๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ์— ์„ฑ๊ณตํ•˜๋ฉด alert์ด ๋…ธ์ถœ๋œ๋‹ค.

3. RN์—์„œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

// React Native

import { WebView } from 'react-native-webview';
import AsyncStorage from '@react-native-async-storage/async-storage';

const App = () => {
  const webViewRef = useRef(null);
  
  ...
  
  // ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์™€ ์›น๋ทฐ๋กœ ์ „์†ก
  useEffect(() => {
  	const checkAsyncStorage = async () => {
       try {
        const hideOneDay = await AsyncStorage.getItem("hideOneDay");
        
        if (hideOneDay === 'true' && webViewRef.current) {
          // ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์›น๋ทฐ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก
          webViewRef.current.postMessage("hideModal");
        }
      } catch (error) {
        console.error('Error retrieving data from AsyncStorage', error);
      }
    };
    
    checkAsyncStorage();
  }, [])

  return (
   <WebView 
      ref={webViewRef}
      source={{ uri: "https://example.com"}} 
      onMessage={handleMessage}
    />
  )
}


export default App
  • webViewRef ์„ค์ •์„ ํ†ตํ•ด์„œ ์›น๋ทฐ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • useEffect๋ฅผ ํ†ตํ•ด checkAsyncStorage ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  AsyncStorage ์—์„œ "hideOneDay" ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๋งŒ์•ฝ true๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด webViewRef.current.postMessage("hideModal") ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์›น๋ทฐ๋กœ "hideModal" ์„ ์ „์†กํ•˜๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์›น ํŽ˜์ด์ง€์—์„œ ๋ชจ๋‹ฌ์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

4. Next.js์—์„œ ๋ชจ๋‹ฌ ์ˆจ๊ธฐ๊ธฐ


import EventModal from "./EventModal"

const Home = () => {
  
  // ๋ชจ๋‹ฌ์˜ ํ‘œ์‹œ ์—ฌ๋ถ€๋ฅผ ์ƒํƒœ๋กœ ๊ด€๋ฆฌ
  const [isModalVisible, setModalVisible] = useState(true);

  useEffect(() => {
    const handleMessage = (event: MessageEvent) => {
      // ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ ํ™•์ธ
      if (event.data === "hideModal") {
        // ๋ชจ๋‹ฌ ์ˆจ๊ธฐ๊ธฐ
        setModalVisible(false);
      }
    };

    // ๋ฉ”์‹œ์ง€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก
    window.addEventListener("message", handleMessage);

    // ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ
    return () => {
      window.removeEventListener("message", handleMessage);
    };
  }, []);
  
	return (
     <div>
        {isModalVisible && <EventModal />}
       	<h1>๋ฉ”์ธ ํŽ˜์ด์ง€</h1>
      </div>
    )
}

export default Home

  • useEffect๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€๊ฐ€ ๋žœ๋”๋ง๋˜๋ฉด window.addEventListener("message", handleMessage) ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  handleMessage ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด "hideModal" ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด isModalVisible ์ƒํƒœ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ ๋ชจ๋‹ฌ์„ ์ˆจ๊ธด๋‹ค.

4. ๋งˆ๋ฌด๋ฆฌ


์ž…์‚ฌํ•˜๊ณ  ๊ฐ™์ด ์ทจ์—…์„ ์ค€๋น„ํ•˜๋˜ ๋™๊ธฐ๋“ค์„ ๋งŒ๋‚˜๋ฉด "ํšŒ์‚ฌ์—์„œ ์–ด๋–ค ์ผ์„ ํ•˜๊ณ  ์žˆ์–ด์š”?"๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฃ๋Š” ์งˆ๋ฌธ์ด์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ฑ ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด "React Native ์‚ฌ์šฉํ•˜์‹œ๋‚˜์š”?"๋ผ๊ณ  ๋ฌผ์–ด๋ณด์‹œ๋Š”๋ฐ, ์ด๋•Œ๋งˆ๋‹ค ๋‚œ๊ฐ(?)ํ•  ๋•Œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ ์•ฑ์€ React Native๋กœ ๋˜์–ด์žˆ๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋•Œ ๋‚˜๋Š” React Native๋ฅผ ์ „ํ˜€ ๋งŒ์ง€์ง€ ์•Š๊ณ  ์žˆ์—ˆ๊ณ  Next.js๋กœ๋งŒ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ๋•Œ ๋‚˜๋Š” ์›น๋ทฐ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€ ๋ชปํ•ด์„œ ๋‚จ์—๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์ž์‹ ์ด ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ ๋ง‰์ƒ ๊ฒช์–ด๋ณด๋ฉด ๋ณ„๊ฑฐ ์—†๊ณ  ์ต์ˆ™ํ•ด์ง€๊ธฐ ๋งˆ๋ จ์ด๋‹ค. 2๋…„์ฐจ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋œ ์ง€๊ธˆ์€ ์›น๋ทฐ ์•ฑ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ๋ˆ„๊ฐ€ ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜น์‹œ ์›น๋ทฐ ๊ฐœ๋ฐœ์„ ์ด์ œ ๋ง‰ ์‹œ์ž‘ํ–ˆ๊ฑฐ๋‚˜ ๊ถ๊ธˆ์ฆ์„ ๊ฐ€์ง„ ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ๋งˆ์Œ์œผ๋กœ ์ด ๊ธ€์„ ์“ฐ๊ฒŒ ๋๋‹ค.

๋ฌผ๋ก  ๊ธ€์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‚˜๋„ ์›น๋ทฐ์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜์–ด ์ข‹์•˜๋‹ค. ์ด๋ž˜์„œ ๋ธ”๋กœ๊ทธ๋ฅผ ๊พธ์ค€ํžˆ ์จ์•ผ ํ•˜๋‚˜๋ณด๋‹คใ…Žใ…Ž ๊ธฐ๋ก์˜ ์ค‘์š”์„ฑ!

์‚ฌ์‹ค ํšŒ์‚ฌ ์ฝ”๋“œ์—์„œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์„ ์˜ˆ์ œ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ํšŒ์‚ฌ ์ฝ”๋“œ์—์„œ๋Š” sendMessage ๋ถ€๋ถ„(RN ํ†ต์‹ )์„ lib ํด๋”์— ๋ชจ๋“ˆํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ๋‚ด๊ฐ€ ์†Œ๊ฐœํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๋ถ€๋ถ„ ์™ธ์—๋„ ๋ณต์žกํ•œ ๋ถ€๋ถ„์ด ๋งŽ์•„ ์ง์ ‘ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” RN ํ†ต์‹ ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋งŒ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋”ฅํ•œ ๋‚ด์šฉ์€ ์ตœ๋Œ€ํ•œ ๋œ์–ด๋‚ด๋ ค๊ณ  ํ–ˆ๋‹ค. RN ํ†ต์‹ ์˜ ์‹ฌํ™” ๋ฒ„์ „์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ค„์•ผ๊ฒ ๋‹ค.



๐Ÿ“š ์ฐธ๊ณ 

  1. [FrontEnd] Webview๋กœ React๋ฅผ App์œผ๋กœ ๋งŒ๋“ค๊ธฐ
  2. react native webview ์‚ฌ์šฉ๋ฒ•
profile
๊ฐœ๋ฐœ๋Œ•๋ฐœ

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 9์›” 17์ผ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์ •๋ฆฌ๋ฅผ ์ •๋ง ์ž˜ํ•˜์‹œ๋„ค์š” !

1๊ฐœ์˜ ๋‹ต๊ธ€