FURY
- 뒤늦은 개인앱 출시 프로젝트 회고입니다.
- SeSAC 2기에서 진행한 개인 앱 출시 프로젝트입니다.
- 기능: 다이어리의 기본적인 CRUD + 차별성을 두고 싶어서 넣은 미래에 일기를 작성할 수 있고 설정 시간에 노티와 함께 일기를 볼 수 있습니다.
- 개발기간: 2022.09.13 ~ 2022.10.07
- 목표
- 정해진 기간 내에 맞춰 최대한 필요한 기능들을 넣고 기간 내 출시에 가장 큰 목적을 뒀습니다.
- Realm을 사용한 CRUD 학습
- Realm 스키마 설계 학습
- Rx Input Output 패턴 학습하기
- 자체 Notification을 사용해 알림 기능 사용하기
- 아이패드 대응
- 현지화(다국어 지원)
- Snapkit 사용하지 않고 바닐라로 UI 작업해 보기
- RxSwift, CodeBase UI, RxDataSources, MVVM(Rx Input Output) 패턴, MVC 패턴, Realm, notification 기능
초기 기획 + Wireframe 설계도
- 초기 기획을 너무 러프하게 작성해 많은 변경점이 있었습니다.
- 또한 개발적으로 가능한지도 조금 헷갈렸던 부분들이 많아 고려하는데 시간이 걸렸던 것 같습니다.
- 조금 성장한 지금 보면 터무니없는 것도 많고 너무 쉽게 느껴지는 것들도 많습니다 😭
- 다음부턴 기획 + 기능을 명확하게 픽스해 놓고 작업을 해야겠다고 뼈저리게 느꼈습니다. 😭

Git 링크 + App Strore link
Git
https://github.com/MoSonLee/FutureDiary
AppStore
https://apps.apple.com/kr/app/fury-%EB%AF%B8%EB%9E%98-%EC%9D%BC%EA%B8%B0/id6443563805
최종 FURY 화면
다크모드

라이트 모드

App Store 화면

사용 라이브러리
최대한 써드 파티를 덜어내고 바닐라로 구현해보고 싶어서 최소한으로 사용해 봤습니다.
- RxSwift
- Realm
- Toast
- Zip
- SideMenu
최종 화면 구성

주요 기술 스택 + 특이사항
- RxSwift
- 촉박한 시간이었지만 꼭 사용해 보고 싶어서 이번 프로젝트에 처음 적용해 봤습니다.
- 반응형 프로그래밍 라이브러리입니다.
- 생각보다 다양한 문법이 있어 사용하는데 조금 애를 먹었습니다.
- 확실히 러닝 커브가 적진 않다고 생각해 다음 프로젝트에서 확실히 더 Develop 해야겠다고 생각했습니다.
- Rx Input Output
- Rx를 어떻게 효율적으로 MVVM 패턴에 적용시킬 수 있을까 고민하며 사용해 본 패턴입니다.
- 처음 사용해 봐서 조금 힘들었지만 확실한 로직 분리를 할 수 있어서 좋았습니다.
- 일기 작성 + 일기 보여주는 화면에 적용시켜 봤습니다.
- Realm
- CRUD
- 무료로 제공되는 자체 데이터베이스를 위해 사용했습니다.
- 자체 디바이스 내에 데이터를 저장할 수 있어서 정말 편리했습니다.
- 모든 프로젝트에서 램 스키마 설계를 초반에 확실히 잘 잡고 넘어가야겠다고 느꼈습니다.
- Zip
- 파일 압축 및 해제를 위한 라이브러리입니다.
- 백업/복구 기능을 위해 사용했습니다.
- 아이패드 대응
- 아이폰 말고 아이패드에서도 어플을 구현해 보고 싶어 아이패드 대응도 해봤습니다.
- 레이아웃 외에도 생각해 줄 부분이 많아서 좋은 경험이 된 것 같습니다.
- Layout
- 코드 베이스로 UI를 잡아줬습니다.
- SnapKit 없이 레이아웃도 한번 잡아보고 싶어서 SnapKit 없이 작업해 봤습니다.
- 현지화(다국어 지원)
- 한국어, 영어, 중국어(간체, 번체), 인도네시아어, 태국어, 베트남어
- 다국어 대응을 해보고 싶어 여러 언어를 대응했습니다.
- 개인적으로 러닝 커브도 낮아 손쉽게 구현했습니다.
- 유료 출시
- 돈을 벌고 싶다기 보단 무료 어플을 한번 출시해 봐서 애플의 수익 구조가 궁금해 유료로 출시해 봤습니다!
- 커스텀 폰트 적용
- iOS 14.0 이상 대응
회고
초기 기획 + wireframe + 공수 산정
- 가장 많이 느낀 부분이었습니다
- 확실한 기획 + 제대로 된 시간 분배를 해야 작업할 때 훨씬 편해진다는 것을 느꼈습니다.
- 기획이 명확해야 개발을 하면서 기획을 수정하거나 추가할 부분이 없다는 걸 정말 느꼈습니다.
Rx Input + Output Pattern
- MVC로만 코드를 구현해 봤던 상태라 정말 많은 러닝 커브가 필요했습니다.
- 많은 Rx Operator들, 효율적인 로직 분리, 명확한 Input Output 들을 정의해 주기 위해선 명확한 플로우를 알고 있어야 한다고 느꼈습니다.
- 가장 힘들었지만 가장 많은 도움이 됐고 플로우를 이해하면서 전반적으로 많이 성장했다고 느꼈습니다.
- 그래도 부족한 부분이 너무 많다고 느껴서 다음 프로젝트에서 더욱 Develop 해야겠다고 느꼈습니다.
- 정말 많은 장점이 있다고 느꼈습니다.
- 유저가 입력하는 Input, 거기서 발생하는 Output을 나눠줘서 효율적인 로직 분리가 가능했습니다.
- 또한 나중에 코드를 볼 때도 훨씬 유지보수에 이점이 있다고 느꼈습니다.
- 시간이 좀 지나 여러 프로젝트에 적용해 보고 추가적으로 정리해 봤습니다.


Realm 데이터 설계
- 데이터 설계는 규모가 큰 어플이 아니다 보니 생각보다 간단했습니다.
- 다이어리 제목, 다이어리 내용, 다이어리 시간 세 가지로 나눠줬습니다.
- date가 들어간 이유는 현재, 미래일기를 구분해 주기 위해서 넣어줬습니다.
- 또한 Notification을 보내주기 위해선 설정한 Date가 들어가야 하기에 DiaryDate는 필수적이었습니다.
- 현재 작성한 일기엔 일기 등록 시점의 시간을 넣어주고 미래 일기엔 받기 쉬운 설정 시간을 넣어줬습니다.

Realm 데이터 암호화
- 백업을 하고 그 파일을 뜯어봤을 때 미래일기를 미리 확인할 수 있어서 그것을 막고자 암호화시켜주었습니다.
- Realm에 데이터를 구성해 줄 때 키를 사용해 암호화시켜주었습니다.


Notification
- 우선 현재 시간보다 예전 알림은 받아 오면 안 되니 현재 시간과 미래 일기 등록 시 설정해 준 알림 받을 시간을 비교해 값이 더 후인 것들만 notification에 추가해 줬습니다.
- 또한 Noti를 눌렀을 때 collectionView를 Reload 해줘서 등록한 일기를 추가할 수 있는 기능을 넣어줬습니다.


Layout
- SnapKit 없이 바닐라로 구성해보고 싶어서 NSLayout을 사용해 잡아주었습니다.
- 코드 양이 확실히 늘어난다는 단점이 있다고 느꼈습니다.
- 개인적으로 Storyboard, Snapkit, NsLayout 모두 구현 가능해보고 싶어 조금은 코드 양이 늘어나도 NsLayout을 사용해 봤습니다.

아이패드 대응
- 생각보다 고려할 게 정말 많아서 놀랐습니다.
- 뷰를 가로, 세로 모드로 변경했을 때 레이아웃이 깨지는 오류
- 아래처럼 viewWillTransition 함수를 사용해서 뷰가 회전하는 걸 인식해 레이아웃을 다시 잡아줘서 해결해 줬습니다.

- 오류는 아니지만 Custom Font를 핸드폰과 동일하게 잡아주면 아이패드에선 상대적으로 너무 작게 보여 pad인지 확인 후 font 크기를 다르게 잡아줬습니다.

- 또한 이슈는 아니지만 핸드폰에선 일기를 홈화면에 하나씩 보여주지만 패드에서도 하나씩 보이면 어색하다고 느꼈습니다.
- 따라서 패드에선 한 화면에 두 개씩, 또한 높이도 조정해 주었습니다.

현지화(다국어 지원)
- 러닝 커브가 높지는 않아서 수월하게 작업했습니다.
- 아래처럼 Localizable 폴더에 따로 String 값들을 저장해 준 후 사용했습니다.
- 하는 법은 따로 정리해 봤습니다!
- https://s2ung.tistory.com/27

- 업데이트
- 1.0.1 > 사이드 메뉴 띄워주는 방식 변경
- 1.0.2 > 아이패드에서 종종 레이아웃이 깨지는 오류를 수정
- 1.0.3 > 일부 기종 sidemenu 배경색이 보이지 않는 오류를 소중
- 1.0.4 > 일기 작성화면을 들어갈 때 키보드가 버벅거리는 오류를 해결
- 추후 업데이트 예정
- 앱 잠금 기능
- 폴더링 기능
- 온보딩
- 리팩토링 및 최적화
- 시간이 촉박해 이것저것 넣지 못해 아쉬움도 많이 남고 디자인부터 데이터 설계 개발까지 1인으로 작업하고 출시에 성공해서 많이 뿌듯하기도 했습니다.
- 명확한 기획 + 확실한 데이터 설계가 중요하다고 느꼈습니다.
- 또한 기간이 정해져 있다 보니 시간 분배도 잘해야겠다고 느꼈습니다!
'IS' 카테고리의 다른 글
iOS Swift 공식 문서 Study - Class, Struct 구조체 (0) | 2023.03.09 |
---|---|
iOS Swift - SocketIO(양방향 통신) (0) | 2023.02.28 |
iOS Swift - Rx Input Output pattern (0) | 2023.02.26 |
iOS Swift 카카오 소셜 로그인(Kakao Social Login) (0) | 2023.02.13 |
iOS Swift - Service Level Project(SLP) 회고 (0) | 2023.02.13 |