개발/안드로이드

실무에서 가장 많이 사용하는 방법 - React 앱을 외부 서버에 배포하고 WebView에서 URL로 로드 방식

nix-be 2025. 4. 5. 14:21
728x90

 

✅ 실무에서 "방법 1"을 많이 사용하는 이유

이유 설명

🔁 React 코드 변경 시 업데이트가 쉬움 앱을 다시 빌드하지 않고도 웹 서버에서 코드만 수정하면 됩니다.
🌐 웹 개발팀과 앱 개발팀 분리 React는 프론트엔드 팀이, Android는 앱 팀이 따로 개발 가능
📦 앱 크기 최소화 React 빌드 파일을 포함하지 않아서 APK 용량이 작아집니다.
🚀 CD/CI 환경에 유리 배포 자동화가 쉽고 빠릅니다.

✅ 방법 1 요약

항목 설명

React 앱 위치 Netlify, Vercel, AWS, 사내 서버 등
WebView URL 예시 loadUrl("https://web.yourcompany.com/react-page")
실무 사용도 ⭐⭐⭐⭐⭐ 매우 많이 사용

✅ 방법 2는 언제 쓰나?

👉 "React 웹을 앱 안에 내장하고 싶을 때", 즉 오프라인에서도 무조건 작동해야 할 때입니다.

예시

공공기관 앱처럼 인터넷 없이 일부 콘텐츠를 보여줘야 할 때
전시회/교육용 앱처럼 설치 후 업데이트가 불가능한 경우
전파가 약한 지역에서도 앱이 작동해야 하는 경우

✅ 방법 2의 장단점

장점 단점

📡 오프라인 가능 🔁 React 코드 바꿀 때마다 앱 다시 빌드 필요
📦 외부 서버 없이 단독 실행 ⬆️ 앱 크기가 커짐 (리소스 포함됨)

🔚 정리: 어떤 방법을 써야 할까?

조건 추천 방법

인터넷 연결되는 일반 앱  방법 1: 외부 URL 로드 (가장 일반적이고 유지보수 쉬움)
오프라인에서도 작동해야 함  방법 2: React를 assets에 포함 (희귀하지만 필요한 경우 있음)

 

 

실무 코드 구조/CI 연동 예시도 정리

 

 

React 웹을 외부에 배포하고 WebView에서 로드하는 방식을 실무에서 실제 사용하는 형태로

✅ 코드 구조

✅ CI/CD 배포 흐름

✅ 실전 연동 팁


✅ 1. 실무에서 사용하는 기본 코드 구조

📁 Android (Jetpack Compose) 프로젝트

@Composable
fun MyWebViewScreen() {
    val context = LocalContext.current

    AndroidView(factory = { ctx ->
        WebView(ctx).apply {
            settings.javaScriptEnabled = true
            settings.domStorageEnabled = true
            addJavascriptInterface(MyBridge(context, this), "AndroidBridge")

            // 실무에서는 보통 회사 도메인에 배포된 React URL
            loadUrl("https://web.yourcompany.com/app/react-page")
        }
    })
}

📁 React 프로젝트 (src/App.js 예시)

function App() {
  const callAndroid = () => {
    if (window.AndroidBridge && window.AndroidBridge.openCamera) {
      window.AndroidBridge.openCamera();
    }
  };

  return (
    <div>
      <h2>React WebView 예시</h2>
      <button onClick={callAndroid}>📸 Android 카메라 호출</button>
    </div>
  );
}

React는 yarn build로 빌드 후 웹서버에 업로드만 하면 끝
Android는 https://web.yourcompany.com/~~~ 주소를 WebView에 세팅해 두기만 하면 React UI가 실시간 반영됩니다.


✅ 2. CI/CD 연동 예시 (React + Android 분리 배포)

📦 React 배포: GitHub → Vercel or Netlify

✅ vercel.json (또는 Netlify 설정)

{
  "rewrites": [{ "source": "/app/react-page", "destination": "/" }]
}
  • React 앱을 /app/react-page 경로에 서브배포 가능
  • 빌드 후 자동으로 배포되므로 안드로이드 코드를 수정하지 않고도 웹 내용만 바꿀 수 있음

✅ GitHub Action 예시 (.github/workflows/deploy-react.yml)

name: Deploy React App to Vercel

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm install
      - run: npm run build
      - uses: amondnet/vercel-action@v20
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.ORG_ID }}
          vercel-project-id: ${{ secrets.PROJECT_ID }}

🤖 Android 앱은 WebView 주소만 고정

React 웹이 배포만 잘 되어 있다면, Android는 loadUrl()만 신경 쓰면 됩니다.

webView.loadUrl("https://web.yourcompany.com/app/react-page")

React 수정사항 반영 시 APK 재배포 필요 없음. (💯 실무 핵심 포인트)


✅ 실무에서 이 구조가 왜 인기인가?

장점 설명

🔁 빠른 유지보수 React 수정만 해도 모든 앱 사용자에게 반영됨
🔒 백엔드와 분리 개발 React 프론트 팀, Android 앱 팀 따로 작업 가능
📦 앱 용량 작음 리소스 내장하지 않음
🚀 CI/CD 자동화 PR 머지 → 자동 배포 → 앱은 URL만 유지하면 됨

✅ 실무 구성 예시 (구조 정리)

🧱 Frontend (React)
├─ 빌드 후 Vercel/Netlify 배포
├─ 주소: https://web.yourcompany.com/app/react-page

📱 Android (Jetpack Compose)
├─ WebView 로드: loadUrl("https://web.yourcompany.com/app/react-page")
├─ JS ↔ Android 통신: addJavascriptInterface()

🛡️ 보안 실무 팁

체크 항목 이유

✅ https 도메인만 허용 WebView는 보안 상 http는 막아야 함
✅ JS 인터페이스 접근 제한 민감 기능 호출 시 도메인 체크 또는 인증 토큰 필요
✅ WebViewClient 사용 리디렉션/에러/로딩 처리 필요 시 커스터마이징
webView.webViewClient = object : WebViewClient() {
    override fun onReceivedError(...) {
        // 에러 처리
    }
}

✅ 요약

구성 요소 실무 활용

React 앱 Vercel/Netlify 등으로 배포, 빌드 후 자동화 가능
Android 앱 WebView로 React 주소 로딩, JS ↔ Android 연동
장점 빠른 유지보수, 자동화 배포, 앱 용량 최소화
실무 사용도 ⭐⭐⭐⭐⭐ 매우 높음

필요하시면:

  • React와 Android를 연동하는 미니 템플릿 프로젝트
  • Android ↔ React 양방향 통신 예제
  • WebViewClient에 로그인 세션 쿠키 연동 방식

 

728x90