리액트 네이티브에서 네이티브 모듈 개발하기 🚀

콘텐츠 대표 이미지 - 리액트 네이티브에서 네이티브 모듈 개발하기 🚀

 

 

안녕하세요, 여러분! 오늘은 정말 흥미진진한 주제로 여러분과 함께 시간을 보내려고 해요. 바로 리액트 네이티브에서 네이티브 모듈을 개발하는 방법에 대해 알아볼 거예요. 😃 이 주제는 모바일 앱 개발자들에게 매우 중요한 스킬이며, 여러분의 앱 개발 능력을 한 단계 더 높여줄 거예요!

여러분, 혹시 재능넷이라는 사이트를 아시나요? 재능넷은 다양한 재능을 거래할 수 있는 플랫폼인데요. 이런 플랫폼을 만들 때도 리액트 네이티브와 네이티브 모듈이 사용될 수 있답니다. 그만큼 우리가 배울 내용이 실제로 많이 활용된다는 뜻이죠!

자, 그럼 우리의 흥미진진한 여정을 시작해볼까요? 🎢

1. 리액트 네이티브와 네이티브 모듈의 관계 이해하기 🤝

먼저, 리액트 네이티브와 네이티브 모듈이 무엇인지, 그리고 왜 이 둘을 함께 사용하는지 알아볼까요?

리액트 네이티브(React Native)는 페이스북에서 개발한 오픈 소스 모바일 애플리케이션 프레임워크예요. 이를 사용하면 자바스크립트와 리액트를 이용해 iOS와 안드로이드용 네이티브 모바일 앱을 만들 수 있죠.

네이티브 모듈(Native Modules)은 리액트 네이티브 앱에서 플랫폼 특정 기능을 사용할 수 있게 해주는 브릿지 역할을 합니다. 즉, 자바스크립트로 작성된 리액트 네이티브 코드와 네이티브 플랫폼(iOS의 Swift/Objective-C, 안드로이드의 Java/Kotlin) 사이의 통신을 가능하게 해주는 거예요.

왜 네이티브 모듈이 필요할까요? 🤔 그 이유는 다음과 같아요:

  • ✅ 플랫폼 특정 기능 사용: 예를 들어, 디바이스의 센서나 하드웨어에 접근할 때
  • ✅ 성능 향상: 복잡한 연산이나 그래픽 처리 등을 네이티브 코드로 처리할 때
  • ✅ 기존 네이티브 라이브러리 활용: 이미 개발된 네이티브 라이브러리를 리액트 네이티브 앱에서 사용하고 싶을 때
  • ✅ 커스텀 UI 컴포넌트 생성: 리액트 네이티브에서 제공하지 않는 특별한 UI 요소를 만들 때

이제 리액트 네이티브와 네이티브 모듈의 관계를 이해하셨나요? 그럼 이제 본격적으로 네이티브 모듈을 개발하는 방법을 알아볼까요? 😎

2. 네이티브 모듈 개발 준비하기 🛠️

네이티브 모듈을 개발하기 전에, 우리는 몇 가지 준비를 해야 해요. 마치 요리를 시작하기 전에 재료와 도구를 준비하는 것처럼 말이죠! 😄

2.1 개발 환경 설정

먼저, 리액트 네이티브 개발 환경이 제대로 설정되어 있는지 확인해야 해요. 다음 항목들을 체크해보세요:

  • 🔍 Node.js와 npm (또는 yarn) 설치
  • 🔍 리액트 네이티브 CLI 설치
  • 🔍 Xcode (iOS 개발용)
  • 🔍 Android Studio (안드로이드 개발용)

이 모든 것이 준비되어 있다면, 여러분은 이미 절반은 성공한 거나 다름없어요! 👏

2.2 프로젝트 생성

이제 새로운 리액트 네이티브 프로젝트를 생성해볼까요? 터미널을 열고 다음 명령어를 입력해주세요:

npx react-native init MyNativeModuleProject

이 명령어는 'MyNativeModuleProject'라는 이름의 새 리액트 네이티브 프로젝트를 생성할 거예요. 물론, 여러분이 원하는 다른 이름으로 바꿔도 좋아요!

2.3 네이티브 모듈 구조 이해하기

네이티브 모듈은 크게 세 부분으로 구성돼요:

1. 네이티브 코드: iOS의 경우 Swift나 Objective-C로, 안드로이드의 경우 Java나 Kotlin으로 작성된 코드

2. 브릿지 코드: 네이티브 코드와 JavaScript 사이의 통신을 담당하는 코드

3. JavaScript 인터페이스: 리액트 네이티브 앱에서 네이티브 모듈을 사용할 수 있게 해주는 JavaScript 코드

이 구조를 이해하는 것이 네이티브 모듈 개발의 첫 걸음이에요. 마치 집을 지을 때 기초공사가 중요한 것처럼 말이죠! 🏗️

자, 이제 우리는 네이티브 모듈 개발을 위한 모든 준비를 마쳤어요. 다음 섹션에서는 실제로 네이티브 모듈을 만들어보겠습니다. 여러분, 준비되셨나요? Let's go! 🚀

3. iOS용 네이티브 모듈 개발하기 🍏

이제 본격적으로 iOS용 네이티브 모듈을 개발해볼 거예요. 여러분, 긴장되나요? 걱정 마세요. 천천히, 그리고 재미있게 배워볼 거예요! 😊

3.1 Swift로 네이티브 코드 작성하기

먼저, Swift로 간단한 네이티브 모듈을 만들어볼게요. 이 모듈은 간단한 문자열을 반환하는 기능을 할 거예요.

Xcode에서 새로운 Swift 파일을 생성하고 (예: MyAwesomeModule.swift), 다음 코드를 입력해주세요:


import Foundation

@objc(MyAwesomeModule)
class MyAwesomeModule: NSObject {
  
  @objc
  func getAwesomeMessage(_ callback: RCTResponseSenderBlock) {
    callback(["Hello from Swift! You're awesome! 🎉"])
  }
  
  @objc
  static func requiresMainQueueSetup() -> Bool {
    return true
  }
}
  

이 코드가 하는 일을 간단히 설명해드릴게요:

  • 🔹 @objc(MyAwesomeModule): 이 어노테이션은 Objective-C에서 이 클래스를 사용할 수 있게 해줘요.
  • 🔹 getAwesomeMessage 함수: 이 함수는 콜백을 통해 메시지를 JavaScript로 전달해요.
  • 🔹 requiresMainQueueSetup: 이 함수는 모듈이 메인 큐에서 초기화되어야 하는지를 React Native에 알려줘요.

3.2 Objective-C 브릿지 생성하기

다음으로, Swift 코드와 React Native를 연결해주는 Objective-C 브릿지를 만들어야 해요. 새로운 Objective-C 파일을 생성하고 (예: MyAwesomeModule.m), 다음 코드를 입력해주세요:


#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(MyAwesomeModule, NSObject)

RCT_EXTERN_METHOD(getAwesomeMessage:(RCTResponseSenderBlock)callback)

@end
  

이 코드는 Swift에서 정의한 MyAwesomeModule 클래스와 getAwesomeMessage 메소드를 React Native에 노출시켜줘요.

3.3 JavaScript 인터페이스 만들기

마지막으로, React Native 앱에서 이 네이티브 모듈을 사용할 수 있게 해주는 JavaScript 인터페이스를 만들어볼게요. 프로젝트 루트에 MyAwesomeModule.js 파일을 생성하고 다음 코드를 입력해주세요:


import { NativeModules } from 'react-native';

const { MyAwesomeModule } = NativeModules;

export default {
  getAwesomeMessage: (callback) => {
    MyAwesomeModule.getAwesomeMessage(callback);
  },
};
  

이제 우리의 첫 번째 iOS 네이티브 모듈이 완성되었어요! 👏👏👏

3.4 네이티브 모듈 사용하기

이제 우리가 만든 네이티브 모듈을 React Native 앱에서 사용해볼까요? App.js 파일을 열고 다음과 같이 수정해주세요:


import React, { useEffect } from 'react';
import { View, Text } from 'react-native';
import MyAwesomeModule from './MyAwesomeModule';

const App = () => {
  useEffect(() => {
    MyAwesomeModule.getAwesomeMessage((message) => {
      console.log(message);
    });
  }, []);

  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text>Check the console for the awesome message!</Text>
    </View>
  );
};

export default App;
  

이제 앱을 실행하면, 콘솔에 "Hello from Swift! You're awesome! 🎉"라는 메시지가 출력될 거예요. 축하드려요! 여러분은 방금 첫 번째 iOS 네이티브 모듈을 만들고 사용해보셨어요! 🎉🎉🎉

네이티브 모듈 개발이 생각보다 어렵지 않죠? 이제 우리는 iOS 디바이스의 다양한 기능들을 React Native 앱에서 활용할 수 있게 되었어요. 마치 재능넷에서 새로운 재능을 습득한 것처럼 말이에요! 😄

다음 섹션에서는 안드로이드용 네이티브 모듈을 개발하는 방법을 알아볼 거예요. 계속해서 흥미진진한 여정을 이어가볼까요? 💪

4. 안드로이드용 네이티브 모듈 개발하기 🤖

자, 이제 안드로이드용 네이티브 모듈을 개발해볼 차례예요. iOS와 비슷하지만, 몇 가지 다른 점이 있어요. 함께 알아볼까요? 😃

4.1 Kotlin으로 네이티브 코드 작성하기

안드로이드 스튜디오에서 새로운 Kotlin 파일을 생성해주세요 (예: MyAwesomeModule.kt). 그리고 다음 코드를 입력해주세요:


package com.myawesomeapp

import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.Callback

class MyAwesomeModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {

    override fun getName(): String {
        return "MyAwesomeModule"
    }

    @ReactMethod
    fun getAwesomeMessage(callback: Callback) {
        callback.invoke("Hello from Kotlin! You're awesome! 🎉")
    }
}
  

이 코드가 하는 일을 간단히 설명해드릴게요:

  • 🔸 ReactContextBaseJavaModule을 상속받아 네이티브 모듈 클래스를 만들어요.
  • 🔸 getName() 함수는 JavaScript에서 이 모듈을 참조할 때 사용할 이름을 반환해요.
  • 🔸 @ReactMethod 어노테이션은 이 메소드를 JavaScript에서 호출할 수 있게 해줘요.
  • 🔸 getAwesomeMessage 함수는 iOS 버전과 비슷하게 콜백을 통해 메시지를 전달해요.

4.2 패키지 클래스 만들기

다음으로, 우리가 만든 모듈을 React Native에 등록할 패키지 클래스를 만들어야 해요. 새로운 Kotlin 파일 (예: MyAwesomePackage.kt)을 만들고 다음 코드를 입력해주세요:


package com.myawesomeapp

import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager

class MyAwesomePackage : ReactPackage {

    override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
        return listOf(MyAwesomeModule(reactContext))
    }

    override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
        return emptyList()
    }
}
  

이 패키지 클래스는 우리가 만든 MyAwesomeModule을 React Native에 등록해줘요.

4.3 MainApplication.java 수정하기

이제 우리가 만든 패키지를 React Native 앱에 추가해야 해요. android/app/src/main/java/com/myawesomeapp/MainApplication.java 파일을 열고 다음과 같이 수정해주세요:


// ... 기존 import문들

import com.myawesomeapp.MyAwesomePackage; // 새로 추가

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost =
      new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
          return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
          // 아래 줄 추가
          packages.add(new MyAwesomePackage());
          return packages;
        }

        // ... 나머지 코드
      };

  // ... 나머지 코드
}
  

이렇게 하면 우리가 만든 네이티브 모듈이 안드로이드 앱에 등록돼요.

4.4 JavaScript 인터페이스 만들기

iOS 섹션에서 만든 MyAwesomeModule.js 파일을 그대로 사용할 수 있어요. 안드로이드와 iOS 모두에서 동일한 인터페이스로 작동하기 때문이죠.

4.5 네이티브 모듈 사용하기

이제 우리의 안드로이드 네이티브 모듈도 완성되었어요! iOS와 마찬가지로 App.js 파일에서 사용할 수 있어요:


import React, { useEffect } from 'react';
import { View, Text } from 'react-native';
import MyAwesomeModule from './MyAwesomeModule';

const App = () => {
  useEffect(() => {
    MyAwesomeModule.getAwesomeMessage((message) => {
      console.log(message);
    });
  }, []);

  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text>Check the console for the awesome message!</Text>
    </View>
  );
};

export default App;
  

앱을 실행하면, 이번에는 "Hello from Kotlin! You're awesome! 🎉"라는 메시지가 콘솔에 출력될 거예요. 축하합니다! 여러분은 이제 안드로이드 네이티브 모듈도 만들 수 있게 되었어요! 🎉🎉🎉

와우! 여러분은 이제 iOS와 안드로이드 모두를 위한 네이티브 모듈을 개발할 수 있게 되었어요. 이것은 정말 대단한 성과예요! 마치 재능넷에서 두 가지 재능을 동시에 습득한 것과 같죠? 😄

다음 섹션에서는 좀 더 복잡한 네이티브 모듈을 만들어보고, 실제 앱 개발에서 어떻게 활용할 수 있는지 알아볼 거예요. 계속해서 이 흥미진진한 여정을 함께 해주세요! 💪

5. 실용적인 네이티브 모듈 개발하기 🛠️

자, 이제 우리는 기본적인 네이티브 모듈 개발 방법을 알게 되었어요. 하지만 실제 앱 개발에서는 더 복잡하고 유용한 기능이 필요하겠죠? 이번에는 실제로 유용하게 사용할 수 있는 네이티브 모듈을 만들어볼게요. 어떤 걸 만들어볼까요? 🤔

음... 아하! 디바이스의 배터리 정보를 가져오는 모듈을 만들어보는 건 어떨까요? 이 모듈은 배터리 잔량과 충전 상태를 알려줄 거예요. 재능넷 같은 앱에서도 이런 정보가 유용할 수 있겠죠? 사용자의 배터리가 부족할 때 알림을 주는 등의 기능을 구현할 수 있을 테니까요! 😊

5.1 iOS용 배터리 정보 모듈 만들기

먼저 iOS용 모듈부터 만들어볼게요. Swift 파일 (BatteryInfoModule.swift)을 생성하고 다음 코드를 입력해주세요:


import Foundation
import UIKit

@objc(BatteryInfoModule)
class BatteryInfoModule: NSObject {
  
  @objc
  func getBatteryInfo(_ callback: RCTResponseSenderBlock) {
    UIDevice.current.isBatteryMonitoringEnabled = true
    
    let batteryLevel = UIDevice.current.batteryLevel
    let batteryState = UIDevice.current.batteryState
    
    var stateString = "unknown"
    switch batteryState {
    case .charging:
      stateString = "charging"
    case .full:
      stateString = "full"
    case .unplugged:
      stateString = "unplugged"
    case .unknown:
      stateString = "unknown"
    @unknown default:
      stateString = "unknown"
    }
    
    let batteryInfo = [
      "level": batteryLevel < 0 ? "unknown" : String(format: "%.2f", batteryLevel * 100),
      "state": stateString
    ]
    
    callback([NSNull(), batteryInfo])
    
    UIDevice.current.isBatteryMonitoringEnabled = false
  }
  
  @objc
  static func requiresMainQueueSetup() -> Bool {
    return true
  }
}
  

이 코드는 디바이스의 배터리 레벨과 상태를 가져와서 JavaScript로 전달해줘요.

이제 Objective-C 브릿지 파일 (BatteryInfoModule.m)을 만들고 다음 코드를 입력해주세요:


#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(BatteryInfoModule, NSObject)

RCT_EXTERN_METHOD(getBatteryInfo:(RCTResponseSenderBlock)callback)

@end
  

5.2 안드로이드용 배터리 정보 모듈 만들기

이제 안드로이드용 모듈을 만들어볼게요. Kotlin 파일 (BatteryInfoModule.kt)을 생성하고 다음 코드를 입력해주세요:


package com.myawesomeapp

import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import com.facebook.react.bridge.*

class BatteryInfoModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {

    override fun getName(): String {
        return "BatteryInfoModule"
    }

    @ReactMethod
    fun getBatteryInfo(callback: Callback) {
        val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter ->
            reactApplicationContext.registerReceiver(null, ifilter)
        }

        val batteryPct: Float? = batteryStatus?.let {  intent ->
            val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
            val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
            level * 100 / scale.toFloat()
        }

        val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
        val stateString = when (status) {
            BatteryManager.BATTERY_STATUS_CHARGING -> "charging"
            BatteryManager.BATTERY_STATUS_FULL -> "full"
            BatteryManager.BATTERY_STATUS_DISCHARGING, BatteryManager.BATTERY_STATUS_NOT_CHARGING -> "unplugged"
            else -> "unknown"
        }

        val batteryInfo = Arguments.createMap().apply {
            putString("level", if (batteryPct != null) String.format("%.2f", batteryPct) else "unknown")
            putString("state", stateString)
        }

        callback.invoke(null, batteryInfo)
    }
}
  

이 코드는 안드로이드 디바이스의 배터리 정보를 가져와 JavaScript로 전달해줍니다.

그리고 패키지 클래스 (BatteryInfoPackage.kt)도 만들어주세요:


package com.myawesomeapp

import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager

class BatteryInfoPackage : ReactPackage {
    override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
        return listOf(BatteryInfoModule(reactContext))
    }

    override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
        return emptyList()
    }
}
  

그리고 MainApplication.java 파일에 이 패키지를 추가하는 것도 잊지 마세요!

5.3 JavaScript 인터페이스 만들기

이제 이 모듈을 사용할 JavaScript 인터페이스를 만들어볼게요. BatteryInfoModule.js 파일을 생성하고 다음 코드를 입력해주세요:


import { NativeModules } from 'react-native';

const { BatteryInfoModule } = NativeModules;

export default {
  getBatteryInfo: (callback) => {
    BatteryInfoModule.getBatteryInfo((error, batteryInfo) => {
      if (error) {
        console.error(error);
        return;
      }
      callback(batteryInfo);
    });
  },
};
  

5.4 배터리 정보 모듈 사용하기

이제 우리가 만든 배터리 정보 모듈을 사용해볼까요? App.js 파일을 다음과 같이 수정해주세요:


import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import BatteryInfoModule from './BatteryInfoModule';

const App = () => {
  const [batteryInfo, setBatteryInfo] = useState({ level: 'Unknown', state: 'Unknown' });

  useEffect(() => {
    BatteryInfoModule.getBatteryInfo((info) => {
      setBatteryInfo(info);
    });
  }, []);

  return (
    <View style={styles.container}>
      <Text style={styles.title}>Battery Info</Text>
      <Text style={styles.info}>Level: {batteryInfo.level}%</Text>
      <Text style={styles.info}>State: {batteryInfo.state}</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  title: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  info: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

export default App;
  

와우! 이제 우리 앱은 디바이스의 배터리 정보를 보여줄 수 있게 되었어요. 이런 기능은 실제 앱에서 정말 유용하게 사용될 수 있죠. 예를 들어, 배터리가 부족할 때 사용자에게 알림을 주거나, 배터리 절약 모드를 활성화하는 등의 기능을 구현할 수 있어요.

여러분은 이제 iOS와 안드로이드 모두에서 작동하는 실용적인 네이티브 모듈을 만들 수 있게 되었어요. 이것은 정말 대단한 성과입니다! 🎉🎉🎉

이런 식으로, 여러분은 디바이스의 다양한 기능들(카메라, 센서, 파일 시스템 등)에 접근하는 네이티브 모듈을 만들 수 있어요. 이를 통해 React Native 앱의 기능을 크게 확장할 수 있죠.

네이티브 모듈 개발은 처음에는 조금 어려울 수 있지만, 연습을 통해 점점 익숙해질 거예요. 마치 재능넷에서 새로운 재능을 연마하는 것처럼 말이죠! 계속해서 도전하고 학습하세요. 여러분의 앱 개발 능력은 계속해서 성장할 거예요! 💪😊

6. 마무리 및 추가 학습 방향 🎓

여러분, 정말 대단해요! 우리는 함께 리액트 네이티브에서 네이티브 모듈을 개발하는 방법을 배웠어요. 이제 여러분은 iOS와 안드로이드 모두를 위한 네이티브 모듈을 만들 수 있게 되었죠. 이는 앱 개발의 새로운 차원을 열어주는 강력한 도구가 될 거예요. 🚀

하지만 이것은 시작에 불과해요. 네이티브 모듈 개발에는 더 많은 것들이 있답니다. 여러분의 학습 여정을 계속하기 위해, 다음과 같은 주제들을 더 공부해보는 것은 어떨까요?

  • ✅ 비동기 네이티브 모듈 개발: Promise를 사용하여 비동기 작업을 처리하는 방법
  • ✅ 이벤트 에미터: 네이티브 코드에서 JavaScript로 이벤트를 보내는 방법
  • ✅ UI 컴포넌트 네이티브 모듈: 커스텀 네이티브 UI 컴포넌트를 만드는 방법
  • ✅ 성능 최적화: 네이티브 모듈을 사용하여 앱의 성능을 개선하는 방법
  • ✅ 서드파티 라이브러리 통합: 기존의 네이티브 라이브러리를 React Native 앱에 통합하는 방법

네이티브 모듈 개발은 React Native 개발자로서 여러분의 가치를 크게 높여줄 거예요. 여러분은 이제 JavaScript만으로는 불가능했던 기능들을 구현할 수 있게 되었으니까요!

마지막으로, 항상 기억하세요. 코딩은 실천이 중요해요. 이론만 알고 있는 것보다는 직접 만들어보고 실험해보는 것이 훨씬 더 효과적인 학습 방법이에요. 마치 재능넷에서 새로운 재능을 연마하는 것처럼, 꾸준한 연습을 통해 여러분의 네이티브 모듈 개발 실력을 향상시켜 나가세요.

여러분의 React Native 개발 여정에 행운이 함께하기를 바랍니다! 화이팅! 💪😊