약 2개월 만의 게시글입니다!
방장이 게시글에서 자주 멘탈이 나가더니
iOS, Swift를 버리고 도망친건 아닌가..
개발을 버린것이 아닌가...
놀랍게도 앱을 출시하고 왔습니다!
https://apps.apple.com/app/fooca/id6443597628
사용자가 음식을 먹었을 때 같이 간 사람, 날씨, 제목, 사진 등을 입력하면 카드로 저장되고 지도에 방문한 위치가 핀으로 찍힙니다
핀을 누르면 등록했던 카드가 나옵니다
캘린더를 활용하여 특정 날짜의 카드를 볼 수 있습니다
날씨와 같이 간 사람들로 등록된 카드가 분류됩니다
회고
09.13 ~ 10. 03 3주 간 개발을 하고 출시를 하면서 많은 일들이 있었다
1. 기획
처음 기획을 할 때 데이터 설계 과정에서 Realm, API, Map, Calendar를 써야겠다는 큰 틀을 정하고 앱의 컨셉을 정했다
-> 앱의 컨셉은 메뉴를 잘 못 고르는 사람들을 위한 메뉴 추천 및 음식 기록 앱을 기획했다
이때로 다시 돌아간다면 제발 한번 더 생각해... 제발..
큰 틀이 잡힌 후에 개발공수를 설정하고 본격적으로 개발로 뛰어 들었다(09.13)
1-1) NAVER MAP
cocoapods 이슈로 naver map을 못 쓰는 상황이 발생했다
can't find gem cocoapods (>= 0.a) with executable pod (Gem::GemNotFoundException)
(아직도 해결 하지 못함)
-> 기능이 Mapkit에서도 있어서 Mapkit으로 방향을 틀었다
1-2) 우선순위? 기능? Layout? UI?
이번 출시 프로젝트를 겪으면서 첫번째 난관이었다(NaverMap은 Mapkit으로 대체 되었으니..)
예전에는 항상 Layout을 다 잡고 기능을 넣는 형식으로 개발을 해왔다 심지어 처음 프젝에서는 UI를 다 설정하고 개발하기도..
이번 프젝에서 가장 느낀점이 큰 부분 중 하나는 기능 하나에 layout이 제일 적당하다 생각한다
더 나아가 더미 프젝을 하나 만든 후에 모든 기능이 구현되는 것을 확인하고 최종으로 앱을 출시하기 위한 Xcode에 옮기면서 코드 정리까지 하는 것이 제일 베스트라 생각하게 되었다(당장 구현에 급급하여 코드 정리는 물론 기능 정리도 잘되지 않아서 개발공수를 맞추기 힘들어져서 잠자는 시간을 아끼는 현상이 발생했다)
1-3) 피드백을 두려워 말라..
피드백을 두려워 했던 것이 이번 프젝에서 가장 큰 잘못 중 하나이다
위의 기획에서 문제점이 없고 완벽하다 생각했기에 중간 점검 직전에 개발공수를 맞춰가며 구현에 급급해하며 중간 점검 3일 전에 기능을 다 만들었다
아쉽게도 위의 gif는 다시는 보지 못하는 gif이다 기능을 다 만들고 피드백을 받았을 때는 기획한 절반의 기능이 날라갔다
애초에 기능의 반은 개발자인 내가 설정한 Raw한 값을 던졌고 그에 따른 피드백은 신뢰도가 떨어지고 변수가 많고 앱 자체가 위험도가 높아질 수 있다 였다. (검색한 api도 45개의 데이터만 나오기 때문에 검색의 기준이 없었다)
최대한 처음 기획을 살릴려고 보완하는 방향으로 기능을 유도하려 했지만 피드백을 들으면 들을수록 유저에 입장에서 생각하지 않았다는 것을 깨닫고 과감하게 기능의 절반을 덜어냈다.
2. 기능
2-1) TableView + CollectionView
Fooca는 모든 layout을 snapkit을 사용하여 코드로 설정했다.
TableView안에 CollectionView를 설정했는데 CollectionView Cell이 움직이지 않는 현상이 발생했다
평소처럼 Self.addSubView가 아닌 contentView에 View를 추가 해주면 움직이지 않는 현상은 발생하지 않는다
(제발 hierachy 확인 좀..)
2-2) Realm은 거짓말을 하지 않는다..
이번 프젝에서 가장 어려웠던 부분은 Realm이라 할 수 있다.
고민을 많이하고 Realm 문제를 해결하기 위해서는 데이터가 실제로 Realm 안에 잘 들어갔는지, 잘 들어갔는데도 나오지 않는다면
print를 활용하여 일일이 다 찍어보고 데이터의 흐름을 찾아야한다 print 활용의 중요성을 정말 뼈저리게 느꼈다
2-3) Map
MapKit의 method 중에는 RemoveAnnotation이라는 method가 존재한다
맵핀을 설정한 후 사용자가 삭제를 하게 된다면 동시에 맵에서 사라지지 않은 상태가 되었고 앱을 껐다 켰을 때는 맵에서 핀이 삭제 된 것을 확인했다
1. 앱의 생명주기에서 시점이 맞지 않는 것이라 생각하여
시점을 확인 해봤지만 시점은 문제가 없었다
2. Realm에 핀에 필요한 정보를 다 저장해놨는데 Realm의 데이터가 삭제가 되지 않은 것은 아닐까?
Realm studio에서 확인했을 때 삭제가 된 것을 확인할 수 있었다
3. 이후 앞서 말했던 RemoveAnnotation에 꽂혔다..
일정 시간 이상 해결이 되지 않는다면 과감하게 버렸어야..
단순히 method에서 코드를 짜고 호출하면 삭제되겠지? 이런 안일한 생각을 했다
4.
Realm은 viewWillAppear에서 업데이트 되는 상황에서 맵핀을 설정해주는 함수에서 핀을 다 삭제 한 후 핀을 꽂는 다면 유저의 입장에서는 삭제한 핀은 보이지 않는다
처음에 설명을 들었을 때는 그때 당시도 RemoveAnnotation 함수에 꽂혀있어서 논리를 들어도 왜 method를 사용하지 않나 싶었는데 다 삭제하고 핀을 꽂는거나 핀을 삭제하는 거나 똑같은 말을 깨닫고 참 바보 같았다는 생각이 들었다
3. 버그
3-1) TextField 제약, 키보드가 View를 덮는 현상
TestFlight에 처음 앱을 올렸을 때 거의 다 했다라 생각했던건 판도라의 상자를 열기전 판도라가 내가 아녔을까..
가장 많이 접했던 버그는 TextField에 제약이 걸려 있지 않아서 일정 이상의 글자를 넘어가는 것을 허용 했었다
TextField Delegate를 설정해서 해결했다
키보드는 애초에 NotificationCenter를 코드 설정하기 전에 설정하고 시작했는데 TextField가 아닌 TextViewDelegate 안에 들어가 있었다... 자동완성이 되었다고 넘기지 말고 다시 확인하자 (TableView와 CollectionView 동시에 설정할때도 발생하는 실수이다)
3-2) Iphone 8
노치가 없는 UI 대응을 하지 않고 있다가 노치가 없는 기기 대응을 하면서 새로운 함수를 만들고 비교적 쉽게 해결할 수 있었다
3-3) Raw
기획에서 발목을 잡았던 Raw 한 값은 다 구현을 했다고 생각했을 때도 발목을 잡았다.
처음 피드백을 받았을 때 유저의 데이터를 쌓는 방향을 바꾸라는 피드백을 받았었는데 분류의 기준을 이번에도 개발자인 나의 기준으로 나눈 것이 문제였다 (ex) 연인과 함께, 혼자, 친구와 함께, 가족과 함께, 지인과 함께, 회식) 예를 든 부분에서처럼 개발자인 내 기준으로 raw한 값을 뿌려서 변수가 생기는 상황을 들었을 때는 최대한 raw한 값을 뿌리면 안되겠다는 것을 깨닳았다
수정한 방향은 사용자가 직접 누구와 갔는지 입력하는 방식으로 변경했다
3-4) 무한 dismiss
dismiss의 위치를 if 절 밖에 설정해놔서 버튼을 누를 때 마다 무한으로 dismiss를 즐겼다
3-5) TabBar에서 popupView를 구현 할 경우 다른 탭을 누르고 다시 돌아오면 검은색 화면 발생
화면 전환 시 modalTransitionStyle을 CoverVertical로 설정하여 아래 TabBar버튼을 막았다
느낀점
개발공수에 맞출려고 잠을 줄이며 기능을 구현하고 버그 발생시 기록한다고 기록했지만 다음에 프젝을 하거나 앱을 만든다면 버그 발생이나 깨닫는 점이 있다면 스크린샷이나 영상으로 남겨놓는 것이 바람직한 방향이라 생각한다
처음에 말했듯 더미 프젝을 만든 후에 모든 것을 구현하고 UI를 앞둔 상태에서 최종 프로젝트로 Xcode를 만들어서 구현할 것이다
위에 말한 버그, 수많은 시행착오를 겪으면서 많은 발전을 했다고 믿고 싶고 처음 만든 앱이면서 내 이름을 걸고 나오는 앱인 만큼 욕심이 난 것은 사실이다. 하지만 자기객관화를 한 상태로 할 수 있는 것과 하지 못하는 것을 명확하게 한 후에 구현을 목표로 구현을 하고 공부를 하면서 부족한 부분을 업데이트 하는 것이 바람직하다고 느꼈다
많은 시간 도움을 준 팀원과 멘토분들에게 감사를 전하고 싶다
다음에는 더 나은 앱을 만들어 보고 싶다는 후기다!
'Tech > iOS' 카테고리의 다른 글
[iOS]Day45 - Generic (0) | 2022.08.18 |
---|---|
[iOS]Day45 - TypeCasting (0) | 2022.08.18 |
[iOS] Day44 - Storyboard 없이 코드로 UI 설정해보기(Feat. Snapkit) (0) | 2022.08.17 |
[iOS]Day43 - UIPageViewController (0) | 2022.08.16 |
[iOS]Day43 - Custom FrameWork (0) | 2022.08.16 |