2026. 4. 13. 07:07ㆍAI Product Building/Lotto App

안녕하세요! '로또 사고 싶은날(구 MyFeelLotto)' 개발기의 두 번째 시간입니다. 지난 1회차에서는 수많은 로또 앱 사이에서 차별화를 두기 위한 방향성과 핵심 기능, 그리고 왜 크로스 플랫폼 프레임워크인 플러터(Flutter)를 선택했는지에 대해 이야기 나누었습니다. 기획이 끝났다면 이제 본격적으로 코드를 작성할 수 있는 '놀이터'를 만들어주어야겠죠? 소프트웨어 개발에 있어서 환경 구축은 종종 실제 코딩보다 진입 장벽이 높게 느껴지기도 하는 부분입니다. 그래서 이번 2회차 포스팅에서는 제가 실제로 '로또 사고 싶은날' 앱을 만들기 위해 Windows 운영체제 환경에서 어떻게 안드로이드 스튜디오(Android Studio)와 플러터 개발 환경을 구축했는지, 그리고 프로젝트를 초기화하여 필수 기능 구현을 위한 라이브러리(Dependencies)들을 어떻게 세팅했는지 매우 구체적이고 상세하게 기록해 보고자 합니다.
👉 '로또 사고 싶은날' 구글스토어 다운로드 바로가기 👈
1. 왜 안드로이드 스튜디오와 Flutter의 조합이었을까? - 개발 도구의 선택과 설치 과정
개인 개발자로서 아이디어를 빠르게 시장에 선보이기(MVP 개발) 위해서는 코드 통합과 테스트, 그리고 에뮬레이터 구동 방식이 매우 매끄러워야 합니다. 비록 가벼운 텍스트 에디터인 VS Code(Visual Studio Code)를 선호하시는 분들도 많지만, 저는 초기 설정의 이점과 강력한 안드로이드 네이티브 에뮬레이터의 통합, 그리고 각종 강력한 디버깅 도구의 안정성 덕분에 안드로이드 스튜디오(Android Studio)를 메인 통합 개발 환경(IDE)으로 결정했습니다. 플러터 앱을 빌드하다 보면 결국 네이티브단(특히 안드로이드의 build.gradle이나 매니페스트 파일)을 건드려야 할 순간이 오기 때문에 안드로이드 스튜디오의 지원이 절대적으로 필요합니다.
Windows 환경에서 플러터를 설치하는 과정은 크게 네 단계로 진행되었습니다. 첫 번째는 구글 플러터 공식 홈페이지에서 Windows용 SDK 압축 파일을 다운로드하여 `C:\src\flutter` 와 같이 경로에 공백이나 특수 문자가 없는 안전한 곳에 압축을 해제하는 것입니다. 두 번째는 Windows 시스템 '환경 변수(Environment Variables)' 설정 창을 열어 `Path` 변수에 `\flutter\bin` 경로를 추가해 주는 작업이었습니다. 이 과정을 거쳐야만 명령 프롬프트(cmd)나 파워쉘 어디서든 `flutter` 명령어를 시스템이 인식할 수 있게 됩니다. 세 번째로는 안드로이드 스튜디오를 설치하고 초기 마법사를 통해 안드로이드 SDK, Command-line Tools, 그리고 Android Emulator를 함께 설치했습니다. 마지막으로 안드로이드 스튜디오의 플러그인 환경 설정에서 'Flutter' 와 'Dart' 플러그인을 설치해 주면 IDE 환경 구축이 마무리됩니다.
설치가 완료된 후에는 터미널에서 항상 flutter doctor 명령어를 실행하여 현재 제 PC 환경에 부족한 요소가 없는지 건강 검진을 해야 합니다. 초기에 안드로이드 라이선스 동의 문제가 떴으나 flutter doctor --android-licenses 명령으로 가볍게 해결하며 올패스(All Green)를 확인했을 때의 그 짜릿한 안도감은 개발을 시작하는 큰 동력이 되었습니다.
2. 새로운 프로젝트 생성과 패키지 네이밍의 중요성 - 단추를 처음부터 잘 꿰어야 하는 이유
환경 설정이 끝난 후, 터미널(또는 안드로이드 스튜디오의 New Flutter Project 메뉴)을 통해 대망의 첫 앱 프로젝트를 생성했습니다. 터미널 기반으로는 flutter create --org com.myfeel my_feel_lotto 라는 명령어를 사용하게 됩니다. 여기서 --org com.myfeel 부분이 정말 중요합니다. 이것이 앱 이름인 my_feel_lotto와 결합되어 안드로이드에서는 **패키지명(Package Name)**으로, iOS에서는 **번들 식별자(Bundle Identifier)**로 사용되는 com.myfeel.my_feel_lotto 라는 고유한 식별자를 만들어내기 때문입니다.
이 식별자(Application ID)는 구글 플레이 콘솔이나 애플 앱스토어 커넥트에 앱을 한 번 등록하고 나면, 앱을 마켓에서 완전히 삭제했다가 새로 올리지 않는 한 **절대 변경할 수 없는 주민등록번호 같은 역할**을 합니다. 만약 이 부분을 소홀히 하여 com.example.app 같은 기본값으로 프로젝트를 생성해 버렸다면, 나중에 정말 고통스러운 폴더 및 파일명 수정 과정을 겪어야 합니다. ('로또 사고 싶은날' 역시 초기엔 이 식별자 때문에 소스 코드 깊은 곳까지 일일이 수작업으로 변경하는 번거로움을 겪었던 기억이 있어 여러분께 강력히 주의를 당부드립니다).
프로젝트 생성 버튼을 누르고 나면, Flutter 툴이 자동으로 안드로이드, iOS, 웹, 데스크톱 등 지정한 플랫폼별 네이티브 뼈대 폴더와 함께 메인 코드가 작성될 lib 폴더의 main.dart 파일을 생성해주게 됩니다. 이렇게 든든하게 기초 공사가 끝난 폴더 구조를 보면 나만의 앱이 구체적인 형상으로 태어났음을 실감하게 됩니다.
3. 앱의 뼈대를 이루는 필수 라이브러리 추가하기 (pubspec.yaml 설정)
건축에도 기초 자재가 필요하듯, 플러터에서는 pubspec.yaml 파일에 필요한 플러그인(패키지)들을 추가하는 것으로 본격적인 개발이 시작됩니다. '로또 사고 싶은날'은 오프라인 환경 우선, 빠른 QR 스캔, 화려한 UI가 특징인 만큼, 기획 단계에서 확정된 기능들을 구현하기 위해 수려하고 안정적인 패키지들을 신중하게 선별하여 추가했습니다.
가장 먼저 상태 관리를 위한 패키지로 provider(또는 최신 트렌드를 반영한 riverpod)를 추가했습니다. 앱 내에서 QR 코드를 스캔한 후 갱신되는 과거 내역과 로또 당첨 데이터의 위젯 트리를 깔끔하게 관리하기 위해서는 필수적입니다. 또한, 별도의 백엔드 없이도 가장 빠르고 강력한 로컬 데이터베이스를 구축하기 위해 hive 와 hive_flutter 패키지를 가져왔습니다. 오픈 API와의 HTTP 통신을 통한 당첨 번호 파싱을 위해 http를, 매 정해진 추첨 시간에 맞추어 사용자에게 로컬 알림을 띄우기 위해 flutter_local_notifications 플러그인을 도입했습니다.
가장 핵심적인 QR 스캐너의 경우, 단순한 카메라 플러그인이 아닌 구글 ML Kit 바코드 스캐닝 엔진을 활용하는 네이티브 기반 스캐너 모듈을 쓰기로 결정했습니다. 뿐만 아니라 수익 창출을 위한 구글 애드몹 광고를 위해 google_mobile_ads 라이브러리 설정도 빼놓을 수 없죠. 다음은 '로또 사고 싶은날' 프로젝트에 실제로 추가되었던 핵심 라이브러리 목록을 간추린 pubspec.yaml 내용의 일부입니다.
name: my_feel_lotto
description: "오늘은 왠지 로또 사고 싶은날! 당신의 직관적인 로또 당첨 매니저."
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: ">=3.0.0 <4.0.0"
dependencies:
flutter:
sdk: flutter
# 앱의 디자인 아이콘 및 UI 요소
cupertino_icons: ^1.0.6
# [상태 관리] 위젯 간의 데이터와 상태를 매끄럽게 연동
provider: ^6.1.1
# [네트워크] 동행복권 API 통신용
http: ^1.1.0
# [로컬 데이터베이스] 스캔 내역의 압도적으로 빠른 저장 및 불러오기
hive: ^2.2.3
hive_flutter: ^1.1.0
shared_preferences: ^2.2.2
# [카메라 & QR 스캐닝] 빠르고 오작동 없는 ML 기반 스캐너
mobile_scanner: ^3.5.2
# [로컬 알림] 토요일 밤 추첨 완료 안내 푸시 서버 없이 자체 구현
flutter_local_notifications: ^17.0.0
# [수익화] 구글 애드몹 배너 및 전면 광고 연동
google_mobile_ads: ^3.1.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
# Hive 데이터베이스 코드를 자동으로 생성해주는 빌드 러너
build_runner: ^2.4.6
hive_generator: ^2.0.1
flutter:
uses-material-design: true
assets:
- assets/images/
- assets/animations/
4. 안드로이드 네이티브 빌드 환경 다듬기 - 권한 설정과 minSdkVersion의 함정
플러터의 크로스 플랫폼 매력을 온전히 즐기기 전에, 양쪽 네이티브 환경(안드로이드, iOS)에 꼭 해주어야 하는 환경 설정이 있습니다. 특히 모바일 앱의 툴체인들은 버전 업데이트가 잦아서, 이런 기본 뼈대 설정을 확실히 하지 않으면 차후 릴리즈 빌드나 디버깅 도중 알 수 없는 에러에 휩싸이게 됩니다.
가장 먼저 안드로이드의 경우 android/app/build.gradle 파일을 열어 minSdkVersion을 21(또는 라이브러리 요구사항에 따라 24)로 상향 조정해주어야 합니다. 방금 우리가 pubspec.yaml에 추가했던 google_mobile_ads나 mobile_scanner 같은 최신 라이브러리들은 구버전 안드로이드 체제에서는 돌아가지 않기 때문입니다. 이 버전을 올리지 않으면 앱 빌드 자체가 실패하게 됩니다. 안드로이드 구동 기기 타겟층을 무조건 넓히기 위해 낮게 설정하려는 유혹도 있지만, 앱의 퀄리티(퍼포먼스와 현대적인 API 사용)를 위해 과감하게 오래전 기기들의 지원은 포기하는 판단도 필요합니다.
두 번째로 제일 중요한 작업은 앱 권한(Permissions) 선언입니다. '로또 사고 싶은날' 앱은 기능 특성상 두 가지 권한을 필수적으로 요구합니다. 바로 '카메라 접근 권한(QR 코드 스캔 시 필수)'과 '알림 권한(안드로이드 13 이상에서 추첨 알림 발송 시 필수)'입니다. 안드로이드의 경우 AndroidManifest.xml 파일에 관련된 퍼미션 코드를 정의해 주었고, iOS의 경우에는 Info.plist 파일 내부에 카메라 사용 시 유저에게 표시해야 할 사유 문자열을 엄격하게 기록해 두었습니다. 이렇게 권한을 철저히 정의해 놓지 않으면 앱 스토어 심사 단계를 넘어갈 수조차 없습니다.
자, 이제 터미널 창에 flutter pub get을 입력하여 우리가 정의한 모든 부품들을 내려받았습니다. 에뮬레이터를 띄워 비어있는 하얀 화면 위에 작은 "Hello Lotto!" 앱이 구동되는 걸 처음 확인했을 때의 그 뿌듯함! 다음 3회차 포스팅에서는 이 빈 도화지에 실제 앱 아키텍처 폴더 구조(MVVM / Repository 패턴)를 어떻게 유지보수하기 쉽게 분할하고 설계했는지, 그 과정의 노하우를 깊이 있게 파헤쳐 보겠습니다. 저의 이 상세한 기록이 혼자 앱 개발을 시작하시는 분들께 든든한 가이드라인이 되길 바랍니다.
💡 환경 세팅을 넘어, 이렇게 탄생한 완성된 로또 앱을 직접 경험해 보세요!
👉 [로또 사고 싶은날 - 구글 플레이 스토어에서 확인하기]
```
'AI Product Building > Lotto App' 카테고리의 다른 글
| '로또 사고 싶은날' 개발기 6편: 앱의 생명! 초고속 QR 코드 스캐너 기능 구현 (CameraX & ML Kit) (1) | 2026.04.17 |
|---|---|
| '로또 사고 싶은날' 개발기 5편: 동행복권 오픈 API 연동을 통한 실시간 당첨 결과 파싱하기 (0) | 2026.04.16 |
| '로또 사고 싶은날' 개발기 4편: 시선을 사로잡는 메인 화면 UI 및 로또 공 컴포넌트 디자인 (1) | 2026.04.15 |
| '로또 사고 싶은날' 개발기 3편: 유지보수를 고려한 앱 아키텍처 및 폴더 구조 설계 (0) | 2026.04.14 |
| '로또 사고 싶은날' 개발기 1편: 왜 로또 앱이었나? 기획 및 방향성 설정 (0) | 2026.04.13 |