# Checkable : 부스트캠프 출석조회 어플 🗓
<center>
<br>
<br>
<img src="https://i.imgur.com/kMelGt3.png" width="550">
<br>
<br>
<br>
아직도 200여개의 댓글들을 스크롤하면서 불편하게 확인하시나요? 🥲
<br>
이제 앱에서 간단하게 출결사항을 조회하세요! 😆
</center>
## 💁🏻♀️ 팀원 & 역할 소개
|<img src="https://avatars.githubusercontent.com/u/43032377?v=4" width = 100>|<img src="https://i.imgur.com/V1KUwdf.jpg" width=100>|<img src="https://i.imgur.com/KD6hOp1.jpg" width=100>|
| :--------: | :--------: | :--------: |
|[S013] 김태훈<br>[@Modyhoon](https://github.com/Modyhoon)|[S036] 이나정<br>[@dailynj](https://github.com/dailynj)|[S045] 이지수<br> [@tmfrlrkvlek](https://github.com/tmfrlrkvlek)|
|크롤링 코드 작성|Firebase 세팅|크롤링 환경 세팅(EC2 & Crontab)|
|Firebase 데이터 수집|Firebase iOS 연동 & UI 작업|Firebase iOS 연동 & UI 작업|
<br>
## 📱 프로젝트 소개
### 🥲 기존의 출첵시스템
| 매일 체크해야 하는 출결관리 | 일일히 확인해야하는 번거로움 |
| :--------------------: | :------------------:|
| <img src="https://i.imgur.com/glxiMHT.png" width=250>|<img src="https://user-images.githubusercontent.com/72058473/134460854-3ab0c0ca-505e-4d3e-9076-4ed5e4b0468c.gif" width=200>|
<br>
### ✔️ 서비스 핵심 기능
1. 부스트캠프 체크인, 체크아웃 기록 조회 (캘린더 형식)
|출석부 예시 1|출석부 예시 2|
|:----------:|:----------:|
|||
2. 출결 현황 확인
|출결 현황 예시 1|출결 현황 예시 2|
|:----------:|:----------:|
|||
3. 사용자의 아이디 저장 (with userDefaults)
<br>
### ⚒ 프로토타입
<img src="https://i.imgur.com/iM9oXlK.png" width=600>
<br>
<br>
### ✅ 시연 영상
<img src="https://i.imgur.com/sZyge88.gif" width=250>
<br><br>
### 🏛 SW 아키텍처 & 사용 기술/라이브러리
<img src="https://i.imgur.com/pPbHg4e.png" width=550>
<br>
|서버|슬랙 스레드 크롤링([Link](https://api.slack.com/))|DB|APP|
|:-:|:-:|:-:|:-:|
|AWS EC2|Python|FireStore|iOS/Swift|
|Crontab|SlackAPI||FSCalendar|
<br>
### 🗂 DB Schema
<img src="https://i.imgur.com/rYAkP80.png" width=550>
<details><summary>자세히 보기</summary>
<p>
### Date
```json
// Date: 날짜
// CheckInOnly : 체크아웃 O - false, 체크아웃 X - true
// IsActive : Date Count 유무, True/False (19시에 True로 변환)
{
Date: 2021-09-23,
CheckInOnly: true,
IsActive: false
}
```
</p>
<p>
### AttendanceDetail
```json
// Date : Date
// CamperId : CamperId
// CheckInTime : 10:00:01 | null
// CheckOutTime : 23:00:10 | null
// Attendance : True/False
{
Date: 2021-09-23,
CamperId: "S013",
CheckInTime: 09:59:59,
CheckOutTime: null,
Attendence: true
}
```
</p>
<p>
### CamperId
```json
// CamperId : 번호
// Name : 이름
// Type : 안드로이드(K), iOS(S), 웹(J)
{
CamperId: "S013",
Name: "김태훈",
Type: 'S'
}
```
</p>
<p>
### Attendance
```json
// CamperId : CamperId
// Count : 총 출석 횟수
{
CamperId: "S013",
Count: 3
}
```
</p>
</details>
### 🏃♂️ Install & run
```bash=
git clone https://github.com/boostcampwm-2021/bookathon_F.git
cd BoostAttendance
pod init
pod install # m1 칩에서 오류가 발생한다면 arch -x86_64 pod install 을 실행해주세요
```
🧨 m1 칩에서 pod install 오류가 난다면 -> ```arch -x86_64 pod install``` 을 실행해주세요
🧨 Firebase 오류가 난다면 -> [링크](https://gogorchg.tistory.com/entry/iOS-Error-Could-not-build-ObjectiveC-module-Firebase)
🧨 CocoaPod 오류가 난다면 -> [링크](https://escnet.tistory.com/24)
<br>
## 🥕 개발 후기
### Lambda 최대 용량 초과 😢
<img src="https://i.imgur.com/h3fJjWD.png" width="500">
**눈물겨운 개발 과정💦**
1. gRPC 모듈이 C기반이여서 Python으로 세팅된 Lambda에서는 동작 불가
2. 도커로 가상 환경을 구축한 후 필요한 패키지 의존성만 추출 [참고사이트](https://stackoverflow.com/questions/66291208/firebase-admin-with-aws-lambda-python)
3. 용량이 커 zip 파일 업로드 불가능
4. S3에 업로드 -> 50MB 초과로 에러
5. EC2로 전환
### 파이어베이스 기본 용량 초과 😮
체크인 - 체크아웃 스레드의 댓글이 각 200여개에 이름
<img src="https://i.imgur.com/CtX7t2j.png" width="400">
중복체크 로직 등 DB에 접근하는 쿼리의 양이 점점 많아지고,
결국 사용량 초과로 무료 요금제는 더 이상 사용하지 못하게 됨 😭
눈물을 머금고 새벽3시에 **Blaze 요금제 결제 💸💸💸**
<img src="https://i.imgur.com/f9GZ7QO.png" width="450">
약 **31만회**의 읽기 트래픽
<img src="https://i.imgur.com/x7QHHSe.png" width="600">
<br>
### XCode 버전이 달라서 열지 못하는 이슈
XCode 최신버전인 **13.0** 환경에서 프로젝트 생성
해당 프로젝트를 XCode 12.6 환경에서 실행하니 다음과 같이 이슈 발생
<img src="https://i.imgur.com/lGpDmW8.png" width="500">
<br>
이후 계속해서 원인을 찾아보다가 XCode를 업그레이드 (13.0) 하니 정상적으로 프로젝트가 열림.
협업을 할때에는 개발 환경을 먼저 맞추고 시작하는게 중요하다는 것을 다시금 느낀 경험