AppStoreConnect에서 스크린샷이 업로드 되지 않은 오류에 대한 문의를 보내놓고, 본가에 가서 휴식을 취하러갔었다. 그 사이에 답변을 받았는데 어떤 환경에서 일어나는 일인지를 알기 위해 몇몇 사항들(문제 재현, 사용한 브라우저, 문제 발생 시간대 등)을 적어달라고 요청받았다. 그에 맞게 대응하고 오래 걸리겠다싶어 먼저 회고 포스팅을 작성하자! 생각했던 찰나에, 바로 오늘 문제가 해결되었다. 그래서 심사제출을 완료하고 배포까지 매끄럽게 될 줄 알았으나 그러지 못했다,, 처음으로 리젝을 받았고 이를 해결하려면 좀 걸릴 듯 하여 회고 포스팅을 작성하게 되었다. 스크린샷과 리젝에 관한 내용은 다음 포스팅에 다루겠다,,
사실 현황이라기보단 완성본이였는데, 리젝을 받았으니 현황이라 하겠다. 리젝 사유 중에 4.2 Design: Minimum Functionality가 있기도 해서 좀 더 기능을 추가해줄 생각이다.
아무튼 크게 달라진 점은 디자인 디테일, 데이터 디스크 캐싱, 장소 카테고리 추가, '설정'탭 '정보'탭으로 변경이다. 이제와서 앱의 컨셉을 설명하자면 공무원이 가는 맛집을 찾는 앱이다.
그에 맞게 '공무원'이라는 키워드를 포인트로 정부청색과 정부적색을 앱 아이콘과 UI에 반영하였다.
![]() | ![]() | ![]() |
|---|
그리고 보시다시피 목록에 카테고리를 추가하여 원하는 장소를 더 쉽게 찾을 수 있도록 하였다. .filter로 카테고리를 분류하는데 이것도 은근 노가다였다. 사진처럼 같은 카페여도 어떤건 '음식점>카페,디저트', 또 다른건 '카페,디저트>차' 등 여러가지로 표시되어있었다. 이건 네이버 검색결과 데이터를 받아오는거여서 내가 정형화시키지도 못한다. 무슨 기준인지 찾아봤는데 내 추측으로는 네이버 스마트 플레이스에 업체등록을 진행해보면 업종을 선택하는 과정이 있다. 예를 들어 업종이 음식점이면 다양한 선택지가 나오는데 최종적으로 선택한 업종이 '음식점>한식'이면 '음식점>한식'으로, '음식점>한식>찌개,전골'이면 '한식>찌개,전골'로 나오는 듯하다. 즉, 그 선택지에서 마지막 두 개의 키워드만 불러오는 것으로 추측하고 있다.
그래서 그 선택지를 보며 홀수번째에 있는 키워드를 최대한 필터링되도록 집어넣었다. 1>2>3>4에서 큰 번호로 갈수록 디테일한 키워드가 많아지므로 1, 3 키워드를 필터링에 적용되도록 하는 것이다. 이 과정이 정말 노가다였다.
데이터 디스크 캐싱은 장소 API요청을 불러오는 시간이 너무 길고, 하루 검색량이 한정(25000개)되어있어 적용시켰다. 사용자당 한번 불러올 때마다 50개의 데이터를 검색해 가져오고, 최대 250개의 데이터 결과를 가져온다. 이론상 하루에 사용자 100명까지 이용할 수 있는 셈이다. 여기서 한 사용자가 앱을 2번 이상 재실행한다면 사용할 수 있는 인원이 줄어들 것이다. 그래서 착안한 것이 FileManager를 이용한 디스크 캐싱이다.
처음 실행 시, 캐시 데이터 유무를 확인하고 없으면 API요청 결과를 반영하고 그것을 디스크 캐시에 저장한다. 그 후에 실행될 때는 캐시 데이터가 존재하니 캐시 데이터를 반영하여 보여준다. 물론 이전에 몇 개의 데이터까지 불러왔는지, 최신 데이터인지 판단하는 것도 UserDefaults를 이용해 최신 데이터 비교, n번째 데이터 비교 등을 넣어 적용시켰다.
마지막으로 '설정'탭은 굳이,, 라는 생각이 들어서 데이터 출처와 앱의 현재버전을 알 수 있도록 최소한의 정보만을 담은 '정보'탭으로 변경했다.
![]() | ![]() | ![]() |
|---|---|---|
| 디스크 캐싱 전 | 디스크 캐싱 후 | 정보 탭 |
이건 테이블뷰를 만들 때의 이야기다. 2가지의 방법이 있는데
이 있다. 처음엔 그냥 아무생각없이 1번으로 진행했는데 장점은 override func으로 메소드들이 자동생성되어 테이블뷰 만들기 쉬웠다. 그런데 시간이 지날수록 이 외에는 모두 단점으로 느껴졌다,, 카테고리 버튼들을 최상단에 놓으려니 테이블뷰 크기 조절도 되지않고(테이블뷰가 화면 전체로 고정), safeArea를 무시하는 범위로 생성되기 때문에 스크롤 할때 그닥 보기좋지않았다.
그래도 똥고집으로 구글링해보았지만 딱히 해결되지않았다. 어쩔수없이 2번 방법으로 전향하였고 나에게는 이 방법이 더 잘맞았다. 훨씬 더 자유롭게 UI를 꾸릴 수 있었고 UITableViewDataSource와 UITableViewDelegate를 채택하여 연결해주면 1번의 편리함을 그대로 가져올 수 있어서 1번 방법은 정말 간단한 구성 아니면 사용안할 듯하다. 아래 사진은 테이블 뷰 크기(조절가능여부)를 보여주는데 왼쪽은 ViewController, 오른쪽은 TableViewController이다.

이건 이슈라기보단 고민을 꽤 오래했던? 케이스다. 사용자한테는 최대한 부담을 줄이면서 많은 데이터를 불러오고 싶었다. 그래서 계속 제한적으로 생각하다보니 오래 걸렸고 결론적으로는 불러온 데이터를 json형식으로 디스크에 저장하는 FileManager와 몇 개(몇번째)의 데이터까지 저장했는지, 가장 최근에 저장한 첫번째 데이터와 API로 요청한 첫번째 데이터와 비교해 제일 최신 데이터인지 확인하기 위한 UserDefaults를 사용하였다. FileManager와 UserDefaults는 CoreData와 같이 대표적으로 디스크 캐시로 많이 사용되는 것이니 따로 정리해도 좋을 것 같다.
내 생각과 xcode의 생각은 많이 다른 것 같다. 노란색 에러가 뜬 대부분은 스토리보드에서 오토레이아웃 때문이였다. 여러가지 경우가 있었지만 예를 들어 버튼 배치를 할때 top을 view safeArea의 top에서 a만큼 떨어지게 해주고, leading을 view safeArea의 leading에서 b만큼 떨어뜨리면 내 머릿속으론 어느 디바이스에서든 배치가 가능하다고 생각했다. 방으로 치면 왼쪽 위 모서리에서 a, b만큼 떨어뜨려달라고 한거니까,, 그런데 xcode는 불안하다고 판단한 듯 노란색 에러를 보여주었고 trailing이나 bottom을 잡아주어야 에러가 보이지 않았다.
이건 오토레이아웃 가이드같은 설명을 공식 사이트에서 본적이 있어 거기서 좀 더 공부하거나 경험이 많이 필요할 듯 보인다.
흠,, 솔직히 기능을 뭘 더 추가해야될지 모르겠다. 일단은 내가 갔던 장소나 가보고싶은 장소같이 나만의 장소를 메모와 함께 저장할 수 있는 기능을 생각하긴 했는데 이걸로 충분할지 모르겠다. 그냥 장소만 적힌 데이터들을 지도로 표시해주는 게 최소한의 기능도 못하고 있다고 보다니ㅠ
어떤 기능을 넣을지 생각하는 게 제일 우선이지 싶다.