TodayGo/설계

Flutter 앱 개발 시작 — 프로젝트 구조를 이렇게 잡았다

todaygo 2026. 5. 12. 16:02

이전 글에서 개발 환경 이야기를 했었어.
결국 현재는 Cursor + GPT 조합으로 Flutter 앱 개발을 진행하기로 정리했어.

 

그리고 이제 실제 프로젝트를 시작했다.

 

다만 나는 앱 개발 경험이 없어.
Flutter도 처음이고, 앱 출시 경험도 없어.

 

그래서 오히려 처음부터 구조를 어느 정도 정리해두는 게 중요하다고 생각했어.

 

특히 나처럼 백엔드 개발을 오래 했던 사람은
Flutter에서도 자연스럽게 “구조”를 먼저 고민하게 되는 것 같다.


처음부터 중요하게 생각한 것

이번 프로젝트에서 가장 중요하게 생각한 건 아래였다.

  • 기능 단위로 확장 가능할 것
  • 혼자 개발해도 유지보수 가능할 것
  • 상태 관리가 꼬이지 않을 것
  • Supabase 의존성이 UI까지 퍼지지 않을 것
  • AI 도구(Cursor)가 구조를 잘 이해할 것

특히 마지막 이유도 꽤 중요했어.

 

요즘은 AI가 코드를 많이 생성해주지만,
프로젝트 구조가 명확하지 않으면 오히려 코드가 금방 복잡해진다.

 

그래서 처음부터 구조를 어느 정도 강제하기로 했다.


왜 Feature-first 구조를 선택했을까

처음에는 단순하게 갈까도 고민했다.

 

예를 들면:

screens/
widgets/
services/
models/
 

같은 구조.

 

하지만 프로젝트가 조금만 커져도
기능 간 의존성이 꼬일 가능성이 높다고 생각했어.

 

그래서 최종적으로는 Feature-first 구조를 선택했다.

 

현재는 이런 방향으로 가져가고 있어.

lib/
 ├── core/
 ├── shared/
 └── features/
      ├── auth/
      ├── places/
      ├── favorites/
      └── suggestions/
 

기능별로 독립성을 가지는 방향이야.


Flutter에서도 Clean Architecture 느낌으로 가고 있다

백엔드 개발을 오래 하다 보니
Flutter에서도 자연스럽게 레이어를 나누게 됐어.

 

현재는 대략 이런 느낌이야.

presentation
application
domain
infrastructure
 

예를 들면 Places 기능은:

features/places
 ├── presentation
 ├── application
 ├── domain
 └── infrastructure
 

형태로 구성하고 있어.


Supabase는 Infrastructure에만 두려고 한다

이번 프로젝트는 Supabase를 적극적으로 사용할 예정이야.

  • Auth
  • PostgreSQL
  • Storage
  • Edge Functions
  • RLS

까지 대부분 활용할 생각이거든.

 

하지만 중요한 건:
Supabase 코드가 UI까지 퍼지지 않게 하는 거야.

 

그래서 현재는:

UI
 → Provider
   → Repository
     → Supabase datasource
 

형태를 유지하려고 한다.

 

아직 앱 개발 경험은 없지만,
구조가 한번 무너지면 나중에 수정 비용이 커진다는 건 백엔드에서도 많이 경험했었거든.


Riverpod를 선택한 이유

상태 관리는 Riverpod로 결정했다.

 

처음에는:

  • Bloc
  • Provider
  • GetX

같은 것도 찾아봤는데,
현재 프로젝트 방향에서는 Riverpod가 가장 잘 맞는다고 느꼈어.

 

특히 좋았던 건:

  • 의존성 관리
  • 테스트 용이성
  • 비동기 처리
  • 구조 확장성

부분이었다.

 

그리고 Cursor가 Riverpod 코드를 꽤 잘 생성해주는 것도 이유 중 하나였어.


앱 핵심 로직은 최대한 서버 쪽으로

이번 프로젝트에서 가장 신경 쓰는 부분 중 하나는 보안이다.

 

Flutter 앱은 결국 클라이언트라서
완전히 숨길 수는 없다고 생각하고 있어.

 

그래서 중요한 로직은 최대한:

  • RLS
  • PostgreSQL Function
  • Edge Function

쪽으로 이동시키려고 해.

 

예를 들면:

  • 관리자 권한
  • 추천 로직
  • 승인 정책
  • 검증 로직

같은 부분이야.

 

앱에서는:

  • UI
  • 상태 관리
  • 요청 처리

정도 역할만 담당하는 방향으로 가고 있어.


지금 중요한 건 결국 완벽함보다 흐름

예전에는 개발 환경과 구조를 완벽하게 만들고 시작하려고 했어.

 

그런데 이번에는 방향을 조금 바꿨다.

 

지금 가장 중요한 건:
“계속 만드는 흐름”이라고 생각해.

 

그래서 현재 목표도 단순해.

 

우선은:

  • 로그인
  • 장소 리스트
  • 즐겨찾기
  • 장소 제안

정도까지 빠르게 만들어보려고 해.

 

아마 다음 글에서는 실제 Flutter 프로젝트 생성이나
Supabase 연결 과정도 정리하게 될 것 같다.