아이폰이든 안드로이드폰이든, 스마트폰용 어플리케이션 개발은 나 같은 개인 개발자에게 무척이나 즐겁고 유쾌한 경험이다. 데스크탑용 어플리케이션을 개발한다고 하면 그것의 기획부터 판매에 이르는 전 과정을 혼자서 감당하기란 거의 불가능하지만 스마트폰 영역에서만큼은 누구나 '람보'가 될 수 있기 때문이다.

나는 이 글을 통해 ProMan - 프로젝트(일정) 관리 어플이 어떻게 기획되었고, 어떤 과정을 거쳐서 개발되었는지. 그 과정에서 어떤 일들이 일어났는지 조금은 상세하게 적어보려 한다. 글을 읽는 당신에게는 유익한 정보로 다가갈 수도 있고, '나는 저러지 말아야지' 하는 안티패턴의 하나가 될 수도 있다. 어느 쪽이든 분명 도움이 될 거라 생각한다.


개발 프로세스

개발 프로세스의 중요성은 이론이 알려주는 장점에 비해 실감하기가 어렵다. 그리고 이론이 말하는 개발 프로세스는 굉장히 어렵고 복잡하게만 느껴진다. 하지만 자신에게 적합하게 이론을 축소하고 변형해 적용하면 전체 개발 기간 동안 개발자가 이리저리 헤매는 것을 방지해주기 때문에 개발 프로세스는 매우 중요하다.

내 경우 개발 프로세스는 기획-(설계-구현-검증)-배포 단계로 구성된다. 괄호 안의 프로세스들은 주기적으로 반복되는데 시간이 지남에 따라 그 주기는 자연스럽게 줄어든다. 왜냐하면 주기가 반복될수록 설계가 탄탄해지고 구현해야 할 분량이 적어지기 때문이다.


기획

어떤 어플리케이션을 만들지 그 목적을 분명히 하는 과정이 기획이다. 단순히 '누군가에게 도움이 되는 어플' 따위는 기획이라고 볼 수 없다. ProMan을 만들면서 나는 다음과 같이 구체적인 목적을 정의했다. 

다수의 프로젝트나 일정이 동시에 진행되는 상황에서 각각의 진행 상황을 한 눈에 살펴볼 수 있고, 각 프로젝트의 세부 일정들에 대해서 그 진행 상황을 모니터링 할 수 있는 어플리케이션

기획은 어플리케이션의 목적을 분명하게 함과 동시에 '구현하지 말아야 할 기능' 도 명확하게 제시할 수 있어야 한다. 개발자는 늘 욕심이 과해서 개발 과정에서 습득한 지식을 기반으로 새로운 기능을 만들어내려는 성질이 있다. 이 성질을 잘 다루지 못하면 개발 기간이 무한대로 연장되는 최악의 상황이 발생한다. 

이러한 문제를 회피하는 가장 좋은 방법은 목적을 최대한 구체적으로 정의하고, 어플리케이션의 기능을 단계별로 분류하는 것이다. 스마트폰 어플은 업데이트가 매우 용이하다. 따라서 최소한의 기본 기능으로 배포한 뒤 업데이트를 통해 기능을 하나씩 추가하는 것이 좋은 선택이 될 수 있다. 또한 이렇게 하면 사용자에게 '이 어플은 개발자가 지속적으로 관심을 갖고 개선시키고 있구나' 하는 인상을 심어줄 수도 있다.

ProMan의 경우 1.0 버전에서 밀린 기능들은 다음과 같다.

  • 가로모드 지원
  • 티켓을 다른 마일스톤으로 옮기기
  • Local Notification을 활용한 알림 기능 구현
  • iCalendar 연동
  • 태그 및 관련 인물 지정
  • 다른 사람과 마일스톤/티켓 공유
  • 백업 및 복구 지원
  • SNS 연계

위의 기능들은 ProMan의 핵심 목적이 아닌 부가적인 편의를 제공한다. 게다가 일부는 내게 많은 학습과 구현 시간을 요구한다. 그렇기 때문에 ProMan 첫 배포 버전에서는 제외시켰다. 이 기능들을 모두 머릿속에 담고서 개발을 진행하면 쓸데없이 소스 코드가 복잡해지거나 '언젠가 쓰겠지' 하는 불필요한 코드를 남발하게 된다. 이는 버그의 원인이 될뿐더러 어플리케이션의 퍼포먼스를 떨어뜨리고 복잡도를 증가시키는 무시무시한 결과로 이어진다.


설계

설계 과정에서 제일 먼저 해야 할 일은 연습장(또는 이면지)을 꺼내놓고 최종 어플리케이션의 모습을 그려보는 것이다. 이 그림을 통해 어플리케이션이 사용자와 어떻게 상호작용하는지, 어떤 부분이 애매모호하게 다가갈지 예측할 수 있다. (안타깝게도 나는 많은 그림을 그렸지만 지난 주말 청소할 때 다 갖다 버렸다)

그림이 어느 정도 명확해졌으면 이제 관련 기술을 학습할 차례다. 다짜고짜 바로 코딩으로 들어가지 말 것! 하나부터 열까지 모든 것을 내 손으로 구현하겠다는 욕심은 버려야 한다. 세상에는 나와 같은 고민을 하는 개발자가 수 천명에 이른다. 따라서 가장 먼저 해야 할 일은 구글링이다. 혹시 내가 하려는 것과 비슷한 것을 구현한 소스 코드는 없는가? 오픈 소스로 제공되는 라이브러리들은 어떤 것들이 있는가? 이런 것들을 충분히 찾아보고 검토해야 한다. 뿐만 아니라 필요한 기술에 대한 학습도 이 단계에서 병행 되어야 한다. 그래야만 제대로 된 설계가 가능해진다.

ProMan의 경우 마일스톤이나 티켓과 같은 정보를 저장하고 관리하는 기능이 필요했다. 파일 시스템을 써서 내 나름의 포맷으로 저장하는 자료 구조를 만드는 것도 하나의 방법이지만 그보다는 데이터베이스를 사용하는 것이 훨씬 효과적이라는 판단이 섰다. 그러나 저수준 SQL 쿼리를 사용하는 것은 내게 조금 위험하게 다가왔다. SQL을 올바르게 사용할 자신이 없었고 싱크를 단 한 번이라도 잘못 맞추면 전체 데이터의 일관성이 깨질 것이 분명했기 때문이다. (일관성이 깨지면 그 동안 저장한 데이터가 한 번에 날아가는 경험을 검증 과정에서 한 차례 겪었다)

'나만 이런 고민을 하는 게 아니다.'

제일 먼저 아이폰 개발자 센터를 찾았다. 거기에는 아이폰 개발 문서들이 수십여 개가 링크되어 있는데 그 중 CoreData가 눈에 띄었다. 이게 바로 내가 찾던 거다. 저수준 데이터베이스 접근을 추상화하고 일관성을 자동으로 유지시켜주는 궁극의 프레임워크. 이것을 학습 한 후 ProMan 설계에 이 기술을 반영했다.

또 하나의 고민은 데이터 입력을 위한 뷰를 어떻게 설계하는가 였다. 마일스톤과 티켓은 제목과 상세 설명, 기간, 중요도, 첨부 사진 등 다양한 정보를 요구한다. 이 정보들을 어떻게 입력해야 사용자가 불편함을 느끼지 않고 쉽게 접근할 수 있을까?

이미 설치되어 있는 다른 어플리케이션들, 특히 아이폰 기본 앱부터 하나씩 살펴봤다. 우선 메일 어플을 보았더니 내가 원하는 UI와는 조금 거리가 멀었다. 그 다음으로 확인한 것은 2Do Lite 어플. 하지만 이 역시도 나는 마음에 들지 않았다. 나는 어떤 내용을 입력할 때, 그 내용에만 집중할 수 있기를 희망했다. 세 번째로 확인한 Momento 어플이 내가 찾던 UI를 보여주고 있었다.

왼쪽부터 메일, 2Do Lite, Momento


이러한 UI는 어떻게 구현해야 하는가? 구현할 방법도 모르는 상태에서 설계란 불가능하다. 그러므로 개발 프로세스에서 잠시 빠져나와 'Momento와 비슷한 입력 UI 만들기' 라는 목적으로 프로토타이핑을 시작했다. 프로토타이핑의 목적은 간단한다. 그러한 기능을 구현하는 방법을 찾고 유용성을 검토하는 것이다. 따라서 프로토타입의 품질에는 전혀 신경을 쓸 필요가 없고, 오직 구현 방법 및 가능성, 그리고 그것의 유용성에만 집중해야 한다. 프로토타입을 통해 구현 방법을 터득한 후 다시 개발 프로세스로 돌아와 설계에 반영시켰다. 최종 구현된 ProMan의 마일스톤/티켓 입력 UI는 다음과 같다.

티켓 입력을 위한 UI - 글쓰기, 기간 입력, 중요도, 첨부 사진



구현

설계대로 구현이 되면 오죽 좋겠냐 마는 실상은 그렇지 않다. 경험이 많은 개발자라면 이미 설계 단계에서 걸러냈겠지만 경험이 부족한 나로서는 구현 과정에서 오만 가지 시행 착오를 겪을 수 밖에 없었다. 

구현 과정에서 문제가 발생하면 문제의 규모를 먼저 파악해야 한다. 만약 이 문제를 해결하는 방법이 전혀 없거나 설계에 큰 영향을 미칠 정도라면 구현을 잠시 멈추고 설계를 들여다봐야 한다. 어떻게든 해결되겠지... 하는 마음 가짐은 여기서 전혀 도움이 되지 않는다. 괜히 개발 기간만 늘릴 뿐이고, 그렇게 기간이 늘어나기 시작하면 대부분의 프로젝트는 실패한다. 

만약 문제를 해결하는 방법은 모르겠지만 이것 때문에 설계가 틀어질 일은 없겠다 싶은 확신이 들면 문제 해결을 감행한다. 개발자는 이 과정을 통해 학습하고 진화한다. 이 때 구글링이 크게 도움이 되는 데 질문의 키워드는 반드시 영어로 할 것! 아까도 말했지만 나와 같은 고민을 하는 개발자들은 전세계에 수 천명에 이른다. 하지만 수 천명 가운데 한국인은 매우 드물다. 

구현 과정에서 주의해야 할 점은, 한 번에 모든 기능을 전부 다 구현하려고 하면 안 된다는 것이다. 반드시 한 번에 한 가지 기능만 구현하고 바로 검증 과정으로 넘어갈 것! 한 번에 모든 기능을 구현해 놓고 검증 과정으로 넘어갔다가 어떤 문제가 발생하면 그게 어디서 발생한 문제인지 찾기가 매우 어려울뿐더러 그 문제를 해결하는 과정에서 다른 기능에 문제가 생길 수 있다. 따라서 반드시 한 번에 한 가지 기능만 구현하고 검증 과정으로 넘어가야 한다. (그리고 이것은 자연스럽게 기능의 모듈화로 이어진다)


검증

전 단계에서 구현된 기능을 오만 가지 형태로 검증한다. 최종 사용자는 아이폰에 대한 지식이 천차만별이고, 사용 방법도 가지각색이라 정말 오만 가지 방법으로 그 기능을 테스트해 보아야 한다.

만약 검증 과정에서 문제가 발생했으면 바로 고치지 말고 잠깐 고민하자. 이 문제는 어쩌면 설계를 바꾸는 것이 더 나을 수도 있다. 그렇다면 설계 과정으로 되돌아와 설계를 고쳐야 한다. 문제가 설계에 영향을 미치지 않는 단순한 버그라면 그 자리에서 고치고 다시 검증하자. 이 때 검증은 아까 했던 검증 과정을 처음부터 다시 반복해야 한다. 개발자의 능력이 다소 부족한 경우, 한 부분의 코드를 고치는 순간 그 파급력으로 인해 다른 부분에 문제를 발생시킬 수 있기 때문이다. (물론 능력 있는 개발자가 개발한 코드 역시 이 문제에서 완전히 해방된 것은 아니다) 그러므로 버그를 수정한 다음에는 반드시 모든 검증 과정을 다시 거쳐야 한다. 자동화된 테스트를 수행할 수 있으면 금상첨화! 그럴 수 없다면 그냥 몸으로 때우자.

하나의 기능에 대해 설계-구현-검증 과정을 거치면 그 다음 기능 구현을 위해 다시 이 과정을 반복한다. 반복의 끝은 이번 버전에서 구현하고자 한 모든 기능이 구현되고 검증된 경우이다. 그리고 나면 이제 배포를 준비할 때이다.


배포

배포 과정은 특별히 주의할 것은 누구에게 배포할 것인가이다. 앱스토어는 기본적으로 전세계 모든 앱스토어 사용자를 대상으로 한다. 안되는 영어라도 쥐어짜서 영어로 설명하는 편이 한글로만 설명한 것보다 더 나은 결과로 이어질 수 있다. 

ProMan은 아이폰용 어플이므로 앱스토어에 등록했다. 등록 과정에서 한글 설명을 첨부하고 영어권 지역에 대한 지역화를 설정해서 영어 설명을 추가했다. 그러나 결과적으로는 미국 앱스토어에서만 영어로 보이고 그 외의 지역에서는 모두 한글로 설명이 나오는 불상사가 발생! 그래서 한글 설명 앞에 간단하게 영어 설명을 덧붙였다. (Ready for Sale 상태에서는 지역화 설명을 추가하는 것이 불가능하다. 업데이트 버전을 등록해서 다시 In Review 상태가 되면 추가할 수 있다)

앱스토어에 어플을 등록하면 며칠 뒤 In Review 상태가 되고 1주일 정도 애플 측의 검증 과정을 거친 후 문제가 없으면 Ready for Sale 상태가 된다. 내가 처음으로 만들었던 아이폰용 무료사전 어플인 QuickDic의 경우 애플측에서 두 차례 거절했다. 많은 인터넷 기사에서 '특별한 이유 없이 거절하는 애플' 이라고 언급하는데 실제로는 애플에서 굉장히 친절한 메일을 보낸다. '리뷰 과정에서 이러한 문제를 발견했습니다. 이 문제를 해결하기 위해서는 다음의 링크에 있는 문서들이 도움이 될 겁니다' 식의 메일이 온 것이다. 다행히 ProMan은 한 번에 승인되었다.



여담

나는 아이폰 어플 개발로 생업을 이어가는 사람이 아니기 때문에 앱 개발에 투자할 수 있는 시간이 제한적이다. ProMan의 경우 하루에 3~4시간 정도 투자할 수 있었고 그나마도 바쁜 일정이 겹치면 잠시 중단할 수 밖에 없었다. 하지만 명확한 개발 목표와 자신만의 개발 프로세스가 있으면 한동안 중단된 개발을 다시 시작할 때 부담이 적다. 그렇지 않다면 '어디까지 했더라? 뭐 하려고 했더라?' 는 질문에 답하느라 많은 시간을 허비하게 될 것이다. 그렇게 허비하는 시간이 길어질수록 프로젝트가 실패할 확률은 급격이 증가한다.



  1. 박재오 2010.10.20 21:41 ADDRESS | MODIFY/DELETE | REPLY

    프로맨을 친구아이폰에 다운받았습니다. 전 안드로이드 개발을 하고 있어서 구글클라우드 서비스와 연동되는 업무관리 어플을 만드는중에 이글을 보았고 많은 도움이 되고 있습니다. 아마도 전 프로맨을 참고하면서 개발하게 될듯하네요 UI를 고민중이였는데 매우 많은 도움이 되고 있습니다. 블로그 팬이되었습니다. 어찌그리 말씀을 잘하시는지 ㅋㅋ

    • semix2 2010.10.20 21:56 ADDRESS | MODIFY/DELETE

      제 앱이 다른 앱에 참고가 된다고 하니 굉장히 뿌듯하면서도 부끄럽습니다. ^^;; UI 부분은 특히 신경을 많이 썼는데 제 개인적으로는 아주 만족스러운 결과가 나왔지만 제 여친님께서는 아직 아니다- 하네요. 여친님께서 ProMan 개발에 큰 힘이 되어주고 많은 조언을 해주었답니다.

      패...팬이 되어주셔서 고맙습니다!! (부끄부끄)

  2. deVbug 2010.10.20 21:47 ADDRESS | MODIFY/DELETE | REPLY

    잘 봤어요!
    QuickDic의 그런 최후(?)가 참 안타깝군요..

    암튼 궁금한게 있어요.
    프로젝트 관리임에도 다른 팀원과의 연동, 혹은 다른 곳과의 동기화 등 기능은 없는거죠?
    하다못해 백업이라도.. ;ㅁ;..

    • semix2 2010.10.20 21:54 ADDRESS | MODIFY/DELETE

      QuickDic의 최후는 정말 안타까움 그 자체입니다. ㅠㅠ

      기본적으로 ProMan은 개인용 프로젝트 관리 어플입니다. 그래서 팀원간의 협업 프로세스 지원은 초기 버전에서 제외되었습니다. 하지만 '프로젝트 관리' 라는 이름에서 너무나 자연스럽게 협업과 동기화 이슈가 거론되는 만큼 방법을 연구하고 있어요. 아래 분처럼 구글 캘린더 등을 연계하거나 별도의 서버를 두는 방법, 또는 SMS 메시지나 이메일을 통한 방법을 염두해 두고 있습니다. 추후 업데이트를 통해 제공할 예정이에요. (아마도 그 때쯤에는 버전 넘버가 2.0이 되어있을 겁니다)

      백업 기능은 반드시 추가할 예정입니다. XML 형식으로 백업하고 복구하려 하는데 현재 스키마 정의 작업을 진행하고 있습니다. 저 역시 백업/복구의 중요성을 너무나 잘 알고 있기 때문에 조만간 업데이트를 통해 기능을 선보일 예정입니다. ^^

      제가 가장 필요로 했던 어플이기 때문에 지속적으로 기능을 갱신해 나갈 생각이에요. 후후-

    • deVbug 2010.10.21 04:52 ADDRESS | MODIFY/DELETE

      덕분에 제 삶을 좀 계획적으로 해볼까하는 의욕이 샘솟네요!
      잘 쓸게요~
      백업이 빨리 완성되길.. ㅎㅎ
      그리고 처음 영감을 준 trac이랑 연동되면 재밌을거 같은데 말입니다.. ㅋㅋ;;

    • semix2 2010.10.21 16:27 ADDRESS | MODIFY/DELETE

      앗! 구매하셨나보네요. 고맙습니다. 몇몇 분께서 처음 사용이 좀 어렵다고 하시더라구요. Trac 시스템에 익숙한 건 저뿐이라는 생각을 좀 더 했어야 했는데;; ㅠㅠ

      어떠한 방법으로든 '연동' 되게끔 연구해 보겠습니다. Trac 시스템은 웹 기반이긴 해도 웹 인터페이스를 노출시키지 않은 듯 해서 당장은 어려울 것 같습니다. 1차적으로 아이폰 캘린더 연계를 고려해보고 있어요. 연구해보고 진행상황을 틈틈이 알려드릴게요. ㅎㅎ

      백업 기능은 조금만 기다려 주세요~ 올 해가 가기 전에 백업 기능은 반드시 완성시키겠습니다! 꺅-

  3. 티몰스 2010.10.20 22:58 ADDRESS | MODIFY/DELETE | REPLY

    깨알같은 글들 잘 읽어보았습니다. 저의 꼬여버린 자기자신만의 개발프로세스에 많은 충격과 공포를 심게 되었고, 많이 배웠습니다^^

    이렇게 빠르게 피드백이 올지는 생각 못했었는데 정말로 감사합니다. 작은 도움이 아니라 매우 큰 도움이 되었습니다 ^^

    자주 놀러오겠습니다. 감사합니다!

    • semix2 2010.10.21 16:19 ADDRESS | MODIFY/DELETE

      ^^ 제가 워낙 게을러서 생각 났을 때 글을 쓰지 않으면 계속해서 안 쓰게 되요; 그래서 바로 써 버렸습니다. ㅎㅎ

      저는 전문적으로 기획을 배운 적이 없는데다가 어플리케이션을 많이 개발한 것도 아니기 때문에 위의 방법이 결코 정답일 수는 없습니다. 단지 이번 경험을 통해 많은 시행착오를 겪었고, 그렇게 해서 터득한 것들을 공유하고자 부끄럽지만 몇 자 적었습니다.

      제 경험이 도움이 되었다니 정말 다행입니다. 저와 같은 실수를 범하지 않고 더 나은 방향으로 좋은 어플리케이션 많이 개발하길 바랍니다. ^^ 좋게 읽어주셔서 정말 고맙습니다-

  4. huemoi 2010.10.21 13:30 ADDRESS | MODIFY/DELETE | REPLY

    개발자 믿고 구매를 결정한 경우는 처음입니다.
    좋은 글 잘 봤습니다.

    구매하려고 봤더니 제 os 버전은 지원하지 않더라구요
    집에가서 바로 설치해보겠습니다~
    꾸준한 업데이트 부탁드립니다^^

    • semix2 2010.10.21 16:22 ADDRESS | MODIFY/DELETE

      고.. 고맙습니다!! 그저께까지 한국 앱스토어 판매량이 제로였는데 이 글을 계기로 하나 둘 생겨나네요. 외국인들만 구매한 덕에 조금은 마음의 부담이 적었었는데 (못된 심보) 국내 사용자가 생겨나면서 부담이 커지고 있습니다. ^^ 더 열심히 해야 겠다는 마음이 불끈불끈 샘솟네요.

      업데이트는 빠르게 진행될 거란 보장은 어렵지만 꾸준히 진행할 거라고는 장담할 수 있습니다. 자주 사용해주시고 문제나 개선사항 등이 있으면 알려주세요. 꼭 반영시켜서 마음에 쏙 드는 앱이 되게 열심히 노력하겠습니다!!

    • huemoi 2010.10.22 11:58 ADDRESS | MODIFY/DELETE

      오늘 이 어플 때문에 4.1로 업데이트 후 어플을 다운 받았습니다. 지금까지는 만족스럽습니다. 컨텐츠와 기본이 탄탄한 어플 같으니 꼭 필요한 기능만 조금씩 보완하면 잘 나가는 어플이 될 것 같습니다^^

      아참 그리고 백업 기능은 꼭 필요한 기능 같은데 언제쯤 추가 될 수 있을까요?

    • semix2 2010.10.22 12:35 ADDRESS | MODIFY/DELETE

      백업 기능은 현재 설계 중에 있습니다. 구현에는 1~2주 가량 걸릴 것으로 예상되는데요, 그렇게 만들어진 업데이트를 앱스토어에서 승인하는데 또 1~2주 가량 소요됩니다. (앱스토어 승인 과정이 좀 까탈스럽고 오래걸려요;;) 11월 중에는 백업/복구 기능의 업데이트를 받아 보실 수 있을겁니다. ^^

CATEGORIES