개발을 잘하고 싶어하는 분들이 자주 묻는 질문이 있습니다.
"설계는 어떻게 해야하나요?", "이런 설계가 정답인가요?"
그리고 이런 질문에 대한 답변은 다양합니다.
모놀리식 VS MSA로도 갈리기도 하고, kafka VS rabbitmq 로도 갈릴 수 있구요.
케바케(case by case), 서비스에 따라 다르다 라는 말을 하는 사람도 있습니다.
회사에서 서비스 개발을 하면서 수많은 선택을 하는데 있어서 설계에 대한 정답이 뭘까요?
요리로 빗대어 생각해보자.
직접 요리를 해드시거나, 하지 않더라도 음식은 누구나 먹겠죠?
요리를 하지 않더라도 계란프라이 정도는 해보거나 드셔보셨을꺼에요.
그럼 계란프라이를 만드는데 필요한 것은 무엇이 있을까요?
대표적인 재료로는 계란, 식용유, 소금 등이 있습니다.
자, 그럼 계란프라이를 만들려고 했을 때, 부족한 것이 있다면 어떨까요?
- 계란이 없다면?
- 메추리알, 오리알, 거위알, 타조알 등으로 대체할 수 있다.
- 식용유가 없다면?
- 버터/마가린을 활용하거나, 물을 이용한 방법도 있다.
- 소금이 없다면?
- 소금을 넣지 않는 방법도 있으며, 간장과 같이 짠맛이 있는 재료를 활용하는 방법도 있다.
결국 다른 대안이나, 필수가 아닌 재료를 없애면서 계란프라이와 유사한 음식을 만들 수 있습니다.
여기서 가장 중요한건, "계란프라이가 아닌 유사한 것"이라는 부분인데요.
이렇게 이야기 한 이유는 바로 계란프라이를 하는 목적에 있습니다.
일반적으로 계란프라이를 하는 목적은 "계란프라이의 맛"을 원해서 입니다.
주로 계란의 흰자 + 노른자의 맛이죠, 물론 취향에 따라 소금이 없으면 안드시는 분은 있겠지만요.
위의 예시에서는 "대체재들이 목적에 부합하는 역할"을 해주기 때문에,
정확히 계란프라이는 아니더라도 맛이 흡사한 오리알프라이, 타조알프라이 등이 가능하게 된 것입니다.
그럼, 이러한 비유가 실제 프로그램 설계에 어떻게 적용될까요?
그럼 프로그램 설계 시에는?
프로그램을 설계할 때도 목적이 중요합니다.
회사에서는 주로 회사의 비전, 전략, 목표에서부터 출발하죠.
예를 들어서 이번 년도의 전략이 시장 경제가 안좋으니 "비용을 절감하자"라고 하면,
비용이 많이드는 MSA를 채택하기 보다는, 모놀리식을 고려하여 개발할 수도 있습니다.
그런데, 비전이 "안전한 서비스"라고 하면, 비용이 들더라도 다시 MSA를 고려해야할 수도 있지만,
당장 회사의 규모가 크지 않다면 일단 모놀리식으로 진행하되, 추후에 쉽게 나눌 수 있도록 Spring Modulith와 같은 형태로 개발을 하는 방법도 있겠죠.
결국 모든 선택에는 근거가 있어야하고, 그 근거에 맞도록 시스템을 구성해나가면 됩니다.
또한 추후에 어떤식으로 확장될지 미래에 대한 전략을 고려해서 설계한다면, 더욱 좋은 설계가 될 수도 있겠죠.
물론 미래의 전략이 맞지 않는다면 오히려 오버엔지니어링이 될 수도 있으니, 그것 또한 고려해야할꺼구요.
이처럼 회사에서는 "계란프라이의 맛"이 아니라, 회사의 여러 이해관계간의 변수를 고려해서 프로그램 설계를 진행해야하기 때문에, 처음에 이야기 했던 설계에 대한 정답이 모두 다른 것입니다.
모두 다른 환경에 있을테니까요.
결국 정답이 없다는게 정답이다.
실망하셨겠지만, 모든 프로그램은 모두 상황이 다릅니다.
그만큼 많은 설계가 있을거에요.
아마 같은 요리를 하더라도 셰프와 제가 만든 요리 사이에서는 많은 맛의 차이가 있을겁니다.
셰프는 어떤 재료를 어느 시점에, 어느정도의 불의 세기로 요리했을 때 가장 맛이 좋을지를 항상 고민하고 있을테니까요.
마찬가지로 프로그램 설계 또한, 현재 시점과 앞으로의 미래에 가장 알맞은 설계가 무엇일까?를 항상 고민해야합니다.
특히나 소프트웨어의 특성상 코드가 지속적으로 변경되고, 그에 따라 맞는 설계가 달라질 수 있음을 알아야 합니다.
이런 고민이 결여된 경우 흔히 말하는 "오버 엔지니어링"이 될 수 있고, 회사 입장에서의 필요없는 지출로 이어질 수 있습니다.
설계는 이게 맞다, 저게 맞다 보다는 현재로써 우리에게 맞는 최적의 방법을 찾는 것이라는 점을 항상 상기해주셔야,
다른 자료에서도 "여기서는 이런 상황이어서 이런 설계를 하게 되었구나"라는 시각으로 바라볼 수 있게 됩니다.
결국, 상황에 따라 유연하게 선택하는 설계가 가장 효과적이며, 끊임없이 고민하고 개선해 나가는 과정이 중요하다는 점을 잊지 마세요.
'생각 정리 > 개발' 카테고리의 다른 글
나의 사이드 프로젝트가 완성되지 못하는 이유 (0) | 2025.02.14 |
---|---|
개발을 할 때는 아무것도 믿지 않는다. (1) | 2025.02.11 |
개발부하와 업무부하는 비슷하다. (1) | 2025.02.02 |
신입 개발자의 대규모 트래픽 경험? 이런걸 원합니다. (1) | 2025.01.25 |
성장을 위해선 생각해야 한다. (1) | 2025.01.13 |