React Native 카메라 기능 구현: 사진 및 비디오 촬영

작성일 :

React Native 카메라 기능 구현: 사진 및 비디오 촬영

React Native는 크로스 플랫폼 모바일 애플리케이션 개발을 위한 인기 있는 프레임워크입니다. 다양한 모바일 기능을 지원하지만, 그 중에서도 카메라 기능은 사진 및 비디오 촬영 애플리케이션에서 매우 중요합니다. 이 글에서는 React Native에서 카메라 기능을 구현하는 데 필요한 기본 지식과 실습 예제를 설명합니다.

환경 설정

먼저, React Native 프로젝트를 생성하고 카메라 기능을 구현하기 위해 필요한 패키지를 설치해야 합니다. react-native-camera 라이브러리는 카메라 기능을 쉽게 사용할 수 있도록 도와줍니다.

프로젝트 생성 및 설치

먼저, 새로운 React Native 프로젝트를 생성합니다:

bash
npx react-native init CameraApp
cd CameraApp

이제 react-native-camera 패키지를 설치합니다:

bash
npm install react-native-camera

iOS 플랫폼의 경우 추가로 CocoaPods 설치가 필요합니다:

bash
cd ios
pod install
cd ..

기본 카메라 구성

다음으로, 기본적인 카메라 구성을 위해 CameraScreen.js 파일을 생성하고 다음과 같이 작성합니다:

javascript
import React, { useRef } from 'react';
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import { RNCamera } from 'react-native-camera';

const CameraScreen = () => {
  const cameraRef = useRef(null);

  const takePicture = async () => {
    if (cameraRef.current) {
      const options = { quality: 0.5, base64: true };
      const data = await cameraRef.current.takePictureAsync(options);
      console.log(data.uri);
    }
  };

  return (
    <View style={styles.container}>
      <RNCamera
        ref={cameraRef}
        style={styles.preview}
        type={RNCamera.Constants.Type.back}
        flashMode={RNCamera.Constants.FlashMode.on}
      />
      <View style={styles.captureContainer}>
        <TouchableOpacity onPress={takePicture} style={styles.captureButton}>
          <Text style={styles.captureText}> SNAP </Text>
        </TouchableOpacity>
      </View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    backgroundColor: 'black'
  },
  preview: {
    flex: 1,
    justifyContent: 'flex-end',
    alignItems: 'center'
  },
  captureContainer: {
    flex: 0,
    flexDirection: 'row',
    justifyContent: 'center',
    margin: 20
  },
  captureButton: {
    flex: 0,
    backgroundColor: '#fff',
    borderRadius: 5,
    padding: 15,
    paddingHorizontal: 20,
    alignSelf: 'center'
  },
  captureText: {
    fontSize: 14
  }
});

export default CameraScreen;

여기서 우리는 react-native-camera 라이브러리를 사용해 카메라 프리뷰를 화면에 출력하고, 화면 중앙에 있는 버튼을 눌러 사진을 찍을 수 있도록 했습니다.

사진 촬영 기능 추가

위의 코드에서 takePicture 함수는 간단한 방법으로 사진을 촬영합니다. 촬영된 사진 데이터는 data.uri에 저장됩니다. 참고로, options 객체를 통해 촬영 옵션을 지정할 수 있습니다.

추가적으로 촬영된 사진을 저장하거나 업로드하는 기능을 구현하려면, 파일 시스템 접근이나 네트워크 요청 모듈을 사용해야 합니다. react-native-fs 또는 axios 라이브러리를 사용하여 파일을 로컬에 저장하거나 서버로 업로드할 수 있습니다.

비디오 촬영 기능 추가

비디오 촬영 기능도 비슷한 방식으로 구현할 수 있습니다. 카메라 설정에서 비디오 모드를 활성화하고, 촬영 시작 및 종료 메서드를 호출하면 됩니다.

비디오 촬영 예제

다음으로, 비디오 촬영 기능을 추가한 예제를 보겠습니다:

javascript
import React, { useRef, useState } from 'react';
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import { RNCamera } from 'react-native-camera';

const CameraScreen = () => {
  const cameraRef = useRef(null);
  const [isRecording, setIsRecording] = useState(false);

  const takeVideo = async () => {
    if (cameraRef.current && !isRecording) {
      setIsRecording(true);
      const options = { quality: RNCamera.Constants.VideoQuality['480p'], maxDuration: 60 };
      const data = await cameraRef.current.recordAsync(options);
      console.log(data.uri);
      setIsRecording(false);
    }
  };

  const stopVideo = async () => {
    if (cameraRef.current && isRecording) {
      cameraRef.current.stopRecording();
    }
  };

  return (
    <View style={styles.container}>
      <RNCamera
        ref={cameraRef}
        style={styles.preview}
        type={RNCamera.Constants.Type.back}
        flashMode={RNCamera.Constants.FlashMode.on}
      />
      <View style={styles.captureContainer}>
        <TouchableOpacity onPress={isRecording ? stopVideo : takeVideo} style={styles.captureButton}>
          <Text style={styles.captureText}>{isRecording ? 'STOP' : 'RECORD'}</Text>
        </TouchableOpacity>
      </View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    backgroundColor: 'black'
  },
  preview: {
    flex: 1,
    justifyContent: 'flex-end',
    alignItems: 'center'
  },
  captureContainer: {
    flex: 0,
    flexDirection: 'row',
    justifyContent: 'center',
    margin: 20
  },
  captureButton: {
    flex: 0,
    backgroundColor: '#fff',
    borderRadius: 5,
    padding: 15,
    paddingHorizontal: 20,
    alignSelf: 'center'
  },
  captureText: {
    fontSize: 14
  }
});

export default CameraScreen;

위의 코드에서 takeVideo 함수는 비디오 촬영을 시작하고, stopVideo 함수는 촬영을 종료합니다. 비디오 촬영 중에는 버튼 텍스트가 'STOP'으로 바뀌며, 촬영이 종료되면 다시 'RECORD'로 변경됩니다.

결론

이 글에서는 React Native에서 react-native-camera 라이브러리를 사용하여 기본적인 사진 및 비디오 촬영 기능을 구현하는 방법을 설명했습니다. 이를 토대로 좀 더 복잡한 기능들도 비교적 쉽게 추가할 수 있습니다. 예를 들어, 촬영된 미디어 파일을 로컬 저장소에 저장하거나 클라우드 서버에 업로드하는 기능도 구현할 수 있습니다.

앞으로 해당 기능을 더 확장하여 다양한 사용자 요구를 충족하는 애플리케이션을 개발할 수 있을 것입니다. React Native의 강력한 기능을 활용하면 다양한 플랫폼에서 일관된 사용자 경험을 제공하는 애플리케이션을 개발할 수 있습니다.