프로젝트 개발 101

여기, 시스템 하나 주문이요~”

당신은 어플리케이션을 처음부터 만들어 본 적이 있는가?

고객에게 시스템을 주문 받았을 때 가장 먼저 무엇부터 시작했는가?

딱 1년전,

나는 아래와 같은 시스템 주문서(?)를 받았다.

AI 연구교육 시스템을 만들고 싶어요
우리가 만들 시스템의 주요 대상은 학생들이고 주로 PC를 이용해서 사용할 겁니다
각 전공별로 과정이 수행되야하고 수행 프로젝트 가 이력으로 남아야합니다
국내 활성화 이후에는 해외시장까지 고려해야하구요. …

주문서를 받았을 때 사실 어디서부터 시작해야 할지 난감했다.

어플리케이션을 처음부터 만들어 본적이 없었고 예전부터 사용하던 언어(Java)를 벗어나야겠다는 생각만 했지 막상 어떤 언어를 선택할지는 정하지 못하고 있었다. 총.체.적.난.국. 이었지만 프로젝트를 여러번 이끌어 보신 PM분과 내가 합류하기 전부터 이미 많은 산출물들을 만들며 아이디어를 구체화 하고 있던 기획자 분이 있어 한 단계씩 시작할 수 있었다.




1) 다른 사이트는 어떻게 만들어졌나?

만들어야 할 사이트는 큰 분류에서 학습플랫폼, LMS (학습관리시스템 : Learning Management System) 였다. 그래서 다른 학습 플랫폼을 찾아보고 해당 사이트들이 어떤 기술로 만들어졌는지 조사부터 시작했다. 사이트를 구성하는 기술이 해당 사이트 기술블로그에 나와있기도 했지만 이런 경우는 극히 일부이고 대부분의 사이트에선 사용한 기술을 찾을 수 없었다.

내가 주로 참고한 사이트는 각 회사들이 사용하는 기술스택을 깔끔하게 정리해 놓은 stackshare 이다.

Trulli
stackshare Udemy 페이지

stackshare 에서 Udemy를 검색했을 때 나오는 화면이다. Udemy는 jQuery, Python, React, CloudFlare, MySQL, Bootstrap, AmgularJS, Redis, Django, Memcached, Celery, Fastly, MobX 를 사용한다. 이런 식으로 Coursera, Codecademy, Khan Academy, edX 와 같은 학습 플랫폼의 기술스택도 찾아보았다. 이 작업을 통해 주로 사용되는 언어와 프레임워크에 대한 흐름을 살펴 볼 수 있었다.




2) 우리 사이트는 어떻게 만들것인가?

조사한 정보를 바탕으로 어플리케이션에서 사용할 기술스택 선택지를 작성했고 아래와 같았다.

기술스택을 선택함에 있어서 가장 많이 참고했던 자료는 스타트업을 위한 기술 스택 사이트였다.

서버 언어/ 프레임워크

Python-Django

단점이 적고 짧은 시간에 학습할 수 있음, 다만 Python에 대한 높은 이해도가 필요하고 한글 문서가 풍부한편은 아님. Coursera, Udemy 에서 사용 중이며 대표적인 성공사례로는 Instagram이 있다

데이터베이스

MySQL 쿼리튜닝만으로도 어느정도 부하는 견딜수 있기에 NoSQL보다는 RDBMS 선택. MySQL은 널리쓰이기도 하고 레퍼런스가 많음

서버배치

OS리눅스/ 우분투

제일 관리하기 편한 배포판.

웹서버 및 AP서버

Nginx

기존에는 Apache, Jetty를 주로사용했으나 Nginx를 찾아서 비교해보니 모든 IO들을 전부 Event Listener로 미루기 때문에 메모리적인 측면에서 시스템 리소스를 적게 처리한다는 장점. 높은 성능

CDN

Amazon CloudFront

예전 사용해봤던 것은 akamai이나 사용자 수로는 단순비교가 힘들고, 속도와 AWS서비스와의 호환성 그리고 Global 장점 고려. 높은 성능

메시지 큐

Celery

비동기 처리작업. 파이썬, Django 호환.

호스팅

AWS

비용문제가 있긴한데 초기에는 AWS를 사용하다가 국내 호스팅업체로 옮기는 것도 하나의 방법이 될 수 있다

서버 configuration & 자동화

Fabric은 가장 간단하고 쉽다

CI tool

Jenkins

사용해본 경험이 있는 툴이기도 하고 무료, 레퍼런스 및 사용자가 많음

서버운영

모니터링

New Relic, 쉽다

Failover

데이터베이스 주기적백업. 백업주기는 초기에 하루 한번으로 하다가 트랜잭션 늘어남에 따라 점차 늘려서 1시간에 1번까지로 늘려나감. 단순백업보다 더 나은 방법은 데이터베이스 redo log를 통해서 특정시점 재현, MySQL경우 Point-in-Time Recovery Using the Binary Log 제공

로그분석

Google Analytics, 무료, 쉬운 셋업, 시각화.

정리된 기술 스택이 실제 제품을 만들때 그대로 사용되지는 않았지만 일련의 작업들을 통해 전체 아키텍쳐를 머릿속에 그려보고 기술의 장단점과 기술의 조합들을 고려하게 되었다. 기술 스택에서 가장 중요한 부분은 아무래도 서버언어/프레임워크 와 프론트언어의 선택일 것인데 이 부분은 Back-end/ Front-end 개발자의 입김이 많이 작용했다.

Back-end 를 담당한 나의 경우에는 Python을 사용해보고 싶기도 했고 Python에서 나온 웹 프레임워크인 Django를 선택하게 되었다. Front-end 개발자는 개인의 선호로 역시 React를 선택했다.

언어를 선택하고 나면 언어와의 호환성을 가장 먼저 놓고 데이터베이스와 서버배치/ 운영을 고려하게 된다.




3) 설계도를 그려보자

기술스택을 선택함과 동시에 어떤 기능들을 만들지 밑그림을 그려야했다. 서비스 상세기획은 IA (Information Architecture) 설계와 화면정의서, 스토리 보드 작성을 해야했고 다행히도 기획자분들이 많은 작업을 미리 해두셨다. 이러한 산출물들을 꼼꼼히 읽고 LMS의 주요 기능들을 어떤 방식으로 구현할지 고민하며 아키텍쳐 설계에 집중했다.

웹기획 관련해서는 야메군 사이트의 웹기획가이드를 추천한다.

사내에 놀고 있는 서버가 몇 대 있어 처음에는 사내 서버를 활용하기 위해 서버 네트워크 구성도까지 작성했지만 결국에는 클라우드를 사용해 개발하기로 결정했다.

위 작업들이 끝나면 설계의 핵심인 DB설계를 해야하는데 DB설계는 왕도가 없는 것 같다. 만드려는 기능들을 계속 고민하면서 설계해야했다. DB설계시에 활용했던 툴은 draw.io, Git 이나 구글 드라이브와 연동해서 저장할 수 있고 무엇보다 무료라 사용하기에 부담이 없다.

Trulli
http://draw.io 사이트

DB설계와 한 축으로 전체 프로젝트의 WBS(Work Breakdown structure) 를 작성하는데 많은 시간이 들었다. 개발해야 할 전체 기능을 정리하고 완료 일정에 맞춰 담당자를 지정하고 계획을 세우는 작업이었다. 사실 WBS를 작성 하면서 알지 못할 계획을 세우는데 이렇게 시간을 많이 소요해야할까 하는 생각이 들기도 했다. 하지만 프로젝트를 진행함에 있어서 현재 어느 정도 와있는지 가늠해보고 확인할 수 있는 이정표 역할을 톡톡히 했다고 생각한다.


Trulli
프로젝트를 진행하며 길을 잃고 싶지않다면 설계에 많은 공을 들이자

DB 설계와 WBS 작성까지 마무리가 되었다면 이제 본격적으로 MVP를 만들 시간이 왔다!


4) MVP를 만들어보자

MVP(최소기능제품 : Minimum Viable Product)

우리 팀에게는 이미 2주 정도 남은 1차 데드라인이 있었다. (??!) 프론트 개발자가 팀에 들어옴과 동시에 바로 MVP 개발을 시작했다.
Django Package 중 컨텐츠를 관리하는 CMS (Content Management System) 를 활용해 학습 자료를 저장하고 조회하는 기능을 구현했다.

시간적 여유가 없어 프론트 단은 HTML로 코드를 구성해서 화면 이동 및 LMS의 메인 화면을 구성했다. 초기에는 개발 서버를 사내 서버 PC를 활용할 생각이었으나 개발 장소에 제약을 두지 말자고 의견을 모으게 되어 클라우드를 활용해 개발을 시작했다.

초기 개발을 시작할때 가성비 좋은 클라우드는 DigitalOcean 이다.

Trulli
DigitalOcean 사이트

60일동안 사용할 수 있는 100 달러 크레딧이 있다보니 잘 활용한다면 요긴하게 사용할 수 있다.

DigitalOcean 은 Droplet 이라 불리는 cloud server를 선택, 원하는 사양의 Database와 static file들을 따로 저장할 수 있는 Space 까지 선택할 수 있다. 기본적인 웹사이트를 구축하는데 부족함은 없었다.

간단하지만 MVP를 만들어보면서 실제 동작하는 프로토 타입을 두고 팀원들과 의견을 나눌 수 있었다. 또한 본격적으로 팀 프로젝트를 시작하기 전에 팀원들끼리 합을 맞춰보는 시간이 되었다.

Trulli
초기 MVP 사이트 화면




5) 제품을 만들어보자

MVP가 만들어졌다면 이제는 새로운 기능 및 수정해야 할 부분의 기획/디자인 ↔ 개발/테스트 의 반복이 아닐까 싶다. 이후 다른 블로그에서 제품을 만들어가는 과정을 상세히 이야기하려고 한다.

시스템 주문서를 받고 7개월 후에 정식 서비스가 오픈되었고 1년이 지난 지금은 사이트가 안정적으로 운영되고 있다. 여러 개의 선택지 중에서 어떤 의사결정을 통해 진행해나가는지 그리고 팀플레이를 함에 있어서 팀빌딩과 사용할 툴을 결정하는 부분이 어려웠고 그 부분들에 대한 이야기를 앞으로 해보려한다.

Trulli
초기 개발팀 애자일 프로세스