---
# System prepended metadata

title: PersonalScheduler 프로젝트

---

# PersonalScheduler 프로젝트
<img src="https://i.imgur.com/E6QY0KD.png" width="230"/> <img src="https://i.imgur.com/NE2B0Yy.png" width="230"/><img src="https://i.imgur.com/ejyH7g8.png" width="230"/>![]()

<br>

## 프로젝트 및 개발자 소개
> **소개** : 개인 스케줄을 등록하고 관리하는 앱입니다.<br>
> **프로젝트 기간** : 2022.01.8 ~ 2022.01.13<br>

| **[우롱차](https://github.com/dnwhd0112)** |
|:---:|
|<img src="https://avatars.githubusercontent.com/u/43274246?v=4" width="200">||

<br>

## 미구현 사항
애플 개발자 계정이 없어 OAuth를 통해 회원가입 불가 및 노티피케이션 알림 불가능.

## 테스트용 계정
facebook
email: xipainuwlv_1673603946@tfbnw.net
password: testpassword

### 우롱차

## 📱 구현 화면

|**메인 화면** | **리스트 화면** | **상세 화면** |
| -------- | -------- | -------- |
|![](https://i.imgur.com/20sD2UR.gif)|![](https://i.imgur.com/AwNiUb3.gif)| ![](https://i.imgur.com/NBD7R9l.gif) |



<br>

## 폴더 구조
- **Entry**: AppDelegate과 SceneDelegate이 있습니다.
- **Model**: 네트워킹, 파이어베이스에 사용되는 모델입니다.
- **Network**: FierBase의 CRUD 로직과 Kakao, Facebook 계정연동시 필요한 로직을 포합합니다.
- **Domain**: 화면 별 구현사항을 포함합니다.
- **Extension**: 커스텀한 Extension의 집합입니다.
- **Error**: 정의된 에러타입이 있습니다.
- **Utility**: 정의된 Observable이 있습니다.

<br>

## 구현 내용

### 단방향 MVVM
내부 로직이 혼잡해지는 것을 방지하고자 로직의 흐름을 input과 output 처럼 **단방향**으로 제한했습니다. 이러한 형태를 ViewModelAble로 추상화하였습니다. ViewController에서 추상화 된 ViewModelAble로 ViewModel의 Newtork객체 모두 **의존성주입** 형태로 초기화하며 이러한 구조는 **테스트 코드 작성에도 용이**합니다.

### FireBase 데이터 구조
Firebase의 저장구조는 Key: Value 형태로 저장이 됩니다. 사용자로부터 카카오톡이나 페이스북에서 고유한 ID를 가져온뒤 이에 할당하는 UserID를 새로 발급해주었습니다. 이 아이디를 key 값으로 데이터를 저장합니다. 물론 저장되는 데이터도 고유한 UserId를 가집니다.이를 트리로 나타내면 다음과 같습니다.
![](https://i.imgur.com/ZV6axRd.png)

### firebaseDatable 구현
파이어 베이스의 데이터를 조회하는 경로를 protocol로 정의하고 원하는 데이터의 경로에 따라 다르게 조회할수 있게끔 구현하였습니다.

### Observable을 사용한 뷰처리
**Observable**을 사용하여 데이터에 따라 뷰가 알맞게 변경되게끔 구현하였습니다.

<br>

