개인 프로젝트 회고 (부제: 추석맞이 나홀로 해커톤 회고)


Table of contents

  1. 서비스 소개
  2. 개발 기간
  3. 구현 기능
  4. 기술 스택
  5. 좋았던 점
  6. 어려웠던 점
  7. 아쉬운 점
  8. 느낀 점

instagram

어렸을 때부터 명절 때는 늘 큰집과 할머니댁에 다녀왔었다. 친가와 외가가 가까운 덕에 연휴를 꽉꽉 채워서 가족, 친척들과 시간을 보내왔다. 코로나가 심해진 후에는 상황이 조금 달라졌다. 명절 때 사람들에게 치이면서 이동하기보다는 여유로울 때 찾아뵙게 되었고, 명절을 온전히 자유시간으로 사용할 수 있게 되었다.

이번 추석은 특히 연휴가 긴 탓인지, 늘 회사 일만 하느라 개인 프로젝트를 하지 못한 탓인지 문득 그냥 흘려보내기에 시간이 아깝다는 생각이 들었다. 그래서 혼자 앱 출시를 목표로 해커톤을 진행하였다. 뭘 만들지 고민이 많았는데, 가장 최근에 작업을 하던 앱이 있어서 이 서비스를 마무리하고 출시하기로 결정했다. 기획과 디자인이 어느 정도 나와 있고 일부 화면은 개발된 상태였기 때문에 출시가 목적인 이번 해커톤에 가장 적절한 주제라고 생각했다.

* 글을 작성하다 보니까 너무 다른 다양한 분야들의 이야기가 담기는 것 같았다. 그래서 UX/개발/마케팅 등 측면에 대한 자세한 내용은 따로 작성하고, 본 글에는 전반적인 회고만 담기로 하였다.

서비스 소개

‘아차차’는 자주 잊어버리는 사람들을 위한 리마인드 알림 앱이다. 마켓에 나와 있는 수많은 리마인더들과 차별화되는 점은 단순히 ‘알림’이나 ‘일정’의 역할만 하는 것이 아니라, ‘메신저’라는 테마를 가지고 있다는 점이다. 유저는 알림에 이름을 부여하고 프로필을 설정할 수 있다. 언제(특정 일시 혹은 특정 요일, 시간 반복) 어떤 메세지를 보낼지도 정할 수 있다. 직접 입력한 메세지들이 카카오톡이나 디엠처럼 온다는 컨셉을 잡았고, UI도 최대한 메신저와 알림 사이 균형을 맞춰서 디자인하려고 노력했다. instagram

개발 기간

버전 기간
1.0.0 09/28 ~ 10/03
1.0.1 10/04 ~ 10/05
1.0.2 10/06
1.1.0 10/07 ~ 10/09
1.1.1 10/11

이전에 작업했던 기간은 제외하고, 개발 직전 기간만 산정
* 이전 작업 목록: 알림 목록 및 상세 페이지 (화면 내 주요 로직은 연결이 되어 있었으나 실제 데이터 저장은 연결되어 있지 않았음.)

구현 기능

  • 알림 생성 및 삭제
    • 이름, 프로필 아바타(선택사항), 알림 메세지(선택사항), On/Off 여부
  • 로컬파일로 데이터 저장
  • 푸쉬 알림 설정
    • 특정 일시 알림 설정
    • 특정 요일 및 시간에 반복 알림 설정
  • 푸쉬알림을 통해 앱 진입 시 팝업 화면 노출
  • 도움말 모달 페이지 제공
  • 인스타그램으로 이동
  • 이메일 주소 복사
  • 배너 광고 노출
  • 보상형 광고 시청을 통한 광고 제거

기술 스택

  • Swift
  • UIKit
  • 외부 라이브러리
    • Lottie (애니메이션 효과)
    • Google Mobile Ads (AdMob 적용)
  • 아키텍처
    • VIP패턴
    • MVC패턴
  • 최소 지원 버전
    • iOS 14.0
  • 디자인툴
    • Figma

좋았던 점

  1. 프로젝트의 마무리
    해커톤을 진행하며 가장 좋았던 점은, 언제 끝날지 기약이 없었던 (그래서 의욕도 줄어들었던) 프로젝트를 출시로 마무리하는 경험을 했다는 점이었다.
    정확한 시기는 기억이 안 나지만, 컨셉과 초기 디자인을 정한지는 1년반이 넘은 것 같다. 그사이 디자인 개편도 여러 차례 진행하고, 일부 화면 개발도 진행했었다. 그러나 그 이후에 진도가 나가지 않았다. 회사 일이 바쁘기도 했지만, 그걸 핑계 삼아 디자인과 개발에 지친 나를 합리화했다. 아무리 수정해도 마음에 쏙 드는 디자인이 나오지도 않았고, 조금밖에 없는 개인 시간을 쪼개서 개발에 할애할 마음이 선뜻 들지도 않았다.
    그런데 나 혼자라도 해커톤을 해보자! 무조건 추석 연휴 때 1.0.0을 출시하자!라는 생각으로 집중했더니 의욕과 오기가 생겼다. ‘며칠만 고생하면 되는데’, ‘이 기능만 추가하면 출시할 수 있는데’라는 생각으로 열심히 달려보니 목표한 대로 추석 연휴 마지막 밤에 심사를 맡기고 다음 날 아침에 앱을 출시할 수 있었다.
    이번 프로젝트도 결국 이렇게 잘 끝냈으니, 이제 이다음엔 뭐든 할 수 있겠다는 자신감도 생겼고, 개인 작업에도 활력이 불어넣어졌다. 해커톤 이후 지금까지도 시간을 일부러 내어서 틈틈이 개인 작업을 하고 있고, 해보고 싶은 것들을 정리하며 해나가고 있다.

  2. VIP패턴 (Clean Swift) 적용
    사실 부끄럽게도 클린하고 멋진 코드로 개발하는 것을 크게 신경 쓰는 편도 아니었다. 동작을 잘하고 (유저가 보기에) 완성도 있게 잘 만들면 되는 것 아닌가 라는 생각이 강했다. 아마도 내가 완전한 개발 베이스의 사람이 아니고, 개발 외적인 면에 더 욕심이 있기 때문에 그랬을 것 같다. 개발자이면서도 이런 고민을 덜 하는 스스로가 부족하다고 많이 느껴왔다. 그렇기 때문에 이번 프로젝트에서는 코드 퀄리티를 어느 정도 신경 쓰겠다는 개인적인 목표가 있었다.
    입사동기들 중 iOS개발자 몇 명과 ‘월간 아키텍처’라는 이름으로 한 달에 한 개의 아키텍처를 공부하는 스터디를 진행했었다. 정해진 기간동안 공부를 해오거나, 예제 프로젝트에 해당 아키텍처를 적용해 보고 이야기를 나눴다. VIP패턴을 공부했을 때, 예제 프로젝트로 ‘아차차’의 일부 화면을 제작했었다.
    이때 만든 프로젝트를 이어서 작업하는 것이었기 때문에, 최대한 다른 화면에서도 VIP패턴을 적용하여 clean swift를 도입하려고 노력했다. 물론, 마지막으로 갈수록 빠른 개발을 위해서 간단한 페이지는 MVC로 제작하였지만, 어찌 되었든 메인 피처는 원래 계획한 대로 VIP패턴을 지켜 제작하였다. 평소에 사용하지 않는 방법을 도입하다 보니 고민되는 지점도 많았지만, 그 과정에서 개발자로서 한 단계 성장한 것 같다.

  3. 보상형 광고
    애드몹 보상형 광고를 도입한 것도 잘한 일이라고 생각한다. 이전에도 배너 광고는 넣어봤지만, 다른 유형의 광고들은 사용해 본 적이 없었다. 이번 프로젝트에는 배너 광고와 그 배너 광고를 제거할 수 있는 보상형 광고를 제공하고 있다.
    서비스를 제작하는 목적 중에 수익 창출(혹은 그 가능성 가늠하기)이 차지하는 비율이 적지 않다. 현재 회사에 소속되어 있기 때문에, 인앱결제 기능을 추가하기에는 어려움이 있다. (인앱결제를 적용하기 위해서는 개인사업자 등록이 필요한 것으로 알고 있다.) 그렇기 때문에, 현실적으로 할 수 있는 최선의 방법으로 보상형 광고를 택했다. 이 앱에서 나온 데이터를 통해 보상형 광고의 성과나 수익이 어느 정도인지 가늠해 볼 수도 있을 것이고, 이 프로젝트뿐만 아니라 다른 프로젝트에서도 적용해 볼 수 있는 기반을 다질 수 있을 것으로 기대된다.

어려웠던 점

  1. 기획/디자인적 고민
    혼자서 프로젝트를 진행하다 보니 기획이나 디자인적인 고민이 생겼을 때 보다 나은 결론을 도출하기가 어려웠다. 주변에 물어보기도 하고, 레퍼런스도 찾아보면서 더 좋은 디자인, 더 좋은 UX를 제공하고자 노력했다. 그렇지만 여전히 몇 주 혹은 몇 달 후에 내가 한 기획/디자인을 보면 만족스럽지 않았다. 디자인은 정말 여러 차례 바뀌었는데, 이 내용도 너무 방대해서 따로 글을 작성해야 할 것 같다.
    출시 시점에는 어느 정도 만족하는 상태가 되었지만, 여전히 아쉬움이 남는다. 보는 눈을 키우고 싶어져서 다른 서비스를 이용할 때 유심히 잘 봐야겠다고 생각했다. 더불어, 혼자 작업을 할 때 주기적으로 한 걸음 떨어져서 객관적 시각으로 서비스를 바라보는 여유를 가져야겠다고 생각했다.

아쉬운 점

  1. 로컬 노티피케이션의 한계
    메신저라는 컨셉에 충실할 수 있도록 카카오톡처럼 알림의 아이콘을 프로필 아바타 이미지로 하고 싶었다. 카카오톡이 하고 있으니까 방법이 있을 것이라고 생각해서 찾아보았고, 해당 기능을 추가하였다. 그런데 추가한 메소드(알림이 들어오면 이를 가로채고 아이콘을 변경하여서 알림을 보내는 메소드)가 호출되지 않았다. 호출이 되지 않는다는 건 단순히 내가 개발을 잘못해서가 아닌 것 같아서, 관련 내용을 찾아보니 해당 기능은 remote notification에서만 사용할 수 있다는 사실을 알게 되었다. 즉, 서버를 통해서 전송된 알림의 아이콘만 변경할 수 있었다. 아차차는 서버리스 앱이었기 때문에 local notification을 사용하고 있었고, 아이콘을 바꾸는 기능은 현재로서는 구현이 불가한 영역이었다.

  2. 시간 제약에 따른 디테일 요소 생략
    스스로 출시 예정일을 정해두고 작업을 했기 때문에, 이를 지키기 위해서 타협해야 하는 디테일 요소들이 생겼다. 예를 들어, 목록에서 Swipe 동작으로 삭제하는 기능을 제공하고 싶었는데 이를 구현하지 못했다. UITableView라는 리스트뷰를 사용하면 기본 제공 동작으로 쉽게 구현할 수 있었으나, 나는 UICollectionView라는 타입의 리스트뷰를 사용하였다. 이를 깨달았을 때는 뷰 전체를 변경하기에 시간이 모자랄 것 같았다. 결국 이런 기능들은 구현이 불가능한 영역은 아니지만, 제한적인 시간에 따라서 포기할 수밖에 없었다. 이후 버그 픽스나 기능 추가 업데이트를 하면서 조금씩 수정하는 중이다.

  3. 시뮬레이터 테스트로 늦은 이슈 파악
    오랜만에 회사 맥북이 아닌, 개인 맥북으로 작업을 하다 보니 인증서나 애플 개발자 계정 관련된 세팅들이 만료되어있었다. 이에 따라서 실제 기기 빌드가 안 되는 상태였는데, 사실 개발을 할 때는 문제가 없었다. 테스트는 Xcode 내 시뮬레이터로 테스트를 하면 되었기 때문이다.
    그렇게 작업을 한 후, 출시를 위해 세팅을 갱신하고 실제 기기에서 테스트를 해보았다. iPhone의 경우 물리키(뒤로 가기 버튼, 홈 버튼 등)가 없기 때문에 키보드를 올리고 내리는 동작에 대해서 기본 제공되는 부분이 거의 없다고 보면 된다. (배경 탭이나 버튼을 눌러서 키보드 내리기, 키보드가 올라가거나 내려가면 그에 맞게 화면 UI 변경 등을 모두 코드로 작성해야 한다.) 이에 따라서 출시 직전 실제 기기 테스트에서 키보드 관련 Major 이슈들이 왕창 나오게 되었다. 시뮬레이터에서도 키보드를 올리고 내릴 수 있기 때문에 테스트를 하긴 했지만, 실제 기기와 차이가 있어서 놓치는 부분이 생각보다 많이 나왔던 것 같다. 다음 프로젝트에서는 가능하다면 초기부터 실제 기기에서 테스트를 해야 겠다고 생각했다.

  4. 출시를 위한 마켓 설정
    몇 년 만에 새로운 앱을 출시하다 보니 앱스토어 마켓 설정 관련해서 헷갈리는 부분이 굉장히 많았다. 개인정보 처리방침 URL, 마케팅 URL, 지원 URL이 각각 뭘 의미하는지(왜 필요했는지) 기억이 나지 않았고, 수집 데이터 정보 등도 어떻게 설정해야 하는지 헤맸다. 앞으로도 가끔씩은 앱을 출시할 것 같으니 이 기회에 이번에 헷갈렸던 부분들을 블로그에 조금 정리를 해둘 예정이다. (회고 작성이 끝나면 관련 내용도 작성하지 않을까 싶다.)

느낀 점

가장 많이 느낀 점은 유저의 의견을 꼭 들어봐야 한다 였다.
주변 사람들에게 어떤 앱을 출시했는지 공개하면 QA를 많이 해줄 것 같은데, 솔직히 이번에는 안정성에 대한 자신이 없어서 당분간은 앱 이름을 공개하지 않으려고 했었다. 그런데 막상 공개했을 때, 정말 수정이 필요한 주요 이슈를 찾아주었고, 미처 생각하지 못했던 좋은 의견들을 많이 내주었다. 나에게 너무 당연한 동선이라서 이상함을 못 느꼈던 부분들이 헷갈린다고 해서 급하게 고치기도 했다. 학교 다닐 때 들었던 ‘사용자 연구’ 수업이 많이 생각났었다. 사람들 몇 명 모집해서 Think Aloud 기법으로 사용자 조사 한 번 진행하면 좋은 인사이트가 많이 나올 것 같았다.
하여튼 시간적 여건이 되지 않아서 사용자 조사까지는 하지 않았지만, 주변 유저들의 의견을 들으면서 버전 패치를 할 수 있었다. 주변에 이런 의견을 내어 주는 사람들이 많다는 것도 행운이라고 느꼈다.
추가로, 융합콘텐츠학과에서 여러 분야을 배운 것이 물론 단점도 있기는 했지만, 혼자서 앱을 기획하고 디자인하고 개발할 수 있는 능력을 갖출 수 있다는 큰 장점이 있는 것 같다. 주변에 워낙 뛰어난 사람들이 많아서 내가 가진 기획/디자인 능력이 그렇게 특별하다고 생각하지는 않았었는데, 이 정도의 능력과 추진력을 가진 것은 나의 큰 차별점이라는 걸 체감하였다.


Table of contents