기숙사 세탁실의 세탁기/건조기 상태를 확인하고, 예약·사용 기록·고장 신고·알림을 처리하는 Flutter 모바일 앱입니다.
- 로그인/세션 관리: 인증 코드 기반 로그인, access/refresh token 저장 및 갱신
- 세탁기/건조기 상태 조회: 층별 장비 상태, 사용 가능 여부, 예약 상태 표시
- 예약 관리: 장비 예약, 예약 취소, 예약 만료 카운트다운, 상태 동기화
- 사용 기록 조회: 장비별 당일 사용 이력 조회
- 고장 신고: 장비 고장 내용 신고 및 서버 에러 메시지 처리
- 알림: FCM 토큰 저장/등록/삭제, 알림 목록 조회
- 회원 관리: 내 정보 조회, 회원 탈퇴
- Flutter / Dart
- Riverpod 3: 상태 관리
- Dio + Retrofit: HTTP 통신
- Freezed / json_serializable: 모델 생성
- GoRouter: 라우팅
- Firebase Messaging: FCM 알림
- Flutter Secure Storage: 토큰 저장
- ScreenUtil: 화면 대응
lib/
├─ core/ # 앱 공통 코드
│ ├─ constants/ # 공통 상수
│ ├─ enums/ # 공통 enum
│ ├─ env/ # 환경 설정
│ ├─ network/ # Dio, 인증 인터셉터, 토큰 유틸
│ ├─ notifications/ # Firebase Messaging 초기화/토큰 관리
│ ├─ router/ # GoRouter 라우팅
│ ├─ states/ # 공통 presentation state
│ ├─ theme/ # 색상, 아이콘, 간격, 타이포그래피
│ ├─ ui/ # 공통 UI 컴포넌트/다이얼로그
│ └─ utils/ # formatter, logger, background task
│
├─ features/
│ ├─ alarm/ # 알림 목록, FCM 토큰 서버 등록/삭제
│ ├─ auth/ # 로그인, 로그아웃, 토큰 저장
│ ├─ history/ # 사용 기록 조회
│ ├─ report/ # 고장 신고
│ ├─ reservation/ # 장비 상태 조회, 예약/취소, 상태 동기화
│ └─ user/ # 내 정보 조회, 회원 탈퇴
│
├─ firebase_options.dart
├─ main.dart
└─ splash_screen.dart
현재 구조는 불필요한 domain 레이어와 pass-through repository를 제거하고, 기능 책임이 있는 곳만 repository를 둡니다.
data/data_sources: Retrofit API 호출, 응답 파싱data/models: API 응답/요청 모델, 앱 내부에서 쓰는 local modeldata/repositories: 여러 데이터 소스나 부가 로직을 조합할 때만 사용- 현재 유지 대상:
auth,alarm
- 현재 유지 대상:
presentation/viewmodels,presentation/providers: 화면 상태와 비즈니스 흐름 관리presentation/states: 화면/action 상태 모델presentation/widgets,screens: UI
- Riverpod 기반으로 상태를 관리합니다.
- UI는 DataSource를 직접 호출하지 않고 ViewModel/Provider를 통해 상태를 읽습니다.
- 단순 조회 Provider는 DataSource를 직접 사용할 수 있습니다.
- 여러 API 호출, 토큰 저장, FCM 처리처럼 흐름이 있는 경우만 Repository를 둡니다.
- action 상태는
core/states/presentation_state.dart의ActionState/ActionStatus를 사용합니다.
- API 정의는 Retrofit으로 작성합니다.
- 공통 Dio 설정은
core/network/dio_client.dart에서 관리합니다. - 인증 헤더/토큰 갱신은
AuthInterceptor에서 처리합니다. - 서버 응답 파싱은
core/network/api_response_parser.dart를 사용합니다.
- 로컬 FCM 토큰 생성·저장은
core/notifications/notification_service.dart가 담당합니다. - 서버에 FCM 토큰을 등록/삭제하는 API는 알림 기능 책임으로 보고
features/alarm에 둡니다. - 로그인/로그아웃은
AuthRepository에서 알림 Repository를 호출해 흐름만 연결합니다.
기능별로 테스트 파일을 하나씩 유지합니다. UI 문구 확인보다 비즈니스 로직과 상태 변화 중심으로 작성합니다.
test/
├─ core/core_test.dart
├─ features/report/report_test.dart
└─ features/reservation/reservation_test.dart
# 의존성 설치
flutter pub get
# 코드 생성
flutter pub run build_runner build --delete-conflicting-outputs
# 정적 분석
flutter analyze
# 테스트
flutter test
# 포맷
dart format lib test
# 실행
flutter run앱은 다음 env 파일을 asset으로 사용합니다.
.env.development
.env.production
예시는 .env.development.example, .env.production.example을 참고하세요.