본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

Flutter 문서
Flutter
Flutter 시작하기프로젝트 구조핵심 개념데이터와 상태테스트빌드와 배포
토론

Flutter 안내서 · 2/6

프로젝트 구조

flutter create로 만든 프로젝트에는 Dart 코드, 패키지 설정, 플랫폼별 폴더가 함께 들어 있습니다. 이 장에서는 각 파일과 폴더가 어떤 역할을 하는지, 그리고 의존성과 에셋을 어떻게 관리하는지 살펴봅니다.

전체 모습

hello_app/
├── lib/
│   └── main.dart          # 앱 진입점
├── test/
│   └── widget_test.dart   # 기본 위젯 테스트
├── android/               # Android 프로젝트(Gradle)
├── ios/                   # iOS 프로젝트(Xcode)
├── web/                   # index.html, 아이콘, manifest
├── windows/               # Windows 데스크톱(CMake)
├── macos/                 # macOS 데스크톱(Xcode)
├── linux/                 # Linux 데스크톱(CMake)
├── pubspec.yaml           # 패키지 설정
├── pubspec.lock           # 확정된 의존성 버전
└── analysis_options.yaml  # 정적 분석(린트) 규칙

build/와 .dart_tool/은 빌드할 때 자동으로 생기는 폴더이므로 버전 관리에 넣지 않습니다. 새 프로젝트의 .gitignore에 이미 들어 있습니다.

lib: 앱 코드

앱의 Dart 코드는 모두 lib 아래에 둡니다. 처음에는 main.dart 하나뿐이지만, 앱이 커지면 화면, 위젯, 데이터 계층별로 폴더를 나눕니다. Flutter가 강제하는 구조는 없으며, 흔히 쓰는 방식은 다음과 같습니다.

lib/
├── main.dart
├── app.dart              # MaterialApp, 테마, 라우팅
├── screens/              # 화면 단위 위젯
│   ├── home_screen.dart
│   └── detail_screen.dart
├── widgets/              # 여러 화면에서 쓰는 위젯
├── models/               # 데이터 클래스
└── services/             # API 호출, 저장소

다른 파일을 불러올 때는 패키지 경로를 씁니다. pubspec.yaml의 name이 hello_app이라면 다음과 같습니다.

import 'package:flutter/material.dart';
import 'package:hello_app/screens/home_screen.dart';
import 'package:hello_app/models/todo.dart';

파일 이름은 home_screen.dart처럼 소문자와 밑줄(snake_case)을, 클래스 이름은 HomeScreen처럼 대문자로 시작하는 이름(UpperCamelCase)을 쓰는 것이 Dart의 관례입니다.

pubspec.yaml: 패키지 설정

pubspec.yaml은 앱의 이름, 버전, Dart SDK 범위, 의존성, 에셋을 적는 설정 파일입니다.

name: hello_app
description: "A new Flutter project."
publish_to: 'none'
version: 1.0.0+1

environment:
  sdk: ^3.5.0

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.8
  http: ^1.2.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^5.0.0

flutter:
  uses-material-design: true
  assets:
    - assets/images/
    # 데이터 파일은 하나씩 적을 수도 있습니다
    - assets/data/config.json

위 버전 숫자는 예시이며, 실제 값은 flutter create와 flutter pub add가 그때의 최신 버전으로 채웁니다. version: 1.0.0+1에서 + 앞은 사용자에게 보이는 버전 이름, 뒤는 스토어가 구분하는 빌드 번호입니다.

패키지는 pub.dev에서 찾아 명령으로 추가합니다.

# 의존성 추가(pubspec.yaml 이 자동으로 수정됨)
flutter pub add http

# 개발용 의존성 추가
flutter pub add --dev mocktail

# pubspec.yaml 을 직접 고친 뒤 내려받기
flutter pub get

# 새 버전이 있는 패키지 확인
flutter pub outdated

pubspec.lock은 실제로 내려받은 버전을 기록합니다. 앱 프로젝트에서는 이 파일을 커밋해 모든 개발자와 빌드 서버가 같은 버전을 쓰게 합니다.

에셋: 이미지, 글꼴, 데이터 파일

앱에 포함할 파일은 pubspec.yaml의 flutter: assets:에 등록해야 빌드에 들어갑니다. 폴더 이름 끝에 /를 붙이면 그 폴더의 파일 전체가 포함됩니다(하위 폴더는 따로 적어야 합니다).

import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle;

// 이미지 에셋 표시
Image.asset('assets/images/logo.png', width: 120);

// 텍스트·JSON 에셋 읽기
Future<Map<String, dynamic>> loadConfig() async {
  final text = await rootBundle.loadString('assets/data/config.json');
  return jsonDecode(text) as Map<String, dynamic>;
}

글꼴은 flutter: fonts: 항목에 family와 파일 경로를 적어 등록하고, TextStyle(fontFamily: '이름')으로 씁니다.

플랫폼 폴더

android, ios, web, windows, macos, linux 폴더는 각 플랫폼의 실제 네이티브 프로젝트입니다. 평소에는 건드릴 일이 적지만 다음 경우에는 직접 수정합니다.

  • 앱 이름, 아이콘, 권한: Android는 android/app/src/main/AndroidManifest.xml, iOS는 ios/Runner/Info.plist
  • Android 패키지 이름(applicationId), 최소 SDK, 서명 설정: android/app/build.gradle.kts(이전 프로젝트는 build.gradle)
  • iOS 번들 식별자와 서명: Xcode에서 ios/Runner.xcworkspace를 열어 설정
  • 웹 페이지 제목과 PWA 정보: web/index.html, web/manifest.json

나중에 플랫폼을 추가하려면 프로젝트 폴더에서 flutter create --platforms=web,windows .를 실행합니다.

analysis_options.yaml

이 파일은 flutter_lints 패키지의 권장 규칙을 불러옵니다. flutter analyze를 실행하면 규칙 위반과 잠재적 오류를 보여 주며, 편집기도 같은 결과를 실시간으로 표시합니다. dart format .으로 코드 서식을 맞출 수 있습니다.

정리

  • Dart 코드는 lib, 테스트는 test, 플랫폼별 네이티브 프로젝트는 각 플랫폼 폴더에 있습니다.
  • pubspec.yaml에 의존성, 버전, 에셋, 글꼴을 적고 flutter pub add로 패키지를 추가합니다.
  • 에셋은 pubspec.yaml에 등록해야 앱에 포함됩니다.
  • 권한, 아이콘, 서명 같은 플랫폼 설정은 해당 플랫폼 폴더에서 수정합니다.
이 장에 대해 질문이 있나요?
이전 장Flutter 시작하기다음 장핵심 개념

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.