관리자는 출석 일정을 등록하고 참여 현황을 확인하며, 학생은 모바일에서 QR 코드를 스캔해 출석할 수 있도록 만든 Flutter 애플리케이션입니다.
출석 처리에 그치지 않고 일정 알림, 승인 목록, 출석 기록, 친구 목록, 추첨 등 운영에 필요한 기능을 하나의 앱 안에서 관리합니다.
나의 개발 관점: 관리자와 학생 화면을 나누는 데서 끝내지 않고, 역할별 권한·데이터 책임·출석 상태 흐름을 함께 분리했습니다.
| 구분 | 내용 |
|---|---|
| 문제 | 수기 출석의 대기 시간·기록 누락과 일정별 참여 현황 관리의 비효율 |
| 관리자 버전 | 일정·QR 생성 → 실시간 참여 확인 → 승인·기록·추첨 관리 |
| 학생 버전 | 오늘 일정 확인 → QR 스캔 → 출석 결과 확인 → 개인 기록 조회 |
| 나의 기여 | QR 출석, Firebase 연동, 사용자·출석 데이터 구조, MVVM 리팩터링 |
| 핵심 판단 | UI에서 Firebase 로직을 분리하고 일정 ID·학생 ID·유효 시간·중복 여부를 함께 검증 |
| 성과 | 2024 순천향대학교 SW융합대학 학술제 우수상 |
| 상세 사례 | Notion 포트폴리오 |
Figma에 정리된 실제 화면을 기준으로 참여자의 일정 확인·선택·참여 현황과 관리자의 기록·추첨 흐름을 한 장에 구성했습니다.
출석 체크 앱은 종이 명단이나 수기 확인으로 발생하는 대기 시간과 기록 누락을 줄이고, 출석 일정 생성부터 QR 인증, 현황 확인과 기록 관리까지 모바일 환경에서 처리하기 위해 개발했습니다.
관리자 일정 등록
→ 학생에게 일정 표시 및 알림
→ 학생 QR 스캔
→ Firestore 출석 데이터 반영
→ 관리자 현재 인원·승인 목록 확인
→ 사용자별 출석 기록 조회
| 문제 상황 | 앱의 접근 |
|---|---|
| 출석 확인에 시간이 오래 걸림 | 학생이 직접 QR을 스캔해 출석 처리 |
| 명단과 출석 기록이 분산됨 | Firestore에 일정·사용자·출석 데이터를 통합 |
| 일정 변경을 놓치기 쉬움 | 로컬 알림과 일정 변경 리스너 제공 |
| 관리자와 학생의 필요한 화면이 다름 | 역할에 따라 일정 관리와 QR 스캔 기능을 구분 |
| 누적 기록 확인이 어려움 | 출석 로그와 현재 참여 목록을 별도 화면으로 제공 |
- 학생 역할에서 QR 스캐너 실행
- 일정과 학생 식별 정보를 이용한 출석 처리
- 카메라·저장소 권한 처리
- 관리자 역할의 출석 일정 등록
- 홈 화면 일정 카드 표시
- 현재 참여 학생 목록 확인
- 승인 목록 조회 및 처리 화면
flutter_local_notifications기반 로컬 알림android_alarm_manager_plus기반 예약 작업- Firestore 일정 변경을 구독해 알림 예약 갱신
- 사용자가 앱에서 알림을 켜고 끌 수 있는 설정
- 친구 목록과 사용자별 조회 화면
- 출석 로그 확인
- 추첨 화면
- 다크 모드와 반응형 화면 크기 대응
[관리자]
앱 실행 → 일정 등록 → 현재 명단 확인 → 승인·기록 관리
[학생]
앱 실행 → 오늘 일정 확인 → QR 스캔 → 출석 결과 확인 → 기록 조회
| 기술 | 사용 목적 |
|---|---|
| Flutter / Dart | Android·iOS 모바일 UI |
| Provider / Flutter Hooks | 화면 상태 및 생명주기 관리 |
| Firebase Core | Firebase 초기화 |
| Cloud Firestore | 일정·사용자·출석 데이터 저장 및 실시간 조회 |
| qr_code_scanner / qr_flutter | QR 스캔 및 QR UI |
| flutter_local_notifications | 기기 로컬 알림 |
| android_alarm_manager_plus | Android 예약 작업 |
| flutter_secure_storage | 기기 내 민감 정보 저장 |
| flutter_screenutil | 화면 크기별 반응형 UI |
| FlexColorScheme | 라이트·다크 테마 |
| 선택 | 선택한 이유 | 적용하며 고려한 점 |
|---|---|---|
| Flutter / Dart | 관리자와 학생의 서로 다른 모바일 흐름을 하나의 코드베이스에서 구현하고, 제한된 기간에 Android·iOS UI를 함께 구성하기 위해 선택했습니다. | QR·알림처럼 OS 의존성이 큰 기능은 플러그인과 플랫폼별 권한을 별도로 검증해야 합니다. |
| Cloud Firestore | 일정과 출석 상태가 여러 기기에서 빠르게 갱신되어야 하므로 실시간 구독과 문서형 데이터를 활용했습니다. | 화면의 역할 구분만 신뢰하지 않고 Security Rules에서 관리자 권한·출석 시간·데이터 소유권을 검증해야 합니다. |
| Provider / Flutter Hooks | 출석 상태·사용자 역할·설정 값을 화면 코드와 분리하면서도 중간 규모 앱에 필요한 상태 관리를 단순하게 유지했습니다. | 기능이 커지면 상태 범위와 의존성 방향을 더 엄격히 관리하거나 Riverpod·BLoC 같은 대안을 검토할 수 있습니다. |
| QR Scanner | 학생이 명단을 직접 검색하지 않고 현장에서 빠르게 출석하도록 입력 단계를 줄였습니다. | QR 문자열만 신뢰하지 않고 일정 ID·학생 ID·유효 시간·중복 출석을 함께 검증해야 합니다. |
| Local Notifications / AlarmManager | 별도 푸시 서버 없이 기기에서 일정 알림과 예약 작업을 제공하기 위해 선택했습니다. | Android 절전 정책과 OS 버전에 따라 실행 시점이 달라질 수 있어 권한과 배터리 최적화를 고려해야 합니다. |
| Secure Storage | 사용자 식별 정보나 토큰처럼 일반 설정값보다 보호가 필요한 정보를 기기 보안 저장소에 분리했습니다. | 대용량 출석 기록 저장소로 사용하지 않고 필요한 최소 정보만 보관합니다. |
| Feature 단위 폴더 + MVVM 성격의 분리 | 관리자·학생 기능이 늘어날 때 화면, 상태 로직, Firebase 접근 코드가 한 파일에 섞이지 않도록 나눴습니다. | View는 표시와 입력, ViewModel은 상태 전환, 데이터 계층은 Firestore 통신을 담당하도록 경계를 유지합니다. |
| 하나의 앱에서 관리자·학생 역할 분리 | 공통 일정·사용자 모델과 UI 자산을 재사용하면서 역할별 화면을 제공하기 위해 선택했습니다. | 화면 숨김만으로 권한을 보장하지 않고 데이터 접근 단계에서도 역할을 다시 확인합니다. |
lib/
├── main.dart # Firebase·알림 초기화 및 앱 진입점
├── database/db_query/
│ └── db_service.dart # Firestore 공통 CRUD
└── feature/
├── Home/ # 일정 카드, 관리자 일정 등록, QR 진입
├── CurrentList/ # 현재 참여 학생 목록
├── ApproveList/ # 승인 목록
├── FriendsList/ # 친구 목록
├── Log/ # 출석 기록
├── Lottery/ # 추첨 기능
├── NotificationService/ # 로컬 알림 및 일정 구독
├── Drawer/ # 사용자 메뉴
└── Store/ # 전역 앱 설정 상태
기능 폴더 내부는 화면, Model, ViewModel과 Widget을 분리해 관리합니다.
git clone https://github.com/hekim-cse/attendance_check.git
cd attendance_check
flutter pub get실행할 Firebase 프로젝트의 설정 파일을 추가합니다.
- Android:
android/app/google-services.json - iOS:
ios/Runner/GoogleService-Info.plist
Firestore 보안 규칙과 필요한 컬렉션은 사용자 역할과 데이터 소유권에 맞게 구성해야 합니다.
QR 스캔과 저장 기능을 위해 카메라·저장소·알림 권한이 필요합니다.
flutter run
- QR 값만 신뢰하지 말고 서버 또는 Firestore 보안 규칙에서 일정·사용자·출석 가능 시간을 함께 검증해야 합니다.
- 관리자 기능은 사용자 역할을 확인한 뒤 접근할 수 있도록 제한해야 합니다.
- 학생 식별 정보와 출석 기록은 최소한으로 수집하고 보관·삭제 정책을 명확히 운영해야 합니다.
- Android의 정확한 예약 알림은 OS 버전과 배터리 최적화 정책의 영향을 받을 수 있습니다.