Flutter 튜토리얼 64편: 데스크톱과 웹 배포

학습 목표#

  • macOS 앱을 App Store에 배포하기
  • Linux 앱을 Snap Store에 배포하기
  • Windows 앱을 Microsoft Store에 배포하기
  • Flutter 웹 앱을 Firebase Hosting에 배포하기

1. 데스크톱/웹 배포 개요#

1.1 왜 데스크톱/웹 배포가 필요한가?#

이유: 모바일만으로는 모든 사용자를 커버할 수 없습니다. 데스크톱 앱은 생산성 도구나 전문 소프트웨어에 적합하고, 웹 앱은 설치 없이 접근 가능한 진입점을 제공합니다.

1.2 플랫폼별 배포 흐름#

flowchart TD A[Flutter 앱] --> B{타겟 플랫폼} B -->|macOS| C[App Store Connect] B -->|Linux| D[Snap Store] B -->|Windows| E[Microsoft Store] B -->|Web| F[웹 호스팅] C --> G[TestFlight → 출시] D --> H[snapcraft 빌드 → 업로드] E --> I[MSIX 패키징 → 제출] F --> J[Firebase/GitHub Pages]

1.3 플랫폼별 요구사항 비교#

항목macOSLinuxWindowsWeb
스토어App StoreSnap StoreMicrosoft Store자체 호스팅
개발자 계정Apple Developer ($99/년)Snap 계정 (무료)Partner Center (무료~$19)불필요
패키징 도구Xcodesnapcraft1MSIX2flutter build web
서명 필요필수선택선택불필요

2. macOS - App Store 배포#

2.1 왜 App Store 배포를 선택하는가?#

이유: Mac App Store는 macOS 사용자에게 신뢰할 수 있는 공식 배포 채널입니다. Apple의 검증을 거쳐 보안성이 보장되고, 자동 업데이트와 결제 시스템을 활용할 수 있습니다.

2.2 사전 준비#

무엇을: App Store 배포를 위해 필요한 계정과 설정을 준비합니다.

준비 항목설명
Apple Developer Program연 $99 등록, 배포 인증서 발급 필요
App Store Connect앱 등록, 심사 관리, 판매 설정
Bundle ID3앱 고유 식별자 (예: com.example.myapp)
XcodemacOS 빌드 및 아카이브 생성

2.3 Xcode 프로젝트 설정#

어떻게: Xcode에서 macOS 프로젝트를 열고 필수 설정을 구성합니다.

Terminal window
# Flutter macOS 프로젝트 열기
open macos/Runner.xcworkspace

Xcode에서 설정할 항목:

설정위치
App CategoryGeneral → Identity앱 카테고리 선택
Bundle IdentifierGeneral → IdentityBundle ID 입력
Deployment TargetGeneral → Deployment InfomacOS 10.14 이상 권장
SigningSigning & CapabilitiesTeam 및 인증서 선택

2.4 앱 버전 설정#

무엇을: pubspec.yaml에서 버전 번호를 설정합니다.

pubspec.yaml
version: 1.0.0+1
# 형식: <version>+<build>
# version: App Store에 표시되는 버전 (1.0.0)
# build: 내부 빌드 번호 (1)

주의사항:

  • 매 제출마다 빌드 번호를 증가시켜야 합니다
  • 동일 버전에서 빌드 번호만 올려 재제출 가능합니다

2.5 릴리스 빌드 생성#

어떻게: 릴리스 모드로 macOS 앱을 빌드합니다.

Terminal window
# 릴리스 빌드
flutter build macos --release

2.6 Archive 생성 및 업로드#

어떻게: Xcode에서 Archive를 생성하고 App Store Connect에 업로드합니다.

sequenceDiagram participant D as Developer participant X as Xcode participant A as App Store Connect D->>X: Product → Archive X->>X: 빌드 및 서명 X->>D: Archive 완료 D->>X: Distribute App X->>A: 앱 업로드 A->>A: 자동 검증 A->>D: TestFlight 준비 완료

Xcode 메뉴 경로:

  1. ProductArchive
  2. Archive 완료 후 Distribute App 클릭
  3. App Store Connect 선택
  4. Upload 선택 후 진행

2.7 TestFlight와 출시#

어떻게: App Store Connect에서 TestFlight 테스트 후 정식 출시합니다.

단계설명
TestFlight 내부 테스트팀원 최대 100명, 심사 불필요
TestFlight 외부 테스트최대 10,000명, 베타 심사 필요
정식 출시App Store 심사 (1~3일) 후 출시

3. Linux - Snap Store 배포#

3.1 왜 Snap Store를 사용하는가?#

이유: Snap은 Ubuntu를 포함한 다양한 Linux 배포판에서 동작하는 범용 패키지 형식입니다. 의존성을 자체 포함하여 “한 번 빌드, 어디서든 실행”이 가능합니다.

3.2 빌드 환경 설정#

무엇을: snapcraft와 LXD4를 설치하여 빌드 환경을 구성합니다.

Terminal window
# snapcraft 설치
sudo snap install snapcraft --classic
# LXD 설치 및 초기화
sudo snap install lxd
sudo lxd init

LXD 초기화 시 대부분 기본값을 사용합니다. 처음 실행 시 소켓 연결 오류가 발생하면 현재 사용자를 lxd 그룹에 추가합니다:

Terminal window
sudo usermod -a -G lxd $USER
# 로그아웃 후 다시 로그인

3.3 snapcraft.yaml 작성#

어떻게: 프로젝트 루트에 snap/snapcraft.yaml 파일을 생성합니다.

name: my-flutter-app
version: 1.0.0
summary: My Flutter Desktop App
description: A cross-platform Flutter application.
confinement: strict
base: core22
grade: stable
slots:
dbus-my-flutter-app:
interface: dbus
bus: session
name: com.example.my_flutter_app
apps:
my-flutter-app:
command: my_flutter_app
extensions: [gnome]
plugs:
- network
slots:
- dbus-my-flutter-app
parts:
my-flutter-app:
source: .
plugin: flutter
flutter-target: lib/main.dart

3.4 snapcraft.yaml 구성 요소#

무엇을: 각 섹션의 역할을 이해합니다.

섹션역할주요 옵션
confinement보안 격리 수준strict(권장), classic, devmode
base런타임 기반 이미지core22 (Ubuntu 22.04 기반)
grade배포 채널 결정stable, devel
extensions라이브러리 자동 포함gnome (GTK 라이브러리 포함)
plugs시스템 리소스 접근network, home, audio 등

3.5 데스크톱 파일 설정#

어떻게: snap/gui/ 폴더에 .desktop 파일과 아이콘을 배치합니다.

snap/gui/my-flutter-app.desktop
[Desktop Entry]
Name=My Flutter App
Comment=A cross-platform Flutter application
Exec=my-flutter-app
Icon=${SNAP}/meta/gui/my-flutter-app.png
Terminal=false
Type=Application
Categories=Utility;

주의사항:

  • .desktop 파일명과 아이콘 파일명이 snapcraft.yaml의 앱 이름과 일치해야 합니다
  • 아이콘은 snap/gui/ 폴더에 PNG 형식으로 배치합니다

3.6 Snap 빌드 및 테스트#

어떻게: snapcraft 명령으로 빌드하고 로컬에서 테스트합니다.

Terminal window
# LXD 백엔드로 빌드
snapcraft --use-lxd
# 로컬 설치 테스트
sudo snap install ./my-flutter-app_1.0.0_amd64.snap --dangerous

3.7 Snap Store 배포#

어떻게: Snap Store에 계정을 만들고 앱을 업로드합니다.

Terminal window
# Snap Store 로그인
snapcraft login
# 앱 이름 등록
snapcraft register my-flutter-app
# 업로드 및 릴리스
snapcraft upload --release=stable my-flutter-app_1.0.0_amd64.snap

3.8 Snap Store 채널#

무엇을: 배포 채널별 용도를 이해합니다.

채널용도사용자
edge최신 개발 빌드개발자/테스터
beta베타 테스트얼리어답터
candidate출시 후보QA 팀
stable정식 버전일반 사용자

4. Windows - Microsoft Store 배포#

4.1 왜 Microsoft Store를 사용하는가?#

이유: Microsoft Store는 Windows 사용자에게 신뢰할 수 있는 앱 설치 경험을 제공합니다. 앱 인증 과정을 거쳐 보안이 검증되고, 자동 업데이트가 지원됩니다.

4.2 사전 준비#

무엇을: Microsoft Store 배포를 위한 계정과 도구를 준비합니다.

준비 항목설명
Microsoft Partner Network개발자 계정 등록
Partner Center앱 등록 및 관리
Visual StudioWindows 빌드 환경
msix 패키지MSIX 패키징 도구

4.3 Partner Center 설정#

어떻게: Partner Center에서 앱을 등록하고 필수 정보를 설정합니다.

flowchart LR A[Partner Center 접속] --> B[앱 이름 예약] B --> C[Product Identity 확인] C --> D[가격/가용성 설정] D --> E[연령 등급 설정] E --> F[패키지 업로드 준비]

Product Identity에서 확인할 정보:

  • Package identity name: 패키지 식별자
  • Publisher: 게시자 ID
  • Publisher display name: 표시 이름

4.4 MSIX 패키징 설정#

어떻게: pubspec.yaml에 msix 설정을 추가합니다.

pubspec.yaml
msix_config:
display_name: My Flutter App
publisher_display_name: My Company
identity_name: MyCompany.MyFlutterApp
publisher: CN=YOUR-PUBLISHER-ID
msix_version: 1.0.0.0
logo_path: assets/app_icon.png

주의사항:

  • Microsoft Store 앱은 버전의 마지막 숫자(revision)가 반드시 0이어야 합니다
  • 예: 1.0.0.0 (O), 1.0.0.1 (X)

4.5 msix 패키지 설치#

어떻게: msix 패키지를 프로젝트에 추가합니다.

Terminal window
flutter pub add msix --dev

4.6 MSIX 빌드#

어떻게: msix 도구로 Windows 패키지를 생성합니다.

Terminal window
# 릴리스 빌드 생성
flutter build windows --release
# MSIX 패키지 생성
dart run msix:create

4.7 앱 아이콘 설정#

무엇을: Windows 앱 아이콘을 설정합니다.

파일위치형식
앱 아이콘windows/runner/resources/app_icon.icoICO
스토어 로고Partner Center 업로드300x300 PNG

아이콘 이름 변경 시 windows/runner/Runner.rc 파일의 IDI_APP_ICON 값을 수정합니다.

4.8 앱 검증#

어떻게: Windows App Certification Kit5으로 패키지를 검증합니다.

  1. Windows SDK에 포함된 Windows App Cert Kit 실행
  2. Flutter Windows 패키지(.msix) 선택
  3. 테스트 보고서 확인

4.9 Partner Center 제출#

어떻게: Partner Center에서 패키지를 업로드하고 제출합니다.

단계설명
패키지 업로드MSIX 파일 업로드
스토어 목록 작성설명, 스크린샷, 카테고리
가격 설정무료/유료, 지역별 가격
제출자동 검증 후 수동 심사

5. GitHub Actions CI/CD (Windows)#

5.1 왜 CI/CD를 사용하는가?#

이유: 수동 빌드와 업로드는 시간이 많이 들고 오류 가능성이 있습니다. GitHub Actions를 통해 빌드, 패키징, 배포를 자동화할 수 있습니다.

5.2 GitHub Actions 워크플로우#

어떻게: Microsoft Store CLI를 사용하여 자동 배포합니다.

.github/workflows/windows-store.yml
name: Windows Store Deploy
on:
push:
tags:
- "v*"
jobs:
deploy:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
flutter-version: "3.24.0"
channel: "stable"
- uses: microsoft/setup-msstore-cli@v1
- name: Configure Microsoft Store CLI
run: |
msstore reconfigure --tenantId ${{ secrets.AZURE_AD_TENANT_ID }} \
--clientId ${{ secrets.AZURE_AD_CLIENT_ID }} \
--clientSecret ${{ secrets.AZURE_AD_CLIENT_SECRET }} \
--sellerId ${{ secrets.SELLER_ID }}
- name: Install dependencies
run: flutter pub get
- name: Create MSIX package
run: msstore package .
- name: Publish to Microsoft Store
run: msstore publish -v

5.3 필요한 시크릿#

무엇을: GitHub Repository Secrets에 등록할 값들입니다.

시크릿설명확인 위치
AZURE_AD_TENANT_IDAzure AD 테넌트 IDAzure Portal
AZURE_AD_CLIENT_ID앱 클라이언트 IDAzure Portal
AZURE_AD_CLIENT_SECRET클라이언트 비밀Azure Portal
SELLER_ID판매자 IDPartner Center → Account Settings

6. Web - Flutter 웹 배포#

6.1 왜 웹 배포가 중요한가?#

이유: 웹은 설치 없이 URL만으로 접근 가능한 유일한 플랫폼입니다. 사용자 획득 비용이 낮고, 검색 엔진을 통한 유입이 가능합니다.

6.2 웹 빌드 생성#

어떻게: flutter build web 명령으로 릴리스 빌드를 생성합니다.

Terminal window
# 릴리스 빌드
flutter build web --release
# 빌드 결과물 위치
ls build/web/

6.3 빌드 모드와 렌더러#

무엇을: Flutter 웹의 빌드 모드와 렌더러6 옵션을 이해합니다.

빌드 모드코드 최소화Tree Shaking7
debugXX
profileXO
releaseOO
렌더러특징적합한 경우
canvaskit고품질 렌더링, 큰 용량그래픽 집약적 앱
skwasmWebAssembly 기반, 빠른 성능성능 중시 앱
Terminal window
# 렌더러 지정 빌드
flutter build web --release --web-renderer canvaskit
flutter build web --release --web-renderer skwasm

6.4 로컬 테스트#

어떻게: 빌드 결과물을 로컬 서버에서 테스트합니다.

Terminal window
# Python 간이 서버로 테스트
cd build/web
python -m http.server 8000
# 브라우저에서 http://localhost:8000 접속

6.5 Firebase Hosting 배포#

어떻게: Firebase CLI로 Flutter 웹 앱을 배포합니다.

Terminal window
# Firebase CLI 설치
npm install -g firebase-tools
# Firebase 로그인
firebase login
# 웹 프레임워크 기능 활성화
firebase experiments:enable webframeworks
# Firebase 프로젝트 초기화
firebase init hosting
# 질문에 "yes" 선택, Flutter Web 선택
# 배포
firebase deploy

6.6 Firebase Hosting 설정 흐름#

sequenceDiagram participant D as Developer participant F as Firebase CLI participant H as Firebase Hosting D->>F: firebase init hosting F->>D: 웹 프레임워크 사용? (yes) D->>F: Flutter Web 선택 F->>D: 호스팅 디렉토리 선택 D->>F: firebase deploy F->>F: flutter build web --release F->>H: 빌드 결과물 업로드 H->>D: 배포 URL 제공

장점: firebase deploy 명령이 자동으로 flutter build web --release를 실행합니다.

6.7 기타 호스팅 옵션#

무엇을: Firebase 외의 배포 옵션을 알아봅니다.

서비스특징비용
Firebase HostingGoogle 인프라, 빠른 CDN무료~유료
GitHub PagesGitHub 연동, 정적 호스팅무료
Google Cloud확장성, 커스텀 도메인종량제
Vercel자동 배포, 프리뷰 URL무료~유료
NetlifyGit 연동, 폼 처리무료~유료

7. 웹 이미지 처리#

7.1 왜 웹에서 이미지 처리가 다른가?#

이유: 웹 브라우저는 보안상 이유로 임의 코드 실행을 제한합니다. 이로 인해 이미지 처리 방식이 모바일/데스크톱과 다릅니다.

7.2 CORS 이슈#

무엇을: 외부 이미지 로드 시 CORS8 문제가 발생할 수 있습니다.

// 웹에서 외부 이미지 사용 시
Image.network(
'https://example.com/image.png',
// CORS 설정이 안 된 서버의 이미지는 로드 실패
)

해결책:

  • 이미지 서버에서 CORS 헤더 설정
  • 프록시 서버 사용
  • 앱 내 assets로 포함

8. 배포 자동화 도구#

8.1 Codemagic CI/CD#

무엇을: Codemagic은 Flutter 전용 CI/CD 서비스로, 모든 플랫폼 빌드를 지원합니다.

codemagic.yaml
workflows:
desktop-workflow:
name: Desktop Build
max_build_duration: 60
environment:
flutter: stable
scripts:
- name: Build macOS
script: flutter build macos --release
- name: Build Windows
script: flutter build windows --release
- name: Build Linux
script: flutter build linux --release
artifacts:
- build/macos/Build/Products/Release/*.app
- build/windows/runner/Release/*.exe
- build/linux/x64/release/bundle/*

8.2 fastforge (Linux)#

무엇을: Linux용 다양한 패키지 형식을 지원하는 배포 도구입니다.

지원 형식:

  • AppImage
  • deb (Debian/Ubuntu)
  • rpm (Fedora/RHEL)
  • pacman (Arch)

9. 플랫폼별 배포 체크리스트#

9.1 macOS 체크리스트#

  • Apple Developer Program 등록
  • Bundle ID 생성
  • 앱 카테고리 설정
  • 코드 서명 인증서 설정
  • TestFlight 테스트 완료
  • 스토어 설명 및 스크린샷 준비

9.2 Linux 체크리스트#

  • snapcraft.yaml 작성
  • .desktop 파일 생성
  • 앱 아이콘 준비
  • 로컬 snap 테스트
  • Snap Store 계정 생성
  • 앱 이름 등록

9.3 Windows 체크리스트#

  • Partner Center 계정 생성
  • 앱 이름 예약
  • msix_config 설정
  • 앱 아이콘 준비 (ICO)
  • Windows App Cert Kit 테스트
  • 스토어 목록 작성

9.4 Web 체크리스트#

  • 릴리스 빌드 테스트
  • 렌더러 선택 (canvaskit/skwasm)
  • Firebase 프로젝트 생성
  • 커스텀 도메인 설정 (선택)
  • HTTPS 인증서 확인

참고 자료#

Footnotes#

  1. snapcraft(스냅크래프트): Linux용 애플리케이션 패키징 도구로, snap 형식의 자체 포함 패키지를 생성한다.

  2. MSIX: Microsoft의 Windows 앱 패키징 형식으로, 앱 설치/제거/업데이트를 깔끔하게 관리한다.

  3. Bundle ID(번들 ID): 앱을 고유하게 식별하는 문자열로, 역도메인 형식(com.company.app)을 사용한다.

  4. LXD(Linux 컨테이너 데몬): Linux 컨테이너를 관리하는 도구로, snapcraft 빌드 시 격리된 환경을 제공한다.

  5. Windows App Certification Kit(Windows 앱 인증 키트): Microsoft에서 제공하는 앱 검증 도구로, Store 제출 전 앱의 호환성과 보안을 테스트한다.

  6. renderer(렌더러): 웹에서 Flutter UI를 화면에 그리는 엔진으로, CanvasKit과 Skwasm 두 가지 옵션이 있다.

  7. Tree Shaking(트리 쉐이킹): 사용하지 않는 코드를 빌드에서 제거하여 앱 크기를 줄이는 최적화 기법이다.

  8. CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유): 웹 브라우저의 보안 정책으로, 다른 도메인의 리소스 요청을 제한한다.

공유

이 글이 도움이 되었다면 다른 사람과 공유해주세요!

Flutter 튜토리얼 64편: 데스크톱과 웹 배포
https://moodturnpost.net/posts/flutter/flutter-deployment-desktop-web/
작성자
Moodturn
게시일
2026-01-08
Moodturn

목차