import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

interface Props {
  title: string;
  subtitle: string;
}

const ExampleScreen: React.FC<Props> = ({ title, subtitle }) => {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>{title}</Text>
      <Text style={styles.subtitle}>{subtitle}</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    marginBottom: 16,
  },
  subtitle: {
    fontSize: 16,
    color: '#666',
  },
});

export default ExampleScreen;

이 코드는 두 개의 프로퍼티(제목과 부제목)를 받아 두 개의 텍스트 엘리먼트가 있는 뷰를 반환하는 예제 스크린이라는 함수형 컴포넌트를 정의합니다. 이 컴포넌트는 Props 타입의 프로퍼티를 취하는 함수 컴포넌트의 유형 별칭인 React.FC 타입을 사용해 정의됩니다.

Props 인터페이스는 TypeScript를 사용하여 정의되며, 컴포넌트가 두 개의 문자열 프로퍼티(제목과 부제목)를 기대한다고 지정합니다.

스타일 객체는 컴포넌트의 스타일을 정의합니다. 이러한 스타일은 React Native에서 성능에 최적화된 스타일을 정의하는 방법인 StyleSheet.create 메서드를 사용하여 정의됩니다.

전반적으로 이 코드는 TypeScript를 사용하여 컴포넌트 프로퍼티의 인터페이스를 정의하는 방법과 StyleSheet 객체를 사용하여 React Native 스타일을 정의하는 방법을 보여줍니다.

import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

interface Props<T> {
  data: T[];
  renderItem: (item: T) => React.ReactNode;
}

function GenericList<T>({ data, renderItem }: Props<T>) {
  return (
    <View style={styles.container}>
      {data.map((item) => (
        <View key={item.id}>{renderItem(item)}</View>
      ))}
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
});

export default GenericList;

이 예제에서는 제네릭 타입 매개변수 T를 받는 GenericList라는 제네릭 함수형 컴포넌트를 정의합니다. 이 컴포넌트는 두 가지 프로퍼티, 즉 T 타입의 아이템 배열인 data와 T 타입의 아이템을 받아 React 노드를 반환하는 함수인 renderItem을 기대합니다.

컴포넌트 내부에서는 data.map 메서드를 사용하여 renderItem 함수를 호출하고 현재 항목을 인수로 전달하여 데이터 배열의 각 항목을 렌더링합니다.

props 인터페이스에서 일반 유형 매개변수를 사용하면 컴포넌트가 다양한 유형의 데이터와 렌더링 함수를 처리할 수 있을 만큼 유연해집니다. 예를 들어 책 객체 배열과 각 책 항목을 별도의 Book 컴포넌트로 렌더링하는 함수를 전달하여 책 목록을 렌더링하는 데 GenericList 컴포넌트를 사용할 수 있습니다.

제네릭 타입을 사용하면 코드의 재사용성과 유연성을 높일 수 있으며, React Native에서 제네릭 및 재사용 가능한 컴포넌트를 빌드하는 데 강력한 툴입니다.

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

Jest는 React Native를 포함한 React 애플리케이션을 테스트하는 데 일반적으로 사용되는 JavaScript 테스트 프레임워크입니다. 테스트 커버리지 보고서 및 시각적 회귀 테스트를 위한 스냅샷과 같은 기능을 통해 직관적이고 사용하기 쉬운 테스트 환경을 제공합니다.

또한 @testing-library는 테스트에 대한 보다 사용자 중심적인 접근 방식을 제공하는 React용 테스트 유틸리티 모음입니다. 사용자가 상호 작용하는 것과 동일한 방식으로 컴포넌트를 테스트하는 데 중점을 두며 구현 세부 사항보다는 동작을 테스트하도록 권장합니다.

Jest와 @testing-library를 사용하여 프로젝트를 설정하려면 먼저 npm 또는 yarn을 사용하여 개발 종속 요소로 설치해야 합니다. 프로젝트 디렉토리에서 다음 명령을 실행하면 됩니다.

npm install --save-dev jest @testing-library/react-native @testing-library/jest-native

이러한 종속 요소를 설치한 후에는 프로젝트의 루트 디렉터리에 __tests__ 디렉터리를 만들 수 있습니다. 이 디렉토리에는 테스트하려는 컴포넌트에 해당하는 테스트 파일이 포함되어야 합니다. 예를 들어 Button 컴포넌트가 있는 경우 __tests__ 디렉터리 내에 Button.test.js 파일을 만들 수 있습니다.

테스트 파일에서 렌더링 및 fireEvent와 같은 @testing-library/react-native에서 필요한 함수를 임포트하여 컴포넌트를 렌더링하고 사용자 상호작용을 시뮬레이션할 수 있습니다. 또한 @testing-library/jest-native를 임포트하여 어설션에 대한 추가 일치자를 제공할 수도 있습니다.

 

 

또한 https://docs.expo.dev/guides/testing-with-jest/ 해당 내용을 따라 환경 구성을 마친 경우, App.js 파일과 동일한 디렉터리에 App.test.js라는 파일을 만들 수 있습니다.

App.test.js에서 컴포넌트가 충돌 없이 렌더링되는지 확인하는 테스트 케이스를 작성할 수 있습니다:

import React from 'react';
import { render } from '@testing-library/react-native';
import App from './App';

describe('App component', () => {
  test('renders without crashing', () => {
    render(<App />);
  });
});

여기서는 가상 DOM 환경에서 컴포넌트를 렌더링할 수 있도록 @testing-library/react-native에서 렌더 함수를 가져옵니다. 그런 다음 렌더 함수를 사용하여 앱 컴포넌트를 렌더링하고 오류가 발생하지 않는지 확인합니다.

컴포넌트의 동작을 확인하기 위해 보다 구체적인 테스트를 작성할 수도 있습니다. 예를 들어 앱 컴포넌트에 클릭 시 카운터가 증가하는 버튼이 있다고 가정해 보겠습니다. 버튼을 클릭할 때 카운터가 증가하는지 확인하는 테스트를 작성할 수 있습니다.

import React from 'react';
import { fireEvent, render } from '@testing-library/react-native';
import App from './App';

describe('App component', () => {
  test('counter increments when button is clicked', () => {
    const { getByTestId } = render(<App />);
    const button = getByTestId('increment-button');
    const counter = getByTestId('counter');

    fireEvent.press(button);

    expect(counter.props.children).toEqual(1);
  });
});

이 테스트에서는 먼저 앱 컴포넌트를 렌더링하고 getByTestId 함수를 사용하여 버튼과 카운터 요소에 대한 참조를 가져옵니다. 그런 다음 fireEvent.press 함수를 사용하여 버튼의 클릭 이벤트를 시뮬레이션하고 카운터 값이 1로 증가했는지 확인합니다.

이는 ReactNative에서 Jest를 사용하여 테스트 코드를 작성하는 방법의 몇 가지 예시일 뿐입니다. 코드의 품질을 보장하기 위해 사용할 수 있는 테스트 방법과 어설션은 더 많이 있습니다.

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

리액트 내비게이션의 내비게이터에 있는 프레젠테이션 프로퍼티는 화면 사이를 탐색할 때 사용자에게 화면이 표시되는 방식을 구성하는 데 사용됩니다. 프레젠테이션 API는 개발자가 이러한 프레젠테이션 스타일을 지정할 수 있게 해주는 기반 기술로, React Native 앱에서 보다 네이티브와 유사한 사용자 경험을 제공할 수 있게 해줍니다.

카드 방식

import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
          cardStyle: { backgroundColor: '#fff' },
        }}
        initialRouteName="Home"
        presentation="card"
      >
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Details" component={DetailsScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

모달 방식

import { createNativeStackNavigator } from '@react-navigation/native-stack';

const Stack = createNativeStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
          cardStyle: { backgroundColor: '#fff' },
          presentation: 'modal',
        }}
        initialRouteName="Home"
      >
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Details" component={DetailsScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

이 두 예제 모두 createStackNavigator 또는 createNativeStackNavigator 함수를 사용하여 스택 내비게이터를 만든 다음 원하는 프레젠테이션 스타일에 따라 프레젠테이션 프로퍼티를 "카드" 또는 "모달"로 설정합니다. 또한 두 예제 모두 화면의 헤더 및 배경 스타일을 사용자 지정할 수 있는 옵션이 포함되어 있습니다. 이 예제들은 React Native 프로젝트에서 일반적으로 자주 사용됩니다.

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

A/B 테스트는 기능이나 디자인 요소의 두 가지 버전을 테스트하여 어떤 버전이 더 나은 성능을 발휘하는지 확인하는 데 사용되는 기법입니다. React Native에서 A/B 테스트는 앱의 사용자 인터페이스 또는 기능의 다양한 변형을 테스트하여 어떤 버전이 더 나은 사용자 참여 또는 전환을 유도하는지 확인하는 데 사용할 수 있습니다.

React Native 앱에서 A/B 테스트를 수행하려면 Firebase Remote Config를 제공하는 react-native-firebase 라이브러리를 사용할 수 있습니다. 사용자가 앱 스토어에서 새 버전의 앱을 다운로드할 필요 없이 Firebase Remote Config를 사용하여 원격으로 앱을 구성하고 업데이트할 수 있습니다.

먼저 사용 환경에 따라 react-native-firebase 라이브러리를 구성해야 합니다.
React Native Firebase | React Native Firebase

 

React Native Firebase | React Native Firebase

Welcome to React Native Firebase! To get started, you must first setup a Firebase project and install the "app" module. React Native Firebase is the officially recommended collection of packages that brings React Native support for all Firebase services on

rnfirebase.io

 

다음은 Firebase Remote Config를 사용하여 React Native 앱에서 A/B 테스트를 수행하는 방법을 보여주는 코드 스니펫 예시입니다.

import React, { useState, useEffect } from 'react';
import { Text, View } from 'react-native';
import firebase from 'react-native-firebase';

const App = () => {
  const [isVariantA, setIsVariantA] = useState(true);

  useEffect(() => {
    firebase.remoteConfig().fetchAndActivate().then(() => {
      const isVariantA = firebase.remoteConfig().getBoolean('variant_a_enabled');
      setIsVariantA(isVariantA);
    });
  }, []);

  return (
    <View>
      {isVariantA ? (
        <Text>Variant A</Text>
      ) : (
        <Text>Variant B</Text>
      )}
    </View>
  );
};

export default App;

이 예제에서는 먼저 파이어베이스 라이브러리를 포함한 필요한 종속성을 임포트합니다. 그런 다음 isVariantA라는 상태 변수를 true로 초기화하는 App이라는 컴포넌트를 정의합니다. 그런 다음 사용효과 훅을 사용하여 Firebase에서 원격 구성 값을 가져와 활성화합니다. variant_a_enabled라는 원격 구성 매개변수의 부울 값을 검색하고 그에 따라 isVariantA 상태를 설정합니다.

마지막으로 조건부 렌더링을 사용하여 isVariantA 상태에 따라 "Variant A" 또는 "Variant B"를 렌더링합니다. 이렇게 하면 앱의 UI 또는 기능의 두 가지 버전을 쉽게 테스트하고 비교하여 어떤 버전이 더 성능이 좋은지 확인할 수 있습니다.

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee

React Native WebView는 개발자가 네이티브 모바일 앱 내에서 웹 콘텐츠를 렌더링할 수 있도록 해주는 React Native 프레임워크의 컴포넌트입니다. 웹 기반 콘텐츠를 모바일 애플리케이션에 임베드하는 방법을 제공하여 개발자가 웹과 네이티브 기능을 결합한 하이브리드 애플리케이션을 구축할 수 있도록 합니다.

react-native-webview/react-native-webview: React Native Cross-Platform WebView

React Native WebView 컴포넌트는 핵심 Android 및 iOS 플랫폼의 WebView 컴포넌트를 기반으로 합니다. 이를 통해 개발자는 네이티브 플랫폼의 웹 브라우저에서 사용하는 것과 동일한 렌더링 엔진을 사용하여 웹 콘텐츠를 렌더링할 수 있으며, 이는 웹 콘텐츠가 네이티브 웹 브라우저와 동일한 성능과 기능으로 렌더링된다는 것을 의미합니다.

다음은 React Native WebView를 사용하는 방법의 예시입니다

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

const MyWebView = () => {
  return (
    <WebView
      source={{ uri: 'https://www.example.com/' }}
      style={{ flex: 1 }}
    />
  );
}

export default MyWebView;

이 예시에서는 react-native-webview 라이브러리에서 WebView 컴포넌트를 가져와서 MyWebView라는 컴포넌트 내에서 렌더링하고 있습니다. 소스 프로퍼티를 WebView 컴포넌트 내에서 로드될 URL로 설정하고 있습니다. 또한 스타일 프로퍼티를 { flex: 1 }로 설정하여 WebView가 컨테이너 내의 사용 가능한 공간을 채우도록 합니다.

이것은 React Native WebView를 사용하는 방법의 기본적인 예시일 뿐입니다. 라이브러리는 개발자가 WebView 컴포넌트의 동작과 모양을 사용자 정의하는 데 사용할 수 있는 더 많은 프로퍼티와 기능을 제공합니다.

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

const MyWebView = () => {
  return (
    <WebView
      source={{ uri: 'https://www.example.com/' }}
      style={{ flex: 1 }}
      javaScriptEnabled={true}
      domStorageEnabled={true}
      automaticallyAdjustContentInsets={false}
      startInLoadingState={true}
      renderLoading={() => (
        <ActivityIndicator size="large" color="#0000ff" />
      )}
      onError={(error) => {
        console.log(`WebView error: ${error}`);
      }}
    />
  );
}

export default MyWebView;

이 예제에서는 WebView 컴포넌트에 몇 가지 프로퍼티를 추가했습니다

  • javaScriptEnabled는 WebView에서 JavaScript가 활성화되어 있는지 여부를 나타내는 부울입니다. true로 설정하면 WebView가 JavaScript를 지원합니다.
  • domStorageEnabled는 WebView에서 DOM 스토리지 API가 활성화되었는지 여부를 나타내는 부울입니다. true로 설정하면 WebView가 로컬 스토리지와 세션 스토리지를 지원합니다.
  • automaticallyAdjustContentInsets는 웹뷰가 스크롤 위치에 따라 콘텐츠 인셋을 자동으로 조정할지 여부를 나타내는 부울입니다. false로 설정하면 웹뷰가 콘텐츠 삽입을 조정하지 않습니다.
  • startInLoadingState는 웹뷰가 콘텐츠 로드를 처음 시작할 때 로딩 표시기를 표시할지 여부를 나타내는 부울입니다. true로 설정하면 웹뷰에 로딩 표시기가 표시됩니다.
  • renderLoading은 WebView가 콘텐츠를 로딩하는 동안 표시할 컴포넌트를 반환하는 함수입니다. 이 예제에서는 회전하는 로딩 표시기를 표시하기 위해 React Native의 ActivityIndicator 컴포넌트를 사용하고 있습니다.
  • onError는 WebView가 콘텐츠를 로드하는 동안 오류가 발생했을 때 호출되는 함수입니다. 이 예시에서는 오류 메시지를 콘솔에 로깅하고 있습니다.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
http://bit.ly/3Y34pE0

Posted by cipleee