Ch 06. Full-Stack Dart의 장점과 한계
앱이 완성되었습니다. Flutter 앱과 dart_frog 서버 모두 Dart로 작성했습니다. 이 구조의 실제 장단점을 솔직하게 이야기해 봅니다. 어떤 상황에서 선택하면 좋은지, 어떤 상황에서는 다른 방법을 고려해야 하는지를 알아야 더 나은 결정을 내릴 수 있습니다.
장점 1: 코드 공유
가장 큰 이점은 모델 클래스를 프론트엔드와 백엔드가 공유할 수 있다는 점입니다.
이번 프로젝트에서 Todo 클래스를 플러터 앱에서 정의했지만, 이를 별도 패키지로 분리하면 서버도 동일하게 사용할 수 있습니다.
todo_shared/ ← 공유 패키지
lib/
models/
todo.dart ← Todo 모델 (fromJson, toJson)
user.dart ← User 모델
todo_server/ ← 서버
pubspec.yaml
dependencies:
todo_shared:
path: ../todo_shared
todo_app/ ← 앱
pubspec.yaml
dependencies:
todo_shared:
path: ../todo_shared
이렇게 하면 서버가 반환하는 JSON 형식과 앱이 파싱하는 모델이 항상 일치합니다. 백엔드 개발자가 필드 이름을 created_at에서 createdAt으로 바꾸면 공유 패키지를 수정하는 순간 앱 코드도 컴파일 오류가 발생해서 누락을 즉시 알아챌 수 있습니다. 타입 안전성이 시스템 전반에 걸쳐 적용됩니다.
장점 2: 컨텍스트 스위칭 감소
서버 코드와 앱 코드를 같은 언어로 작성한다는 것은 생각보다 큰 이점입니다. async/await, null safety, 컬렉션 메서드 등 동일한 문법과 사고방식이 적용됩니다. Node.js 백엔드와 Flutter 프론트엔드를 함께 개발할 때처럼 두 언어 사이를 오가며 머릿속을 전환할 필요가 없습니다.
장점 3: 단일 팀으로 전체 스택 개발
소규모 팀이나 1인 개발자에게 특히 유리합니다. Dart를 잘 아는 Flutter 개발자가 서버도 함께 담당할 수 있습니다. 코드 리뷰도 한 팀 안에서 이루어집니다.
한계 1: 서버사이드 Dart 생태계의 크기
솔직히 말하면, 서버사이드 Dart 생태계는 Node.js, Go, Python에 비해 작습니다. pub.dev에서 서버 관련 패키지를 검색하면 선택지가 많지 않습니다.
| 기능 | Node.js | Dart |
|---|---|---|
| 웹 프레임워크 | Express, Fastify, NestJS 등 | dart_frog, shelf 정도 |
| ORM | Prisma, TypeORM, Sequelize | 없음 (dart_mappable 정도) |
| 인증 라이브러리 | Passport.js | 직접 구현 필요 |
| 큐/스케줄러 | Bull, Agenda | 거의 없음 |
복잡한 비즈니스 로직, 성숙한 ORM, 다양한 미들웨어가 필요하다면 Node.js, Go, Python 등 생태계가 큰 언어를 선택하는 것이 현명합니다.
한계 2: 배포 환경
Flutter 서버는 실제로 많이 쓰이는 배포 패턴이 아직 정착되어 있지 않습니다. AWS Lambda, Google Cloud Functions 같은 서버리스 환경에서 Dart를 공식 지원하는 경우가 많지 않습니다. Docker를 이용한 컨테이너 배포가 현재로서는 가장 현실적인 선택입니다. PART 09에서 이를 다룹니다.
한계 3: 커뮤니티와 자료
Stack Overflow, 블로그, GitHub 이슈 등 문제를 해결할 때 참고할 자료가 상대적으로 적습니다. dart_frog 특정 오류를 구글에서 검색하면 결과가 거의 없는 경우도 있습니다. 문서를 직접 읽거나 소스 코드를 파야 하는 상황이 자주 생깁니다.
언제 Dart 백엔드를 선택할까
다음 상황이라면 Full-Stack Dart는 좋은 선택입니다.
- Flutter 앱과 백엔드를 혼자 또는 소규모 팀이 개발합니다.
- 모델 공유와 타입 안전성이 중요한 프로젝트입니다.
- API가 비교적 단순하고 복잡한 ORM이나 미들웨어가 많이 필요하지 않습니다.
- 팀 전체가 Dart에 익숙하고 새로운 언어를 배우는 비용을 피하고 싶습니다.
반면 다음 상황이라면 다른 백엔드를 고려합니다.
- 이미 Node.js, Python, Go 팀이 별도로 있습니다.
- 복잡한 데이터베이스 쿼리, 트랜잭션, ORM이 많이 필요합니다.
- AWS Lambda 같은 서버리스 환경이 요구사항에 있습니다.
- 대용량 트래픽 처리를 위한 검증된 생태계가 필요합니다.
이번 챕터 정리
Full-Stack Dart는 "최고의 선택"이 아니라 "특정 상황에서 좋은 선택"입니다. 코드 공유와 타입 안전성은 분명한 강점이지만, 생태계 크기와 배포 성숙도는 약점입니다. 이 트레이드오프를 이해하고 팀과 프로젝트 상황에 맞게 선택하는 것이 중요합니다.
PART 08이 완성되었습니다. 다음 PART에서는 만든 서버를 실제로 배포하는 방법을 배웁니다.