TodoDoIt은 하루의 목표와 할 일들을 관리할 수 있는 앱입니다.
https://apps.apple.com/kr/app/투두두잇-tododoit/id6470423853
기획
처음 기획을 하면서 어떤 앱을 만들까 라는 고민을 하다가 종종 해야 할 일을 까먹는 것이 생각나서 투두리스트를 만들기로 했습니다.
투두리스트의 기능을 생각하다가 목표와 메모기능을 더 넣기로 했습니다.
UI
이번 출시를 통해 초기 기획이 얼마나 중요한지 가장 중요하게 느꼈던 부분이었습니다.
다음 출시에는 피그마를 배워서 사용해보고 싶습니다.
처음 앱의 UI를 기획할때 간단하게 기획을 하고, 개발을 하려고 보니 화면 전환에 대한 부분들이 명확하지 않아 다시 기획하게 되었습니다.
iteration (개인일지 )
공수산정을 처음엔 큰 기능들로 짜놨었는데 세부 기능들과 예상치 못한 오류들로 점점 미뤄져서 하루 전에 계속 수정했던 것 같다. 다음부터는 상세 기능들을 적어보고 전체 큰 흐름을 적어봐야겠다고 느꼈습니다.
Realm
- 목표
PK(id) | title(String) | startDate(date) | endDate(date) | complete(Int) | finish(Bool) | FK doitComplete (List<목표 달성>?) |
1 | ~ 하기 | 시작 | 종료 | 20(총도전횟수) | true | 1,2 |
- 목표달성
PK(id) | impression(String) | imgetitle(String) | createdate(Date) | updateDate(date?) |
1 | 달성~ 느낀점 | 파일명(PK) | 2023.09.20 |
- 메모
PK(id) | title(String) | createdate(date) | updateDate(date?) |
1 | ~ 나중에해야함 | 2023.09.20 |
- 할 일
PK(id) | title(String) | finish(Bool) | createdate(Date) | updateDate(date?) |
1 | 오늘은 운동 | false | 2023.09.20 |
처음 에는 하나의 repository로 모든 테이블을 관리하려고 제네릭으로 추상화해서 사용했으나 프로젝트를 진행할수록 하나의 repository 파일에 필요 없는 함수들이 생겨 각 모델별로 분리했습니다.
각 모델이 공통으로 필요한 CRUD와 key 값으로 찾는 함수만 정의해 놓고, 추가로 필요한 기능들은 해당 repository에 넣어 사용하기로 했습니다.
메모리
목표 상세화면을 구현하다가 스크롤이 버벅거리길래 메모리를 확인하니 이미지 크기 때문인지 메모리를 엄청 차지했었다. 그리고 여러 번 테스트를 하니 메모리 누수가 발생하여 계속 쌓이고 있었다.
deinit이 되는지 다 확인하고, 이미지뷰 크기만큼 리사이징을 해주었다.
func setData(data: DoitCompleted, totalcount: Int, index: Int){
let filename = data.imageTitle + ".jpg"
// 이미지뷰 크기를 비동기로 가져오기
DispatchQueue.main.async {
let size = CGSize(width: self.completeImageView.frame.width, height: self.completeImageView.frame.height)
self.setImage(filename: filename, size: size)
}
dateLabel.text = data.createDate.changeFormatString(format: "dd일")
yearMonthLabel.text = data.createDate.changeFormatString(format: "yyyy년MM월")
memoLabel.text = data.impression
countLabel.text = "\(totalcount - index)회차"
}
func setImage(filename: String, size: CGSize) {
DispatchQueue.global().async {
if let fileImage = FileManager.loadImageFromDocumentDirectory(fileName: filename) {
let image = fileImage.reSize(to: size)
DispatchQueue.main.async {
self.completeImageView.image = image
}
} else {
DispatchQueue.main.async {
self.completeImageView.backgroundColor = .systemGray3
}
}
}
}
더 많은 트러블 슈팅은 해당 링크에 정리해 두었습니다.
https://west-cicada-052.notion.site/dfef67fbe68d4285bdeee820cc057be2?pvs=4
리젝
조금은 신기한 리젝사유를 받아 적어보았습니다.
마지막으로
하나의 앱을 기획부터 출시까지 하기 위해 생각보다 많은 점을 고려해야 했었고, 여러 가지 예외 처리들을 할 사항이 많았다.
리젝사유를 받으면서 1주일 동안 출시가 미뤄지면서 문의 메일도 보내 볼 수 있는 경험을 할 수 있었고,
최대한 앱이 안 꺼지는 방향으로 테스트들을 다 해보면서 여러 가지 케이스들을 경험해볼 수 있어서 좋은 기회였다고 생각한다.
조금 아쉬운 점은 API 통신을 못해본 게 아쉽지만. 업데이트 사항으로 추가할 수 있는 방법이 있는지 생각해 보고 추가할 예정이다.
그리고 Rxswift를 배우고 있어서 조금 더 익숙해지기 위해서 Rxswift로 리팩토링 위젯, 인증샷 공유, 월별 달성률 차트 등등 추가할 예정이다.