카페 창업으로 알아보는 모듈화

Eun Woo Nam
10 min readSep 25, 2023

--

시작하기

프로젝트를 개발하다 보면 코드의 규모가 커져서 유지보수하기 어려워지는 경우가 많습니다. 이러한 문제를 해결하기 위해 모듈화가 등장하게 되었습니다. 모듈화란 프로젝트를 여러 개의 독립된 모듈로 분리하여 개발하는 방법을 말합니다.

모듈화는 소프트웨어 개발에서 중요한 개념이지만, 모듈화를 적용했을때의 장점이 와닿지 않아 중요성을 이해하기 어려울 수 있습니다. 따라서 이번 글에서는 카페 창업과 관련된 비유를 통해 모듈화의 필요성과 적용 시 장점에 대해 알아보겠습니다.

카페 창업

여러분은 이제 카페를 창업하는 사장입니다. 창업 자금이 제한적이지만, 열심히 커피를 만들어서 규모를 점차 확장하고, 결국에는 성공적인 사업가로 거듭나려는 큰 꿈을 품고 있습니다. 처음에는 작은 규모의 카페에서 스스로 모든 업무를 수행하면서 시작할 것입니다. 여러분은 카페 창업을 통해 어떻게 모듈화와 유사한 원리가 작동하는지에 대한 깊은 통찰력을 얻게 될 것입니다. 이제 시작해봅시다.

카페 창업의 초반

처음에는 모든 것을 혼자서 처리해야 합니다. 프랜차이즈 업무와 카페 운영 업무를 모두 동시에 진행하며, 이 모든 업무를 조절하고 효율적으로 운영해야 합니다. 오픈 준비에도 시간이 걸리지만 작은 규모라 손님 수도 적어서 아직까지는 딱히 문제가 없습니다. 시간도 널널하고 평소보다 조금만 더 부지런하면 되니까요.

  • 카페 주인: “이 카페는 나 혼자 운영하니까 힘들지만, 아직은 모든 일을 제어할 수 있어. 프랜차이즈 업무와 카페 업무 모두 나 혼자서 맡아. 하지만 손님이 많지 않아서 버틸 만해.”

업무 확장과 협업의 필요

카페가 성장하면서 더 많은 손님을 받게 되면, 한 사람으로는 모든 일을 처리하기 어려워집니다. 그래서 직원을 추가 고용하여 프랜차이즈 업무와 카페 운영 업무를 분리합니다. 이렇게 업무를 나눔으로써 일의 속도는 더 빨라집니다. 물론, 서로 다른 업무를 담당하게 되므로 소통이 중요해집니다. 하지만 공통된 지침과 요청서를 통해 효율적으로 소통할 수 있습니다. 더욱 중요한 것은 한 사람의 업무 부담이 줄어든다는 것입니다.

만약 두 명의 직원이 동일한 업무를 하고 있었다면, 새로운 업무가 추가될 때 교육과 훈련이 필요했을 것입니다. 이 때, 한 명의 직원이 숙련되지 못하거나 과중한 교육으로 인해 도망친다면 카페 운영에 차질이 생길수 있습니다.

  • 매니저: “저는 프랜차이즈 업무를 담당하고, 다른 분은 카페 운영 업무를 맡아요. 이렇게 업무를 분리하니 더 효율적으로 일할 수 있어요. 서로의 업무에 대해 잘 모르지만 공통된 지침을 통해 원활하게 소통해요.”

업무의 더 자세한 분리

카페의 규모가 커지면서 업무를 더 자세하게 분리하게 됩니다. 프랜차이즈 업무, 재고 관리, 카페 운영 업무로 나누어집니다. 이제 직원들은 각자 독립적으로 움직입니다. 이전 보다 각 직원에게 업무를 추가하거나 뺄 때 더 편리합니다. 또한 매장 오픈 준비 시간이 크게 단축됩니다.

  • 매장 관리자: “프랜차이즈 업무 직원, 재고 관리 직원, 카페 운영 직원으로 업무가 나눠져 있어요. 이렇게 업무를 나누니 업무를 추가하거나 뺄 때 훨씬 편하고, 매장 오픈 준비 시간도 줄었어요. 각 인원의 업무가 독립적으로 움직이니 더 효율적이에요.”

대규모 매장의 층별 분리

이제는 매장이 공장 수준으로 커졌습니다. 그래서 업무를 더 자세하게 나누고 층을 분리했습니다. 예를 들어, 3층은 사무실로 사용되며 제품 발주 팀, 가맹비 입금 팀, 신메뉴 교육 팀이 있는 층입니다. 2층은 창고로 사용되며 청소 팀, 재고 정리 팀, 제품 진열 팀이 있는 층입니다. 1층 매장에서는 커피 만들기 팀, 서빙 팀, 주문 받기 팀이 있습니다.

이렇게 층과 팀을 나눔으로써 여러 가지 장점이 있습니다. 신규 인력을 추가할 때 해당 층에 바로 배치할 수 있고, 퇴사 인력이 발생해도 유관 부서를 빠르게 정리할 수 있습니다. 각 팀은 자신의 파트를 준비하기만 하면 되므로 매장 오픈 준비 시간이 획기적으로 줄어듭니다. 또한, 공통으로 사용하는 기기와 자원은 한 곳에서 관리하기가 편리하며, 각 층의 팀이 통째로 교체되더라도 서로 통신하는 방식이 동일하다면 문제가 없습니다.

  • 매장 매니저: “매장이 이렇게나 커졌어요. 이제는 층마다 업무를 독립적으로 나눠서 진행하고 있어요. 신규 인력이 추가되어도 해당 층에 바로 편입시키고, 퇴사 인력도 더 빨리 대응할 수 있어요. 매장 오픈 준비도 훨씬 효율적이에요. 공통으로 사용하는 기기와 자원은 한 곳에서 관리하기 편해서 관리도 간편해요.”

팀 별 연관성

상호 연관 관계

이번에는 팀간의 관계에 대해서 알아보도록 합시다. 우리는 카페를 효율적으로 운영하기 위해 카운터 직원을 대체할 키오스크를 도입했습니다. 바리스타는 이를 통해 주문을 받았죠.

돈을 아끼기위해 키오스크를 썼더니 처음에는 주문 방식이 매우 비효율적이었어요. 바리스타는 주문을 처리하기 위해 영수증 출력 방법과 같은 키오스크의 사용 방법을 알아야했고, 키오스크는 주문을 받기 위해 바리스타의 작업 방식이나 만들 수 있는 커피 종류를 알아야 했습니다.

둘 다 서로에게 의존하며, 업무를 진행하기 위해서는 상호적인 협력이 필요했습니다. 그러나 바리스타가 출근하지 않으면 키오스크는 동작할 수 없고, 키오스크에 문제가 생기면 바리스타는 주문을 받을 수 없게 됩니다. 또한 주문이 들어올 때마다 바리스타가 키오스크까지 확인하러 가야 하는 번거로움도 있었습니다. 어떻게 하면 둘 사이를 원활하게 소통시킬수 있을까요?

해결 방법은 생각보다 간단합니다. 둘 사이를 연결하는 주문 시스템을 도입하는 겁니다. 이를 통해 서로간의 연결이 최소화 됩니다. 예를 들어, 키오스크와 바리스타 팀은 커피 주문을 처리해야 할 때가 있습니다. 그래서 우리는 공통적인 규격을 통해 이러한 팀 간의 참조를 끊어버립니다. 이러한 규격을 통해 키오스크와 바리스타 팀은 서로의 업무를 알 필요가 없고, 컴퓨터가 중간에서 주문을 관리합니다.

이러한 공통 규격을 통해 팀 간의 연관성을 제거할 수 있습니다. 각 팀은 자신의 업무를 독립적으로 수행하면서 공통 규격을 준수하여 소통합니다. 이렇게 하면 업무 추가나 변경이 더 쉬워지며, 팀 간의 협력이 원활해집니다.

커피 주문 플로우

그러면 구체적인 사례를 보도록 합시다. 위의 그림은 커피를 주문하는 과정이고 아래와 같은 순서로 진행됩니다.

  • 고객이 주문을 하면 키오스크가 주문을 받아서 주문 시스템으로 전송합니다.
  • 그리고 주문 시스템이 바리스타 팀에게 주문서를 보냅니다.
  • 바리스타 팀은 커피를 만들기 시작합니다.
  • 주문이 완료되면 주문 시스템이 알림벨로 완료 메시지를 전송합니다.
  • 알림벨이 손님에게 커피가 준비되었다고 알려줍니다.
  • 고객은 본인이 주문한 커피를 받아갑니다.

주문 시스템이라는 공통 규격을 통해 키오스크, 바리스타, 알림벨 사이의 비효율적인 연관 관계가 사라집니다.

만약 서로 간의 연관 관계, 즉 [종속성]이 강력하다면 어떤 문제가 발생할까요? 키오스크나 알림벨 디바이스가 교체될 때 바리스타가 사용법을 다시 배워야하거나 바리스타가 변경되면 만들수 있는 커피에 대해서 일일히 입력해줘야하는다는 문제가 발생합니다. 또한 제과/제빵과 같은 새로운 팀을 추가하기도 어렵습니다. 원활한 소통과 유지 보수를 위해 공통의 규격을 사용하는건 상당히 중요합니다.

원두 주문 플로우

이번에는 조금 더 복잡한 사례입니다. 위의 그림은 매장의 원두가 떨어져서 바리스타가 본사에 주문을 하는 과정입니다. 층 별로 창고와 사무실이 나눠져 있기 때문에 바리스타는 공통된 규격인 재고 관리 시스템으로 새로운 원두를 요청합니다.

어떤식으로 본사에 발주를 요청하는지 바리스타는 몰라도 됩니다. 따라서 재고 담당 직원이나 본사 매니저가 변경이 되어도 업무하는데는 큰 지장이 없습니다. 결국 바리스타에게는 원두가 필요하고, 이러한 업무는 공통의 규격을 통해 유기적으로 진행됩니다.

프로그램에 적용해보기

카페의 규모가 확장되는 것은 프로그램의 크기가 커지는 것과 유사합니다. 카페의 팀은 모듈에, 층은 프로그램의 다양한 레이어에 해당한다고 볼 수 있습니다. 모듈화를 통해 이루어지는 소프트웨어 개발의 장점들이 카페 운영에도 적용됩니다. 카페에서 팀과 층을 나누는 것이 어떻게 모듈화와 대응되는지 살펴보겠습니다.

코드 재사용성

  • 카페 : 공통으로 사용되는 집기 등이 한 곳에서 효율적으로 관리됩니다. 이것은 집기의 재사용성과 관리의 효율을 높이고 단순화합니다. 굳이 공통의 집기가 아니더라도 각각의 팀은 재사용이 가능합니다. 회계팀에서 만들어놓은 법인 카드 청구서를 통해 재고 관리팀이나 청소팀에서 비품을 주문할 수도 있습니다.
  • 개발 : 모듈화를 통해 공통적인 기능을 분리하면, 이후에 다른 프로젝트에서도 해당 모듈을 재사용할 수 있습니다. 이는 개발 시간을 단축시키고 효율적으로 개발할 수 있는 장점을 제공합니다.

유지보수 용이성

  • 카페 : 신규 인원이 추가되었을 때 해당 층에 쉽게 배치할 수 있습니다. 퇴사 인원이 발생했을 때도 유관 부서가 명확하게 구분되어 있어서 문제를 신속하게 해결할 수 있습니다. 한 층의 인원이 전면적으로 변경되더라도 각자의 역할과 규격을 유지하므로 문제가 발생하지 않습니다.
  • 개발 : 프로그램에 새로운 모듈을 추가하거나 기존의 모듈을 제거할 때 모듈화가 되어있다면 종속성의 영향이 적어 빠른 작업이 가능합니다. 즉, 유지 보수가 효율적으로 이루어집니다. 이것은 모듈이 독립적으로 동작할 수 있도록 구성되어 있을 때의 이점과 관련이 있습니다.

빌드 시간 단축

  • 카페 : 각 팀이 자신의 업무에만 집중하면 되기 때문에 매장 오픈 준비 시간이 크게 단축됩니다. 이것은 빌드 시간을 줄이는 데 도움이 됩니다.
  • 개발 : 모듈화를 통해 앱을 여러 개의 모듈로 분리하면, 필요한 모듈만 빌드하여 테스트하거나 배포할 수 있습니다. 또한 안드로이드의 Compose나 iOS 의 SwiftUI 등과 같은 네이티브 언어로 구성된 선언형 UI는 프리뷰 로딩을 위해 컴파일이 필요한데, 빌드 시간을 단축시킴으로써 개발자의 생산성을 높이는 빠른 개발이 가능해집니다.

결론

결론적으로, 카페 규모가 작은 경우에는 하나의 직원만 고용해도 운영이 가능하지만, 규모가 커질수록 비효율적이며 유지 보수 측면에서도 어려워집니다. 이와 마찬가지로, 소프트웨어 개발에서도 초기에는 모듈화를 강조하지 않더라도 프로그램 규모가 커지면서 모듈화가 매우 중요한 역할을 하게 됩니다. 이러한 관점에서 모듈화는 소프트웨어 개발에서 필수적인 작업 중 하나입니다.

모듈화는 코드 개발 시 발생할 수 있는 코드의 복잡도와 유지보수의 어려움을 해결할 수 있는 좋은 방법입니다. 모듈화를 통해 코드의 재사용성을 높이고, 유지보수를 용이하게 하며, 빌드 시간을 단축시킬 수 있습니다. 따라서, 개발에 모듈화를 적용하여 효율적인 개발을 할 수 있도록 노력해야 합니다.

--

--