본문 바로가기
SeSAC/개인앱 <Receipt Keeper>

<Receipt Keeper> 회고록

by imashrimp 2023. 10. 23.

첫 블로그 글이 새싹과정 4달째에 그것도 첫 앱 출시 회고록입니다.

 

앱을 간단히 설명하면 영수증 기록 앱 입니다.

아직 다녀보지 못 했지만 회사를 다니다 보면 회사카드 대신 개인 카드로 지출 하는 일도 있게 되고

회사 카드 사용 시 내역을 증빙해야 한다고 합니다.

그런 회사원 또는 개인 사업자 분들을 위한 앱입니다.

 

업데이트로 추가할 기능이 산처럼 많지만

1.0버전 기준으로 영수증을 사진으로 찍을 수 있고 그 내역을 기록하고 통계을 확인할 수 있습니다.

 

https://apps.apple.com/kr/app/receipt-keeper/id6469996993

 

‎Receipt Keeper

‎Receipt Keeper는 여러분의 지출을 손쉽게 기록하고 관리할 수 있는 편리한 도구입니다. Receipt Keeper를 사용하여 지출을 효과적으로 기록하고, 증빙을 간편하게 처리하세요. 개인 및 업무 생활에서

apps.apple.com

 

개인앱 출시 프로젝트를 위한 초기 아이디어는 가계부였습니다.

하지만 기획 피드백 단계에서 기능의 부족과 가계부 앱이 사용성이 낮다는 피드백을 받고

영수증 기록 앱으로 변경하게 되었습니다.

 

아래 두 항목은 이번 앱을 출시하면서 시간을 많이 들인 부분입니다

1. Realm 테이블 설계를 위한 Relationship

2. MVVM 패턴 적용

 

Realm 테이블 설계

영수증 내역을 저장하고, 여기에 포함된 비목, 구분 등의 항목을 수정하면

그 결과가 저장된 영수증 내역에 반영되는게 Realm 테이블의 핵심이라

비목, 구분 테이블의 각 PK가 영수증 테이블의 FK가 되는 구조로 설계했습니다.

 

MVVM 패턴 적용

과연 내가 출시 프로젝트에 잘 녹일 수 있을까라는 두려움이 있었습니다.

초반에는 MVVM패턴에 특정한 틀이 있고

커스텀 옵저버블을 반드시 써야한다는 강박아닌 강박에 사로잡혀 어려움을 겪었으나

MVVM ≠ Observable을 깨닫게 된 이후로 프로젝트에  MVVM패턴을 잘 녹여내기 시작했습니다.

(MVVM은 비지니스 로직을 뷰에서 뷰 모델에 분리하는 거지 Observable을 써야 MVVM 패턴이 되는게 아닙니다!!!)

 

프로젝트 진행 도중 발생했던 이슈와 해결법

 

1. 영수증 데이터 Index꼬임 문제

 

영수증 데이터를 수정하면 영수증 데이터를 보여주는 테이블 뷰 셀 중 빈 셀이 나타났습니다.

브레이크 포인트를 찍으며 디버깅을 하다보니 빈셀이 가진 구분 및 비목에 대한 값이

등록된 구분 및 비목 리스트에 존재하지 않는 값이 찍히고 있었습니다.

 

영수증 데이터 저장 및 수정 시 구분 및 비목 데이터를 저장하는 부분의 코드를 살펴보았고

뷰 모델에서 구분 및 비목을 옵저버블 클래스로 선언할 때,

아래와 같이 선언해 두었는데

임의의 Group 인스턴스를 생성해 구분, 비목 리스트에 존재하지 않는 데이터가 영수증 데이터 저장시 적용되었다 생각됩니다.

 위와 같이 코드를 수정해 임의의 비목 또는 구분 인스턴스를 생성하지 않도록 했습니다.

 

2. 영수증 데이터 수정시 이미지 비교

 

영수증 데이터 수정 시 이미지 변경 여부에 따른 분기처리를 위해

ImageView에 있는 UIImage와 FileManager를 통해 가져온 이미지의

일치 여부 확인 작업이 필요했습니다.

 

apple의 UIImage 공식문서를 보면 UIImage는 등위연산자로 구분하지 말고

isEqual()이라는 메서드를 사용해 두 이미지를 비교하는 올바른 방법이라 설명되어 있습니다.

 

이를 적용해 FileManager로 가져온 이미지와 UIImageView에 있는 이미지를 비교하니

같은 이미지인데도 다르다고 인식되었습니다.

 

원인을 찾아보니 isEqual(_:)메서드는 비교하려는 두 인스턴스가 같은지 확인을 하는 메서드라

FileManager를 통해 가져온 이미지와 UIImageView의 UIImage 인스턴스가

다를 수 밖에 없으므로 이 방법으로는 이미지가 변경되었는지 확인이 불가능했습니다.

 

각 이미지를 JPEG형식의 Data로 형 변환 후 Data 값 비교를 통해 이를 해결했습니다.

JPEG는 픽셀당 24비트(RGB 각 8비트씩)에 대한 정보를 갖고 있기 때문에

새로운 이미지와 로컬에서 불러온 이미지를 일치여부를 확인할 수 있었습니다.

 

3. datePicker 사용시 날짜 및 시간에 대한 문제

우선 datePicker에서 날짜 및 시간을 선택하면 디버깅 콘솔에 찍히는 시간은 GMT 시간으로 나옵니다.

하지만 실기기에서 앱을 실행시켰을 때는 해당 기기에 설정된 타임존에 속한 시간대로 나오게 됩니다.

즉, 입력시 Date값과 출력시 Date값이 다름을 의미합니다.

데이터 필터를 위해 시작일과 종료일 선택 시 Calendar 구조체와 dateComponents 메서드를 사용해

시작일은 선택한 날짜의 00시 00분 00초로, 종료일은 해당일의 23시59분59초로 설정해

필터를 적용하더라도 누락되는 데이터가 없도록 했습니다.

 

추가할 기능

1. 검색 기능

서치바 또는 텍스트필드를 사용해 영수증 데이터를 검색 기능을 추가할 계획입니다.

 

2. 사진앱에서 이미지 추가 

사진앱에서 가져온 이미지의 용량과 앱 내에서 카메라로 찍은 사진의 용량이 다릅니다.

이를 분기처리를 통해 사진앱에서 가져온 이미지도 적절한 용량을 갖도록 리사이징해

이미지를 저장할 수 있게 할 계획입니다.

 

3. 화폐 선택기능

현재는 금액 화폐 단위를 원화만 선택 가능하지만

달러, 엔화 등을 여러화폐를 선택할 수 있도록 업데이트 할 예정입니다.

이를 위해 화폐 단위에 대한 Realm 테이블도 초기에 설계해뒀습니다.

 

코드 회고

 

필터링 기능과 데이터의 변경 확인 등의 코드가 비효율적입니다.

심지어 차트를 그리기 위한 데이터 가공 로직의 시간 복잡도는 n^n으로 되어있습니다.

최근에 자료구조및 알고리즘 수업을 듣고 있는데, 자료구조와 알고리즘 학습을 통해

앱의 성능 향상을 위한 로직으로 리팩토링 할 예정입니다.

 

초기에 적용한 MVVM 패턴에 미숙한 점들이 보입니다.

이 부분을 리팩토링할 예정입니다.

 

Realm데이터에 MVVM 패턴 적용할 때

효율적 데이터를 핸들링을 위한 학습이 더 필요하다고 생각됩니다.

'SeSAC > 개인앱 <Receipt Keeper>' 카테고리의 다른 글

<Receipt Keeper>앱 문의  (0) 2023.10.20
<Receipt Keeper>개인정보 처리방침 가이드  (0) 2023.10.18