Intro
이 글을 쓰게 된 계기는 “지난 프로젝트에서 이 기술을 선택한 이유가 뭘까?”라는 의문에서 시작됩니다.
저는 개발해본 적 없는 기능을 구현할 때 많은 레퍼런스를 참조해보곤 합니다. 또한 많은 기술들 중 한 개의 기술을 선택하게 되고, 그 기술에 대해 학습 후 실제 프로젝트에 적용했던 것 같습니다.
돌이켜보면 지난 프로젝트들에 대해 “왜 이러한 기술을 선택했냐?” 라는 질문에 자문자답을 해보면 “해당 기능에 대한 기술로 자주 언급되니까?” 정도에서 그쳤던 것 같습니다.
조금만 생각해봐도 고려해야하는 사항으로 떠오르는 것들이 한 두가지가 아닌데 말이죠.
그래서 백엔드로서 기술을 선택할 때 어떤 것들을 고려해야 하나에 대한 체크리스트가 있으면 정말 좋을 것 같다라는 생각을 하게 되었고, 찾아보니 따로 깔끔하게 정리된 소스가 없는 것 같아 이번에 시간을 내어 정리를 한번 해보려합니다. (대부분이 주관이기에 피드백에 대해서는 오픈 마인드입니다!)
해당 포스팅 내에서 기술은 프로토콜 | 프레임워크 | 라이브러리 등을 의미합니다.
또한 언어와 같은 대분류는 주니어 단계에서는 한 가지를 선택해서 깊게 하는게 맞다고 생각하기 때문에 언급하지 않으려 합니다.
어떤 상황에서 기술 선택의 기준이 필요할까?
저의 예를 들어보자면, 지난 번 프로젝트에서 채팅과 스트리밍 기능을 동시에 개발하게 된 상황이 생겼습니다. 저는 당연한듯이 각 기능에 대한 레퍼런스가 많고, 언급이 잦은 기술들을 각각 사용하게 되었고, 그 결과 WebSocket, WebRTC 두 프로토콜을 동시에 사용했습니다.
이후 컨설팅을 진행하면서 “두 기능을 하나의 프로토콜로 처리를 할 수는 없었나?” 라는 질문을 듣고 저는 선뜻 대답을 할 수 없었습니다. 왜냐하면 앞서 얘기한듯이 한가지 기준밖에 저에게는 없었거든요.
이 외에도 MessageBroker를 사용하게 될 경우, RabbitMQ, Kafka, ActiveMQ 등 다양한 브로커가 있습니다. In Memory를 활용할 수 도 있겠네요.
이처럼 개발을 진행하다보면 기술적 선택의 기로에 놓이게되는 상황이 필연적으로 오는 것 같습니다.
모든 언어, 프레임워크, 라이브러리와 같은 기술들을 잘 숙지하고 있다면, 적재적소에 유연하게 활용할 수 있겠지만 현실은 아니니까요. 정리를 한번 해봄으로써 어떤 고려사항이 있는지 고민해보면 이후 선택 시간을 조금이나마 줄일 수 있을 것이라 생각합니다.
Case 1. 비슷한 기능에 대해 어떤 기술이 많이 언급되는가?
제 기준 가장 확실한 선택의 기준인 것 같습니다.
예로 채팅 서비스를 구현해야하는 상황이라면, 당연히 시중에 활성화가 크게 되어있는 카카오톡, 라인 등과 같은 App들은 어떻게 구현했을까? 라는 의문이 들테고, 이미 서비스 규모가 크기 때문에 합리적인 선택이 될 가능성이 가장 높죠. 또한 그만큼 많은 레퍼런스들이 있기에 개발을 함에 있어서 무리없이 기능구현을 할 수 있다는 장점이 있습니다.
하지만 많이 언급되고 사용되어 왔다고 해서 그 서비스들과 제가 구현하려하는 서비스는 세부적으로 많은 차이점이 존재할 수 있습니다. 특히 해당 서비스에서 사용된 기술 외 선택지들에 대한 장단점을 모를 경우 합리적인 기술 선택이 안될 가능성이 높아질 수 있습니다.
예로 높은 보안과 사용자 세션 관리가 중요하여 JWT라는 인기 기술이 아닌 세션 방식을 택하는 은행처럼 말이죠.
그럼 어떤 세부적인 선택 기준을 고려하면 좋을까요?
Case 2. 비용
비용에는 두 가지의 기준으로 또 나뉘게 된다고 생각합니다. 바로 금전적과 시간적 비용이예요.
금전적 비용이란 하드웨어적인 측면입니다. 당연히 서버의 성능을 높일 수 있다면 어떤 기술을 쓰더라도 평균적인 성능을 보이게 될 거라 생각합니다. 하지만 멍청한 사람이 아니고서야 비용에 따른 효율 곡선이 좋은 기술을 선택하는게 당연하겠죠.
시간적 비용이란 해당 기능을 구현하기위해 주어진 시간이 얼만큼 있느냐, 해당 기술을 학습하기 위한 러닝커브가 어떻게 되는가 정도가 있습니다. 효율좋은 설계가 있지만 이 기능을 개발하기에 학습시간과 개발시간이 맞지 않아 데드라인을 못맞추게된다면 그야말로 주객전도입니다.
Case 3. 팀의 기술 숙련도
최근 프로젝트였을 거예요. 팀원 모두 개발 경험 및 기술 숙련도에 대해 얘기를 나눈 적이 있습니다. 같은 기술을 사용했다면 아주아주 편했겠지만 다들 다른 경험을 가지고 계시더라구요.
아무래도 누군가 주도해서 “이 기술을 써서 개발해요!” 라고 하는 순간 해당 기술로 인한 사이드 이펙트는 그사람에게 돌아갈거라는 암묵적인 분위기에서 어찌해야할지 모르겠더라구요.
이처럼 서로 다른 기술 숙련도 또한 기술 선택에 있어 주된 고려사항으로 생각이 됩니다.
Case 4. 트레이드 오프(Trade-Off)
개발을 진행하다보면 당연한 것 중 하나인데요.
예로 UDP 방식의 프로토콜을 통해 데이터를 전송하는 설계를 했다고 가정해봅시다. 이 경우 속도 측면에서는 많은 성능 향상을 이룰 수 있지만, 데이터의 유실과 같은 신뢰성에서 많은 문제를 발생시킬 수 있습니다.
만약 현재 개발중인 서비스가 데이터는 중요하지 않지만 속도측면에서의 지연을 최소한으로 하는게 사용자 관점에서 많은 이점을 가져올 수 있다면? 반대로 파일 공유 서비스와 같이 하나하나의 데이터가 중요한 서비스라면?
두 마리 토끼를 모두 잡을 수 있는 기술이 있다면 더할나위 없겠지만 이처럼 손실을 저울질하여 선택해야하는 경우도 많습니다.
결론
위의 기준은 제가 생각한 1순위로 이루어져야 하는 고민들에 대한 것입니다. 당연히 다른 중요한 포인트들이 있을 수 있겠죠. 예로 레거시 기술이라도 높은 숙련도를 통해 갈겨쓴 최신 기술보다 높은 스펙을 낼 경우도 있을 수 있습니다. 또한 프로젝트의 요구사항에 따른 보안 문제 및 유지보수와 관련된 것들도 있습니다.
서로 기술을 선택하는 기준은 달라도, 내가 선택한 기술에 대해 남들에게 논리적으로 설명할 수 있고, 스스로 또한 많은 고민에 걸쳐 결정한 것인지가 되게 중요하다고 생각됩니다.
저또한 요즘 프로젝트 회고를 진행하면서 “대체할 수 있었던 기술 및 왜 이 기술이여야 하는지에 대해” 스스로 묻고 답하는 시간을 가지며 반성도 하고 새롭게 알아가는 시간을 가지고 있습니다.
Plus. 주변에서의 생각은 어떨까?
'Develop > SmallTalk' 카테고리의 다른 글
난 책을 그저 읽고만 있었던 건 아닐까? (5) | 2024.11.13 |
---|
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!