7 min read

파이썬과 DDD로 라이프 캘린더 만들기 #1 제품 기획

파이썬으로 서버 앱을 만들어 오면서, 파이썬 커뮤니티에는 서버 앱을 만드는 일반적이고 전형적인 프랙티스 같은게 존재하지 않는 것 같다는 느낌을 많이 받았습니다. 물론 이런 자유로움이 주는 장점도 있지만, 더 좋은 앱을 만들기 위한 개발자들의 많은 고민에 비해 지식과 경험이 파편화 되는 일이 빈번하게 일어난다고 생각했습니다. 같은 문제를 팀 마다 전혀 다른 형태로 풀어내는 일도 많았습니다.

그렇게 베스트 프랙티스를 찾는 여정을 계속하던 와중, 객체지향 프로그래밍이나 도메인 주도 설계(DDD) 같은 개념들이 눈에 띄었고, 이 개념들로부터 좋은 프랙티스를 정립하는데 어느정도 큰 도움을 받을 수 있을거라는 믿음을 가지게 되었습니다. 물론 이 개념들이 모든 문제에 대한 최고의 해결책일 수는 없겠지만, 최소한 복잡한 비즈니스 로직을 다뤄야 하는 작업에 대해서는 중요하게 참고할 만한 지식이 된다고 판단했습니다. 이를 구현하는 과정에서의 제 나름의 고민과 기준을 결정해 왔고, 이것을 다른 개발자에게도 공유하고 또 피드백을 받고 싶다는 생각을 하고 있습니다. 제 고민이 또다른 '파편화 조각'이 되지 않기를 희망하면서 말이죠!

이 시리즈는 어떤 TED 강의 영상으로부터 떠오른 가상의 문제를 설정합니다. 그리고 이를 해결하는 기획 즉 '라이프 캘린더 앱 만들기'를 만들고, 그에 따른 파이썬 서버 앱의 개발 과정을 묘사해 보겠습니다. 제가 가장 많이 참고한 자료는, 마이크로소프트가 만든 닷넷 마이크로 서비스 아키텍쳐 가이드입니다. 이 가이드의 세부 내용을 앞으로도 자주 언급할 예정입니다. 가이드를 참고하면서 제가 했던 고민과 결정들도 최대한 자세히 풀어보겠습니다. 피드백이 있으시면 언제든 부탁드립니다. 댓글을 남겨주셔도 좋고 우상단의 개인 디스코드 서버로 접속해주셔도 좋습니다.

문제 의식과 제품의 목적

우리의 문제는 말했듯 아래의 TED 영상으로부터 시작합니다. 영상 자체가 재미있으니 시청해보시면 좋을 것 같습니다!

강연의 연사는 삶에서 중요한 일을 자꾸만 미루는 문제에 대해서 고민이 많았습니다. '마감일이 있는 급한 일'은 그 마감일에 맞춰 어떻게든 완수할 수 있지만, '마감일은 없지만 인생에서 중요한 일'은 자꾸만 우선순위에서 밀렸습니다. 그래서 그에게는 다음과 같은 목적을 달성하기 위한 도구가 필요했습니다.

  1. 삶 전체를 한눈에 조망하기
  2. 나에게 남은 시간이 생각보다는 많지 않다는 것을 깨닫게 하기
  3. 그래서 내 삶에서 가장 중요한 일을 미루지 않고, 그 일에 시간을 집중할 수 있게 하기

연사는 이 목적을 어떻게 달성할 수 있을지 고민하기 시작했습니다.

세부 기획과 요구사항 정의

기획자(연사)는 많은 고민 끝에, '라이프 캘린더'라는 이름의 가로는 1년 52주, 세로는 수명으로 이루어진 주(week) 매트릭스를 기획했습니다. 그가 기획한 라이프 캘린더는 다음과 같은 모습이었습니다.

기획자는 이 정도의 아이디어만 가진 채로 평소 친하게 지내던 개발자를 찾아왔습니다. 기획자는 제일 먼저 자기가 겪고 있는 문제 의식을 설명하고 개발자가 이런 문제에 얼마나 공감하는지 물었습니다. 다행히도 개발자는 기획자의 문제 의식에 크게 공감했습니다(운이 좋았습니다). 둘은 그러고 나서야 기획과 요구사항을 구체적으로 정의하기 위한 이야기를 시작했습니다.

여기서부터가 DDD의 시작이 될 것 같습니다. DDD의 핵심은 비즈니스와 코드를 최대한 일치시키는 것입니다. 그러려면 용어를 통일(유비쿼터스 언어)하고 비즈니스와 기획의 맥락을 정확히 파악해야 합니다. 즉, 좋은 코드를 작성하기 위해서는 인간이 겪고 있는 문제와 그 해결책에 대한 생각의 과정을 이해하는 능력이 중요하다고 할 수 있습니다.

둘(기획자와 개발자)은 빠른 논의 끝에 일단 아래와 같이 정리했습니다.

  • 위 페이지의 주 매트릭스(matrix)를 포함하는 개념을 캘린더(calendar)라고 한다.
  • 캘린더는 아이디(id), 이름(name), 생년월일(birthday), 예상 수명(lifespan)을 포함해야 한다.
  • 캘린더 안에는 연도(year) 개념이 있다.
  • 연도는 캘린더마다 (예상 수명 + 1)개 존재한다.
  • 연도 안에는 주(week) 개념이 있다.
  • 주는 연도마다 52개 존재한다.
  • 유저는 캘린더를 생성할 수 있다.
  • 캘린더를 생성하기 위해서는 캘린더의 이름, 생년월일, 예상 수명이 필요하다.
  • 생성된 캘린더의 이름, 생년월일, 예상 수명은 언제든 수정할 수 있다.
  • 캘린더를 상세 조회하면 생년월일부터 수명에 따른 죽음까지의 주 매트릭스(가로 52주 X 세로 수명)를 보여준다.
  • 주 매트릭스에서는 과거(past) 주, 이번(now) 주, 미래(future) 주를 각각 다른 색으로 표시한다.

이제 막 기획한 제품이다 보니 생각보다 내용이 별로 없네요. 물론 스크린샷을 자세히 살펴보면 뭔가 기능이 더 있는 것 같지만, 지금은 일단 무시합시다. 실은 저 스크린샷은 제가 엘릭서와 피닉스 라이브뷰를 학습하기 위해 깔짝거리면서 만들고 있는 앱의 일부입니다만 ㅋㅋㅋ 여기서는 그냥 넘어갑시다...

그럼 이제 준비는 끝났으니 다음 글에서 본격적으로 개발을 시작해 보겠습니다.