https://www.youtube.com/watch?v=0LxUf3MKxIs
1. 이건 꼭 알아야 한다[^1]
[? 질문] Cursor(커서)와 Flutter를 이용해 “코딩을 최소화”하면서 AI 채팅 앱을 실제로 만들 수 있는가[^2]
[= 답] 커서에서 프롬프트로 MVVM 구조/파일 생성 → 채팅 UI 구현 → Gemini API 연동 → 프롬프트로 캐릭터 부여 순서로 진행하면, 개발자가 아니어도 “내 채팅GPT 같은 앱”을 30~40분 내에 형태까지 만들 수 있다고 안내한다.[^3]
[? 질문] 왜 OpenAI(ChatGPT) 대신 Google Gemini API를 쓰는가[^4]
[= 답] Gemini는 사용이 비교적 간편하고, 무엇보다 “현재 시점에 무료 사용량이 꽤 많아” 비용 부담 없이 실습하기 좋기 때문이다.[^5]
[? 질문] Gemini API 키를 앱에 넣을 때 무엇을 주의해야 하는가[^6]
[= 답] API 키는 타인에게 노출되면 무단 사용으로 요금/오남용 문제가 생길 수 있으므로 공개 저장을 피하고, 가능하면 .env 같은 방식으로 분리해 관리하라고 강조한다.[^7]
2. 큰 그림[^2]
이 콘텐츠는 Cursor를 “코드 자동 생성/수정 도구”로 활용해 Flutter 기반의 AI 채팅 앱을 만들고, Google Gemini API로 실제 대화까지 연결하는 전체 과정을 따라가는 실습형 튜토리얼이다.[^8] 단순 채팅 UI를 넘어, 프롬프트를 조정해 역할극/캐릭터형 AI로 만드는 방법을 보여준다.[^9]
- Cursor 프롬프트 기반 개발: 폴더 구조(MVVM) 생성부터 기능 추가(상태관리/버블 표시), UI 개선까지 “프롬프트로 지시→AI가 수정→사람이 필요한 부분만 수동 반영” 흐름으로 진행한다.[^10]
- Flutter 채팅 UI + iOS 감성(Cupertino/Swift 스타일): 초기 단순 디자인을 만든 뒤, 애플 디자인 철학을 참고해 더 직관적이고 깔끔한 채팅 화면으로 다듬는다.[^11]
- Gemini API 연동과 보안 감각: API를 “웨이터(중개자)”에 비유해 쉽게 설명하고, 키 발급/문서 복사/패키지 설치/서비스 코드 작성까지 실습한 뒤, 키를 하드코딩하지 않도록
.env관리도 시도한다.[^12]
3. 하나씩 살펴보기[^1]
3.1 오늘 만들 앱의 컨셉: “나만의 채팅GPT + 역할(캐릭터) 부여”[^2]
강의자는 오늘 Cursor와 Flutter로 Gemini API 기반 AI 채팅 앱을 만들 것이라고 소개한다.[^2] 여기서 목표는 “그냥 단순 채팅 앱”이 아니라, 예시 영상처럼 특정 사고방식/대사 스타일로 말하는 AI, 즉 롤플레잉 또는 역할을 부여한 AI와 대화하는 형태다.[^3]
- 강의자는 이를 “원형적 사고로 대사하게 만든 AI” 같은 표현으로 설명하며, 결국은 “여러분만의 뭔가 캐릭터를 정해주고 대화할 수 있는 앱”이라고 말한다.[^3]
- 간단히 말하면 “나만의 ChatGPT를 하나 만든다”는 느낌으로 이해하면 된다고 정리한다.[^3]
또한 OpenAI(ChatGPT) 대신 Google Gemini를 쓰는 이유를 명확히 한다.[^5]
- Gemini가 사용하기도 비교적 편하고,[^5]
- 무엇보다 “현재 무료로 사용할 수 있다”는 점을 강점으로 든다.[^5]
- 일반적으로 API는 일정 비용이 드는 경우가 많은데, Gemini는 “꽤 많은 양의 무료 제공량”이 있어 실습에 유리하다고 한다.[^5]
3.2 전체 진행 로드맵: 5단계로 끝낸다[^8]
강의자는 앞으로의 작업을 다섯 가지 단계로 나눠 제시한다.[^8]
- Flutter 프로젝트 준비[^8]
- 기본 채팅 UI 디자인(애플 Cupertino 스타일 활용 예정)[^8]
- Google Gemini API 가입 및 키 발급[^8]
- 발급받은 키로 실제 대화 호출 함수 구현[^8]
- AI 프롬프트 수정으로 캐릭터/맞춤형 AI 앱으로 확장[^8]
이 5단계가 이후 영상의 흐름(프로젝트 생성 → UI → API 키 → 호출 → 프롬프트 캐릭터화)을 그대로 구성한다.[^8]
3.3 개발 환경 사전 준비: 설치를 건너뛰지 말 것[^13]
본격 시작 전에 강의자는 “개발 환경 설정”을 먼저 하라고 강조한다.[^13]
- Flutter 앱 개발에 필요한 프로그램으로 Android Studio와 (맥 iOS 개발 관련 도구로 언급되는) Xcode를 설치해야 한다고 말한다.[^13]
- 또한 Flutter SDK 설치도 필요하다고 안내한다.[^13]
다만 설치 과정을 강의에서 자세히 다루면 복잡해지고 길어지므로, 커뮤니티 자료에 간단 안내가 있지만 블로그/유튜브를 보며 차분히 따라 하는 것을 권장한다.[^14]
그리고 “처음부터 세팅을 잘 해놔야 나중에 오류가 안 생긴다”며, 필요한 경우 강의를 잠깐 멈추고 설치부터 끝내라고 한다.[^14]
3.4 Cursor에서 Flutter 프로젝트 생성: 폴더 이름은 소문자 권장[^15]
세팅이 됐다는 가정 하에, Cursor에서 프로젝트를 만드는 흐름을 보여준다.[^15]
- Cursor를 켠 뒤 Open Folder로 원하는 위치에 폴더를 만든다.[^15]
- 폴더 생성 시 “소문자로만 폴더를 생성”하라고 주의한다.[^15]
- 예시로 “AI2” 같은 폴더를 만들어 연다.[^16]
그 다음 터미널을 연다.[^17]
- 단축키(백틱/컨트롤+백틱)로 열거나,[^17]
- 안 되면 UI에서 우클릭 후 “Run Terminal Command” 등으로 터미널을 띄우는 방법도 언급한다.[^17]
터미널에서 Flutter 프로젝트를 만든다.[^18]
flutter create .를 입력하면 폴더에 Flutter 프로젝트가 생성된다.[^18]- 생성 후 iOS/Android 외에도 Linux/macOS/web/windows 등이 보이는데, 강의자는 지금은 필요 없어서 “복잡하니까 지우겠다”는 취지로 정리한다.[^19]
- 다만 실제로는 작업 중 android, ios 폴더는 가끔 들어갈 일이 있어 유지한다고 설명한다.[^20]
[!NOTE] 작업 중심 폴더
강의자는 주로 작업할 곳이lib폴더라고 짚는다.[^20]android/ios는 가끔만 들어간다고 한다.[^20]
3.5 MVVM 패턴으로 구조 만들기: Cursor 프롬프트로 폴더/파일 자동 생성[^21]
강의자는 프로젝트를 MVVM 패턴으로 작업할 것이고, Cursor에게 명령할 때도 그런 방식으로 진행하겠다고 한다.[^21]
이 시점부터 Cursor의 핵심 사용법은 “프롬프트로 코드베이스를 태그하고, 원하는 패턴/폴더/파일을 만들어 달라고 지시”하는 것이다.[^22]
그가 사용한 프롬프트의 핵심 요소는 다음 취지다.[^22]
- 코드베이스(또는 특정 폴더)를 태그하고
- “MVVM 디자인 패턴을 사용해서 프로젝트를 만들 것”
- “필요한 폴더와 파일 생성”
- “아래 지시를 따라라”
- 그리고 지금은 “기능 구현이 아니라 디자인 작업만” 할 것이므로 그 점을 포함하라고 한다.[^22]
커서 호출은 단축키로 진행한다.[^23]
- 맥은
Command + I, 윈도우는Control + I로 Cursor의 AI 편집/명령을 연다고 설명한다.[^23]
실행 결과, Cursor가 MVVM 폴더 구조(예: View / ViewModel / Service 등)를 만들었다고 보여준다.[^24]
또 main.dart에 넣으라고 제안한 부분이 있는데, 강의자는 “이건 직접 변경할게요. 가끔 직접 변경해야 되는 것도 있다”고 말한다.[^25]
- 즉, Cursor가 만들어준 결과를 그대로 믿기보다, 사람이 검토하고 필요한 부분을 손보는 흐름을 강조한다.[^25]
3.6 iOS 빌드 준비: CocoaPods 초기화(Podfile)와 설치(pod install)[^26]
iOS 기준 작업을 하려면 iOS 폴더에서 CocoaPods 설정이 필요하다고 진행한다.[^26]
- 터미널에서
cd ios로 iOS 폴더로 이동한다.[^26] pod init을 실행해 Podfile을 만든다.[^27]- 강의자는 Podfile을 “필요한 파일/의존성을 적어놓고 설치하는 것”이라고 쉽게 설명한다.[^27]
- Podfile을 수정해야 하는데, 그 수정 내용은 유튜브 댓글이나 커뮤니티 자료로 제공할 수도 있다고 말한다.[^28]
- 다만 커뮤니티 자료는 커뮤니티 멤버만 볼 수 있어 “오셔서 보셔야 한다”고 양해를 구한다.[^29]
- 수정 후
pod install을 실행하면 필요한 항목을 내려받고Podfile.lock같은 파일이 생기며 완료된다고 한다.[^30]
3.7 Android Studio로 시뮬레이터 실행( iOS도 가능 ): 개발자 친화 기능 강조[^31]
강의자는 iOS 앱 개발이라도 Android Studio에서 계속 작업하는 편이라고 말한다.[^31] 이유는 Android Studio가 “개발자 친화적”이고, 여기서 iOS 시뮬레이터도 돌아가며 작업 흐름이 편하다는 것이다.[^31]
진행 흐름:
- Android Studio를 켜고 Open으로 프로젝트 폴더를 연다.[^32]
- 처음엔 Android 뷰만 보일 수 있는데, “Android Project” 같은 뷰 옵션을 눌러 전체 프로젝트 구조를 본다.[^33]
- 디바이스 선택에서 iOS 시뮬레이터를 켜면 아이폰 15 시뮬레이터가 뜬다고 보여준다.[^34]
안드로이드 에뮬레이터 설정도 안내한다.[^35]
- Device Manager → “New Device / Create Virtual Device”로 생성할 수 있고,[^35]
- 픽셀(Pixel) 기기(예: Pixel 8/8a)를 예로 들며,[^36]
- 최신 API로 “API 35”를 언급하고, 넥스트/이름 설정/피니시로 만든 뒤 실행(런닝)하는 모습을 설명한다.[^37]
3.8 의존성 받기: pubspec.yaml과 “Flutter Pub Get”[^38]
앱을 실행하기 전에 pubspec.yaml에서 필요한 의존성을 설치해야 한다고 설명한다.[^38]
pubspec.yaml을 클릭하면 아래에 “Flutter Pub Get” 버튼이 보이는데,[^38]- 이것을 한 번 눌러 필요한 파일을 다운로드 받는다고 한다.[^38]
그 다음 실행(Run)하면 처음 빌드가 조금 걸리니 기다리라고 안내한다.[^39]
iOS도 마찬가지로 iOS 폴더 쪽 설정 후 동일하게 진행하면 된다고 덧붙인다.[^40]
3.9 첫 실행 결과: “디자인만 적용, 기능은 아직”[^41]
앱이 실행되면 매우 기본적인 화면이 뜨는데, 강의자는 이것이 “디자인만 적용된 상태”라고 설명한다.[^41]
- 기능이 없어서 채팅 입력이 안 되거나 제한적일 수 있다고 말한다.[^41]
- 안드로이드/아이폰 둘 다 비슷하게 동작하는 것을 보여주고,[^42]
- 이후엔 iOS 중심으로 진행하겠다며 안드로이드 화면은 잠시 꺼둔다.[^43]
또 시뮬레이터 옆에서 버튼을 실제로 누를 수 있는 등, 에뮬레이터/시뮬레이터 UI 조작 팁도 언급한다.[^44]
3.10 “메시지 버블이라도 떠야 테스트 가능”: 전송 버튼 동작 구현(Provider 상태관리)[^45]
강의자는 “디자인만 있어도 테스트하려면 메시지가 뜨는 것까지는 해야 한다”며, 전송 버튼 클릭 시 메시지 버블이 나타나게 기능을 추가하자고 한다.[^45]
이때 프롬프트 전략을 구체적으로 설명한다.[^46]
- 이제는 전체 코드베이스 태그까지는 필요 없고, lib 폴더만 태그해서 작업 범위를 제한한다.[^46]
- 프롬프트는 기능을 작은 요구사항 단위로 나눠서 쓰면 Cursor가 이해하기 쉽다고 말한다.[^46]
- 예: “전송 버튼 클릭 시 메시지 버블이 정상적으로 나타나도록” 같은 식으로 분리.[^46]
Cursor가 작업을 마치면, 가끔 “민감한 것/함부로 건드리면 안 되는 것”은 커서가 직접 수정하지 않고 사용자에게 하라고 안내하는 경우가 있다고 한다.[^47]
여기서는 Provider 패키지로 상태관리 구현을 했다고 나오고, 사용자는 안내에 따라 pubspec.yaml dependency에 provider를 추가하고 설치하면 된다고 설명한다.[^48]
설치 방법은 2가지로 소개한다.[^49]
- Android Studio의 “Flutter Pub Get” 버튼으로 설치하는 방법,[^49]
- 또는 터미널에서 커서가 제시한 명령으로 설치하는 방법.[^49]
강의자는 자신은 버튼 방식이 편해서 주로 그걸 쓴다고 개인 취향도 덧붙인다.[^49]
3.11 Android Studio의 강력한 생산성: Hot Reload / Hot Restart[^50]
기능을 추가한 뒤, 강의자는 Android Studio를 쓰는 큰 이유로 Hot Reload / Hot Restart를 강조한다.[^50]
- 코드를 바꿀 때마다 앱을 껐다 켤 필요 없이
- Hot Reload로 변경사항이 즉시 반영되는 경우가 많고,[^50]
- 반영이 안 되면 Hot Restart로 아예 재시작하면 된다고 한다.[^51]
- 이를 “진짜 꿀”, “너무 좋은 기능”이라며 적극 활용하라고 한다.[^52]
Hot Reload 후 실제로 메시지 버블이 나타나는 것을 보여주며 “신기하죠”라고 반응을 유도한다.[^53]
다만 현재는 AI 응답이 실제 호출이 아니라 “샘플 응답”으로 나온 상태임을 설명한다.[^54]
또 화면을 스크롤할 때 색이 바뀌는 등(아래로 내리면 밝아지고 위로 올리면 어두워지는) UI 동작도 언급한다.[^54]
3.12 UI가 너무 단순하다 → “애플 쿠퍼티노/스위프트 감성”으로 개선[^55]
강의자는 기존 디자인이 “너무 단순하고 깔끔하지 않다”고 평가하고,[^55] 이제 “플러터로 애플 쿠퍼티노 감성”을 넣어보자고 한다.[^56]
그가 작성한 UI 개선 프롬프트의 요구사항은 다음과 같다.[^57]
- “아래 수정 작업 진행”
- 애플 스위프트 디자인을 참고해서 UI 개선
- UI 요소가 더 직관적이고 심미적으로 보이도록 폰트/버튼/레이아웃 수정
- 타겟이 모바일이므로 모바일 사용자 경험에 최적화된 시각화 디자인 적용
- 메시지 입력/출력 시 단순히 “뿅” 나타나지 말고, 더 매끄럽고 “쫀득한” 마이크로 인터랙션 효과 추가
- 예시를 적어 주면 더 좋다는 팁도 덧붙인다.[^57]
Cursor가 개선 작업을 했다고 하고, 결과적으로 디자인이 “아까보다 낫고 iOS스럽다”는 느낌으로 변한 것을 보여준다.[^58]
강의자는 실제 iOS 메시지 앱과 비교해 “비슷하죠”라며 감성 방향이 맞았음을 확인한다.[^59]
다만 애니메이션(인터랙션)은 아직 원하는 느낌이 아니어서, 추가 프롬프트로 더 수정해보기로 한다.[^60]
3.13 애니메이션/인터랙션 튜닝: “아쉬운 점을 그대로 적는 게 제일 좋다”[^61]
강의자는 메시지 버블 애니메이션이 원하는 대로 안 들어간 것 같다고 말하며,[^60] 다음과 같은 요구를 프롬프트로 더한다.[^60]
- 메시지 버블이 나타날 때 옆에서 나타나는 애니메이션이면 좋겠다[^60]
- AI 응답은 보통 로딩이 걸리므로 2초 정도 로딩 표현을 넣어보자[^60]
수정 후 실행해보니 “되긴 하는데 어색”하고, 어디가 첫 번째/마지막 메시지인지 헷갈린다고 한다.[^62]
그래서 이런 식으로 “보면서 아쉬운 점을 그대로 적어 주는게 사실 제일 좋다”고 조언한다.[^61]
또 긴 프롬프트를 쓸 때의 개인 작업 방식도 공유한다.[^63]
- 강의자는 Cursor뿐 아니라 ChatGPT도 함께 사용하며,[^63]
- 요구사항을 “한정(=제한 조건)하고 정교하게 정리해서 전달”하는 편이라고 한다.[^63]
- 결과가 중요하니, 먼저 ChatGPT에게 “이걸 어떻게 구현하면 좋을까” 같은 식으로 물어 정리한 다음 Cursor에 넣는 방식이 효율적일 수 있다고 제안한다.[^64]
그 뒤 다시 시뮬레이터에서 확인하면서, 애니메이션이 “재밌게 바뀌긴 했지만 샘플 응답이 나올 때마다 계속 같은 연출이 반복된다”는 식의 관찰을 덧붙인다.[^65]
또 채팅 버블 색상(검은색)이 불편해서 흰색으로 바꾸는 수정을 추가로 진행하고,[^66] 재시작 후 “깔끔하게 변경됐다”고 확인한다.[^67]
3.14 Gemini API 준비: Google AI Developer에서 키 발급[^68]
이제 본격적으로 Gemini API를 붙이는 단계로 넘어간다.[^68]
- 구글에서 “Google AI Developer”를 검색해 해당 페이지로 간다.[^68]
- 구글 로그인으로 진행한다.[^68]
- 페이지에서 “Get API key” 흐름으로 들어가 API 키 만들기를 진행한다.[^69]
- 프로젝트 선택/생성(“기존 프로젝트에서 API 생성하기”를 누르라고 안내) 후 키를 발급받는다.[^69]
여기서 강의자는 매우 강하게 보안 주의를 준다.[^7]
- 강의 영상 때문에 키가 노출될 수 있지만, 본인은 “나중에 삭제할 것”이라고 말한다.[^70]
- 그리고 API 키는 절대로 다른 사람이 볼 수 있게 저장하면 안 된다고 경고한다.[^7]
- 이유: 누군가 키를 가져가 사용하면 요금 발생 등 문제가 생길 수 있기 때문이라고 설명한다.[^7]
- 키는 메모장 등 안전한 곳에 저장하라고 하고, 본인도 메모장에 저장하는 모습을 말로 설명한다.[^71]
[!WARNING] API 키 보안 경고
API 키를 노출하면 타인이 무단으로 사용해 요금/쿼터 소진 문제가 생길 수 있으니 공개 저장을 피하라고 강하게 말한다.[^7]
3.15 API란 무엇인가: “레스토랑의 웨이터” 비유로 이해시키기[^12]
강의자는 시작 전에 API와 Gemini를 간단히 설명한다.[^12]
- API를 레스토랑 주문 과정에 비유한다.[^12]
- 손님(우리 앱)이 주방(외부 시스템, 예: Gemini)로 직접 가지 않고
- 웨이터(API)에게 주문(요청)을 전달하면
- 웨이터가 주방에 전달하고 결과(응답)를 가져온다는 구조다.[^12]
- 따라서 API는 “우리 앱의 요청을 다른 시스템에 전달하고, 결과를 다시 받아 사용하는 중개자”라고 정리된다.[^12]
API 사용의 장점도 말한다.[^72]
- AI를 직접 만드는 것은 현실적으로 어렵지만,[^72]
- API를 이용하면 AI 기능을 쉽게 가져다 쓸 수 있고,[^72]
- 여러 API를 결합해 서비스를 만들 수도 있다고 한다.[^73]
단점/리스크도 언급한다.[^74]
- 비용 문제가 생길 수 있고,[^74]
- AI 성능에 의존성이 생길 수 있으며,[^74]
- 요청/응답 구조라 속도(로딩) 이슈가 있을 수 있고,[^74]
- 외부로 통신하므로 보안 문제가 발생할 수 있다고 말한다.[^75]
다만 이번 강의는 로컬에서 테스트하는 수준이므로 보안은 과하게 신경 쓰지 않아도 된다고 덧붙인다.[^76]
3.16 문서 활용 전략: 공식 문서 코드를 복사해 “require” 폴더에 저장[^77]
강의자는 공식 문서를 봐도 처음엔 이해가 어렵기 때문에,[^77] Cursor에게 일을 시키기 위한 “재료”로 문서 내용을 복사해 프로젝트 안에 저장하는 방식을 쓴다.[^77]
구체 단계:
- Developer Documentation → Quickstart 탭으로 간다.[^78]
- 언어/환경을 Dart/Flutter로 맞춘다(Flutter를 쓰기 때문).[^78]
- 페이지의 내용을 아래로 쭉 전체 복사한다.[^79]
- Cursor로 돌아와 프로젝트에
require폴더를 만들고,[^80] - 그 안에 “Gemini API를 설명하는 마크다운 파일”(예:
api.md)을 만들어 붙여 넣고 저장한다.[^80]
또 다른 문서(예: “텍스트 생성”) 쪽에서는 Node.js 탭을 클릭한 뒤,[^81] 그중에서도 “대화형 채팅 빌드” 섹션만 골라 복사해 같은 파일에 추가 저장하는 방식도 보여준다.[^82]
이렇게 하는 목적은 Cursor가 프로젝트 맥락에서 “Gemini API를 어떻게 쓰는지” 참고할 수 있도록, 문서 내용을 **프로젝트 내부 지식(참고자료)**로 만들어 주는 것이다.[^83]
3.17 Cursor에게 Gemini 연동 지시: 라이브러리 태그 + 로컬 테스트 명시[^83]
그 다음 커서의 Composer(프롬프트 입력 영역)에서 요구를 작성한다.[^83]
- 방금 만든 Gemini 문서 마크다운을 참고하게 하고,[^83]
- Gemini를 사용하는 방법에 맞춰 라이브러리(lib)를 수정해서,[^83]
- “Gemini API 이용한 AI 대화형 앱으로 만들어” 달라고 지시한다.[^83]
- 그리고 “로컬에서만 테스트할 거야”라고 조건을 준다.[^83]
이 지시 후 Cursor가 작업하는 동안, 강의자는 동시에 패키지 설치를 진행한다.[^84]
3.18 Flutter 패키지 설치: google_generative_ai 추가[^84]
Gemini 연동을 위해 강의자는 google_generative_ai 패키지를 사용한다.[^84]
- 문서에서 패키지 이름을 복사해
pubspec.yaml에 추가한다.[^84] - 이후 설치가 올바른지 체크하고,[^85]
- Cursor가 수정한 파일들도 읽어보며 적용한다.[^85]
Cursor가 만든 서비스 코드(예: AIService.dart)에 “YOUR API KEY” 같은 섹션이 있을 수 있는데,[^86] 여기에는 본인 키를 넣어야 하며 “내 걸 따라 쓰는 게 아니라 여러분 키를 쓰는 것”이라고 강조한다.[^87]
3.19 API 키 하드코딩 vs .env 분리: 더 안전한 관리로 개선[^88]
강의자는 단순히 코드에 API 키를 박아넣는 방식(하드코딩) 대신, 파일로 관리하는 방법도 알려주겠다고 한다.[^88]
.env파일로 관리하고 싶다고 Cursor에게 말해 방법을 진행한다.[^88].env로 분리하면 좋은 점:- 코드에 키가 그대로 들어가 있으면 앱이 배포되거나 누군가 다운로드 받았을 때 키 노출이 쉬워진다는 위험이 있다.[^89]
- 그래서 옛날 수학처럼 X, Y처럼 “Gemini API 키”를 변수/환경값으로 분리해 관리하자는 취지다.[^90]
구체적으로는:
- Flutter에 환경변수 관련 패키지를 추가하고,[^91]
.env파일을 만들고,[^92]- 그 안에
GEMINI_API_KEY=...형태로 본인 키를 넣는 방식으로 설명한다.[^93] - 이렇게 하면 코드에서는 키가 직접 드러나지 않아 “조금 더 안전하게 관리할 수 있다”고 말한다.[^94]
이후 다시 flutter pub get 등을 실행해 세팅을 반영한다.[^95]
3.20 실제 대화 테스트: “안녕”을 보내고 Gemini 응답 확인[^96]
세팅이 끝나면 앱에서 실제로 Gemini와 대화가 되는지 테스트한다.[^96]
- 강의자는 예시로 “안녕”을 입력하며 “지금 대화하는 거거든요”라고 말한다.[^96]
- 이어서 “넌 누구야 이름이 뭔데”라고 물어보니,[^97]
- Gemini가 이름이 없고 “구글에서 훈련된 대규모 언어 모델” 같은 식으로 자신을 설명했다고 반응한다.[^98]
여기까지로 “기본적으로 AI가 들어갔다”고 판단하고, 다음 단계는 성격(캐릭터) 부여라고 전환한다.[^99]
3.21 캐릭터/말투 넣기: AIService의 프롬프트를 교체한다[^99]
강의자는 AI 성격을 어디서 설정하냐면 Service 폴더의 AIService 파일에서 프롬프트를 추가/수정하면 된다고 안내한다.[^99]
그는 예시로 “장원영 럭키비키” 스타일을 프롬프트로 따서 미리 준비한 것이 있고,[^100] 그걸 복사해서 붙여 넣어 테스트한다.[^100]
중요한 포인트는 “프롬프트는 상세해야 한다”는 것이다.[^101]
- 만들고자 하는 캐릭터가 “어떤 식으로 답변해야 되는지”를 상세히 적어야 원하는 톤이 나온다고 말한다.[^101]
- 그래서 본인이 정리해둔 예시(어떤 말투, 어떤 방향으로 답할지 등)가 필요하다고 언급한다.[^102]
프롬프트를 바꾼 후 테스트 대화 예시가 나온다.[^103]
- 사용자가 “나 어제 마라탕 먹어서 슬퍼”라고 하자,[^103]
- AI가 “긍정적인 마음으로 기다려 보는 건 어때요” 같은 식으로 “럭키” 톤으로 답변한다고 설명한다.[^103]
- 또 “마라탕 말고 탕후루” 같은 식으로 이어지는 대화도 보여주며, 캐릭터성 있는 말투가 구현됨을 확인한다.[^104]
강의자는 이런 방식으로 “잼미 스타일”, “분하게 구워줬어요” 같은 밈/캐릭터 등 여러 스타일로 확장할 수 있다고 말한다.[^105] (예시로 흑백요리사 등 유행 콘셉트도 언급)[^105]
3.22 결과 정리와 확장 아이디어: 채팅 앱을 넘어 다양한 AI 도구로[^106]
강의자는 생각보다 쉽고 빠르게 만들 수 있었다고 말하며,[^106] 지금까지 몇 분 걸렸냐는 말에 “30~40분이면 금방”이라고 언급한다.[^106]
그리고 API를 이용하면 채팅 앱뿐 아니라 다양한 AI 기능 앱을 만들 수 있다고 확장 아이디어를 덧붙인다.[^107]
- 문서 정리해주는 AI[^107]
- 대본 써주는 AI[^107]
- 기타 업무 자동화/콘텐츠 제작 보조 등 다양한 형태 가능성을 열어둔다.[^107]
3.23 마무리: 다음 주제 예고와 커뮤니티/댓글 참여 요청[^108]
끝으로 강의자는 여기까지 따라온 시청자에게 고생했다고 인사하고,[^108] Cursor로 채팅앱을 만들고 애플 스타일로 디자인을 다듬고 API로 실제 대화까지 구현해봤는데 “재밌죠”라고 소감을 묻는다.[^109]
또 시청자에게 다음 행동을 요청한다.[^110]
- 오늘 배운 걸 바탕으로 독특하고 창의적인 채팅 앱을 만들어 공유해 달라[^110]
- 배우고 싶은 주제가 있으면 댓글로 남겨달라[^111]
- 최근 “웨이라(wayra?)”라는 영상/사진 AI 회사의 API가 공개돼 사진을 영상처럼 움직이게 해본 적이 있는데, 기회되면 그것도 다뤄보겠다고 예고한다.[^112]
마지막으로 강의가 허술할 수 있지만 좋아해줘서 감사하고, 구독자 200명 넘은 것에 대한 감사 인사를 전하며 영상을 마친다.[^113]
4. 핵심 통찰[^2]
- [h Cursor 개발의 현실은 “완전 무코딩”이 아니라 “AI가 대부분 만들고, 사람은 위험/민감 지점만 확인·반영”하는 협업이다.] 커서가
main.dart수정이나 의존성 추가 같은 부분에서 사용자가 직접 하게끔 남기는 사례가 반복된다.[^25] - [h 프롬프트는 요구사항을 쪼개고(기능 단위), 범위를 좁히며(lib만 태그), 관찰된 문제를 그대로 적을수록 결과가 개선된다.] 강의자는 기능 요청을 나눠 쓰라고 하고, 아쉬운 점을 그대로 적는 것이 가장 좋다고 말한다.[^46]
- [h 공식 문서를 “프로젝트 내부 참고자료(마크다운)”로 저장해 Cursor의 근거로 쓰는 방식은, 초보자가 API 연동을 빠르게 진행하게 해준다.] 문서 복사→require 폴더→커서 지시가 그 전략이다.[^80]
- [c API 키 보안은 초보 단계부터 습관을 들여야 한다.] 키 노출 시 무단 사용/요금 위험을 경고하고
.env로 분리해 하드코딩 위험을 낮추는 흐름을 보여준다.[^7] - [h ‘AI 채팅 앱’의 재미는 UI보다 “프롬프트 캐릭터 설계”에서 크게 올라간다.] 기본 Gemini는 밋밋하지만, 프롬프트를 상세히 쓰면 말투/태도를 쉽게 바꿀 수 있음을 대화 예시로 확인시킨다.[^101]
실행 관점에서의 구체 행동:
lib만 태그하고 “전송 버튼/버블 표시/스크롤/로딩”처럼 기능을 잘게 나눠 프롬프트로 요청한다.[^46]- UI는 “애플 스위프트 디자인 철학 참고 + 폰트/버튼/레이아웃 + 마이크로 인터랙션”처럼 심미/사용성 기준을 명시한다.[^57]
- Gemini 연동 시 문서 코드를 통째로 이해하려 애쓰기보다, 문서를 프로젝트에 붙여넣어 Cursor가 적용하게 한다.[^79]
- API 키는 절대 공유하지 말고, 가능하면
.env로 분리한다.[^7]
5. 헷갈리는 용어 정리[^12]
- Cursor(커서): 프롬프트로 코드 생성/수정/리팩터링을 도와주는 개발 도구로, 강의에서는 MVVM 구조 생성과 기능 구현을 지시하는 “AI 코딩 파트너”로 사용한다.[^22]
- Flutter(플러터): 하나의 코드베이스로 iOS/Android 등 여러 플랫폼 앱을 만들 수 있는 프레임워크/SDK로 설명된다.[^20]
- MVVM 패턴: Model-View-ViewModel 구조로 폴더/파일을 나누는 설계 방식. 강의에서 Cursor에게 이 패턴대로 프로젝트 구조를 만들게 한다.[^21]
- Cupertino 디자인/위젯: iOS 느낌(애플 감성)의 UI를 만들기 위한 Flutter 스타일/컴포넌트 개념으로 언급된다.[^56]
- API: 외부 시스템(예: Gemini)에 요청을 전달하고 응답을 돌려받는 “중개자”로, 레스토랑의 웨이터에 비유된다.[^12]
- Provider: Flutter 상태관리 패키지로, 메시지 버블 표시 같은 UI 상태를 관리하기 위해 추가했다고 설명된다.[^48]
- Hot Reload / Hot Restart: Android Studio에서 코드 변경 사항을 빠르게 반영하는 기능. 리로드로 반영 안 되면 리스타트로 재시작하라고 안내한다.[^50]
- .env 파일: API 키 같은 민감 정보를 코드 밖 파일로 분리해 관리하는 방식으로, 하드코딩 노출 위험을 낮추기 위해 사용한다.[^88]
- google_generative_ai: Gemini 연동을 위해 추가하는 Flutter/Dart 라이브러리(패키지)로 소개된다.[^84]
참고(콘텐츠 정보)[^1]
- 제목: Cursor로 코딩없이 Flutter 앱 개발 - Gemini API로 AI 채팅 앱 만들기[^1]
- 채널: freAiner 프리에이아이너[^1]
- 길이: 34분 30초[^1]
- 링크: https://www.youtube.com/watch?v=0LxUf3MKxIs[^1]
[^1]: @[00:01]~@[34:19] 영상 전체(인사, 제작 목표, 실습, 마무리) 내용.
[^2]: @[00:09] “커서와 플러터 언어… 제미나이 API 이용해서… AI 채팅 앱…”
[^3]: @[00:18]~@[00:37] 단순 채팅이 아니라 역할/롤플레/원형적 사고 AI, “여러분만의 채치피티” 설명.
[^4]: @[00:42] 오픈AI 챗GPT를 안 쓰고 구글 제미나이를 쓰는 이유 제기.
[^5]: @[00:42]~@[00:49] “지금 현재 무료로… 꽤 많은 양의 무료 제공량…”
[^6]: @[27:17]~@[27:43] 서비스 파일에 API 키를 넣는 흐름과 “여러분의 API 키” 강조.
[^7]: @[24:11]~@[24:16] “API 키는 절대로 다른 사람이 볼 수 있게 저장하면 안 됨… 요금 발생…”
[^8]: @[00:57]~@[01:37] 5단계 로드맵(프로젝트, UI, API 키, 호출 함수, 프롬프트 수정).
[^9]: @[01:37] “AI 프롬프트를 수정해서… 캐릭터… 맞춤형 AI 채팅앱”
[^10]: @[04:32]~@[06:01] MVVM 패턴으로 구조 생성, 커서가 만든 것 + 직접 수정 언급.
[^11]: @[01:16]~@[01:27] 쿠퍼티노 스타일 UI 예고 + @[16:24]~@[18:04] 스위프트 디자인 참고해 UI 개선.
[^12]: @[21:34]~@[22:07] API를 레스토랑 웨이터 비유로 설명.
[^13]: @[01:50] 개발 환경 설정 필요 언급.
[^14]: @[02:08]~@[02:38] 안드로이드 스튜디오, Xcode, Flutter SDK 설치 필요/설치 중요/외부 자료 참고 권장.
[^15]: @[02:56]~@[03:09] Cursor에서 폴더 만들기, 소문자 권장.
[^16]: @[03:15]~@[03:21] 예시 폴더 생성(AI2).
[^17]: @[03:27]~@[03:40] 터미널 여는 방법(단축키/우클릭 등).
[^18]: @[03:40]~@[03:55] flutter create .로 프로젝트 생성.
[^19]: @[04:02]~@[04:16] 여러 플랫폼 폴더가 생기지만 필요 없으면 정리.
[^20]: @[04:16]~@[04:32] lib에서 주로 작업, android/ios는 가끔 필요.
[^21]: @[04:32]~@[04:40] MVVM 패턴으로 작업할 것.
[^22]: @[04:58]~@[05:17] 커서 프롬프트 구성(코드베이스 태그, MVVM, 폴더/파일 생성, 디자인만).
[^23]: @[05:28] 커맨드 I/컨트롤 I로 실행.
[^24]: @[05:45]~@[06:01] 뷰/뷰모델/서비스 구조 생성 결과.
[^25]: @[05:49]~@[06:01] main.dart 수정은 직접, “가끔 직접 변경해야” 언급.
[^26]: @[06:21]~@[06:37] cd ios로 이동.
[^27]: @[06:48] Pod init과 Podfile 설명.
[^28]: @[07:00]~@[07:12] Podfile 수정 내용 공유 위치(댓글/커뮤니티) 언급.
[^29]: @[07:12]~@[07:33] 커뮤니티 자료는 멤버 전용이라 양해.
[^30]: @[07:41] pod install로 설치, lock 파일 생성 언급.
[^31]: @[07:48]~@[08:19] iOS도 Android Studio로 작업 선호, iOS 시뮬레이터 가능.
[^32]: @[08:19]~@[08:32] Android Studio에서 폴더 오픈.
[^33]: @[08:37]~@[08:46] Android Project 뷰로 전체 프로젝트 보기.
[^34]: @[08:55]~@[09:08] iOS 시뮬레이터 실행(아이폰 15).
[^35]: @[09:08]~@[09:21] 안드로이드 Device Manager 언급.
[^36]: @[09:36] 픽셀 기기 언급.
[^37]: @[09:45]~@[10:10] API 35, 이름 설정, 실행 흐름.
[^38]: @[10:26]~@[10:40] pubspec.yaml에서 Flutter Pub Get.
[^39]: @[10:49]~@[11:07] 첫 실행은 시간이 걸림.
[^40]: @[11:07]~@[11:11] iOS도 동일하게 pub get 후 실행.
[^41]: @[11:42]~@[11:54] 기본 디자인만, 기능 없어 입력 제한.
[^42]: @[11:48]~@[11:54] 안드/ios 모두 비슷.
[^43]: @[11:59] 이후 iOS 중심 진행.
[^44]: @[11:23]~@[11:30] 시뮬레이터 옆 버튼도 클릭 가능.
[^45]: @[12:45]~@[12:51] 테스트 위해 메시지 뜨게 만들자.
[^46]: @[13:03]~@[13:28] lib 폴더 태그, 기능을 나눠 프롬프트 작성.
[^47]: @[13:39]~@[13:52] 커서가 못 건드리는 건 사용자에게 요청, 천천히 읽기.
[^48]: @[13:52]~@[14:12] Provider 패키지 추가 안내.
[^49]: @[14:12]~@[14:39] 터미널로도 설치 가능 vs 버튼이 편함.
[^50]: @[14:48]~@[15:05] Hot Reload/Hot Restart 장점 설명.
[^51]: @[15:14]~@[15:31] 로드 안 되면 리스타트.
[^52]: @[15:31]~@[15:38] “진짜 꿀” 강조.
[^53]: @[15:38]~@[15:44] 메시지 버블 나타남.
[^54]: @[15:50]~@[15:57] 샘플 응답, 스크롤 시 색 변화 언급.
[^55]: @[16:06]~@[16:13] 디자인이 단순/깔끔하지 않다고 평가.
[^56]: @[12:11]~@[12:25] 쿠퍼티노 활용 예고 및 필요성 언급.
[^57]: @[16:24]~@[17:03] 스위프트 디자인 참고, 폰트/버튼/레이아웃, 마이크로 인터랙션 요구 프롬프트.
[^58]: @[17:37]~@[17:55] 로드 후 iOS스러운 디자인 변화.
[^59]: @[18:00]~@[18:04] iOS 메시지 앱과 비교 “비슷하죠”.
[^60]: @[18:08]~@[18:58] 인터랙션 미흡 지적, 애니메이션/로딩 2초 요청.
[^61]: @[19:16]~@[19:24] “아쉬운 점 그대로 적는 게 제일 좋다”
[^62]: @[19:04]~@[19:10] 어색함, 첫/마지막 구분 어려움 지적.
[^63]: @[19:34]~@[19:51] 긴 프롬프트는 ChatGPT로 정리해서 전달.
[^64]: @[19:51]~@[19:57] “방법 아냐?”처럼 물어보고 정리 활용 제안.
[^65]: @[20:17]~@[20:24] 애니메이션이 응답마다 반복되는 관찰.
[^66]: @[20:37]~@[20:52] 버블 검은색 불편 → 흰색으로 변경 요청.
[^67]: @[21:06]~@[21:13] 리스타트 후 깔끔하게 변경 확인.
[^68]: @[21:13]~@[21:27] Google AI Developer 검색/로그인.
[^69]: @[23:45]~@[24:00] Get API key, API 키 만들기, 기존 프로젝트에서 생성.
[^70]: @[24:00]~@[24:11] 강의용 키라 노출되지만 나중에 삭제할 것.
[^71]: @[24:16]~@[24:26] 메모장에 저장 언급.
[^72]: @[22:16]~@[22:32] AI 직접 만들기 어려움, API로 사용 가능.
[^73]: @[22:32]~@[22:38] 여러 API 결합 가능.
[^74]: @[22:38]~@[23:02] 비용, 의존성, 속도 문제 언급.
[^75]: @[23:10]~@[23:19] 보안 문제 가능성.
[^76]: @[23:19]~@[23:30] 로컬 테스트라 크게 신경 안 써도 됨.
[^77]: @[24:41]~@[24:47] 문서 봐도 이해 어려움 → 복사 활용.
[^78]: @[24:47]~@[24:53] Documentation→Quickstart→Dart/Flutter.
[^79]: @[24:53]~@[25:00] 전체 내용 복사.
[^80]: @[25:11]~@[25:30] require 폴더 만들고 api 마크다운 파일에 붙여넣기.
[^81]: @[25:30]~@[25:43] 텍스트 생성, Node.js 클릭.
[^82]: @[25:43]~@[25:59] 대화형 채팅 빌드 섹션만 복사.
[^83]: @[26:14]~@[26:30] 문서 참고해 lib 수정, Gemini 기반 대화형 앱, 로컬 테스트 프롬프트.
[^84]: @[26:49]~@[27:03] google_generative_ai 패키지 추가.
[^85]: @[27:03]~@[27:11] 설치 확인 및 커서 수정 파일 읽기.
[^86]: @[27:17]~@[27:24] AIService 파일의 YOUR API KEY 섹션.
[^87]: @[27:33]~@[27:43] “여러분의 API 키”, 따라 쓰지 말 것.
[^88]: @[27:50]~@[28:13] .env 파일로 관리하고 싶다, 방법 알려주겠다고 함.
[^89]: @[28:13]~@[28:20] 하드코딩이면 앱 배포/다운로드 시 키 노출 위험.
[^90]: @[28:20]~@[28:31] X,Y처럼 키를 따로 정의해 관리 비유.
[^91]: @[28:36]~@[28:42] 플러터에 관련 패키지 추가 언급.
[^92]: @[28:42]~@[28:52] .env 파일 만들기.
[^93]: @[28:52]~@[28:58] env에 Gemini API 키 입력.
[^94]: @[29:03]~@[29:08] 더 안전하게 관리 가능.
[^95]: @[29:08]~@[29:16] pub get 등 실행 완료 언급.
[^96]: @[29:18]~@[29:27] “안녕” 대화 테스트.
[^97]: @[29:27]~@[29:40] “넌 누구야 이름이 뭔데” 질문.
[^98]: @[29:40]~@[29:51] 이름 없고 LLM이라고 답변.
[^99]: @[30:00]~@[30:09] 성격 넣기, AIService 파일에서 프롬프트 추가.
[^100]: @[30:09]~@[30:27] 장원영 럭키비키 프롬프트 준비/복사.
[^101]: @[30:39]~@[31:05] 원하는 답변 방식 상세히 적어야 함.
[^102]: @[30:51]~@[30:57] 정리해놓은 예시가 필요하다는 취지.
[^103]: @[31:12]~@[31:33] “마라탕 먹어서 슬퍼”에 럭키 톤 답변.
[^104]: @[31:33]~@[31:44] “마라탕 말고 탕후루” 등 대화 예시.
[^105]: @[31:49]~@[32:04] 다양한 밈/캐릭터 스타일로 확장 가능(예시 언급).
[^106]: @[32:04]~@[32:11] 생각보다 쉽고 30~40분이면 만든다는 언급.
[^107]: @[32:11]~@[32:18] 문서 정리, 대본 작성 등 다양한 AI 앱 아이디어.
[^108]: @[32:18]~@[32:33] 고생했다는 인사.
[^109]: @[32:33]~@[33:00] 커서로 만들기 신기/재미 언급.
[^110]: @[33:00]~@[33:14] 창의적 채팅 앱 만들어 공유 요청.
[^111]: @[33:14]~@[33:23] 배우고 싶은 것 댓글 요청.
[^112]: @[33:23]~@[33:40] 영상/사진 AI 회사 API(웨이라) 다룰 수도 있다고 예고.
[^113]: @[34:05]~@[34:12] 구독자 200명 감사 인사 및 마무리.