시작 하며...
필자는 현재 Typescript + NestJS를 활용한 프로젝트를 진행 중이다.
이전 까지는 아무 생각없이 전통적인 Java 기반의 Spring Boot를 활용해 백엔드 개발을 하고는 했는데, 이번에 NestJS를 경험해보며 두가지 프레임워크의 차이점, 더 나아가 각 언어별 생태계가 주는 차이점에 대해서 고민해보게 되었다.
자바 vs Node, 향로의 선택은? - YouTube
그러다 위 영상을 알고리즘에서 보게 되었고, 전문가 분들의 이야기를 들으면서 생각 정리 + 공부 겸 글을 쓰게 되었다.
채용 시장은요...?
그냥 생각나는 채용 플랫폼에 가서 각 프레임워크의 이름을 검색해 보았다.
물론 이렇게 검색해서는 시장의 분위기를 파악하기 어려운면이 있지만, 일단 가장 단순하고 직관적인 지표이기에 들고왔다.
다른 플랫폼도 해봤지만 저 두가지 플랫폼의 차이를 크게 벗어나지 않는다. 일단 노드가 스프링을 이기는 일은 없었다.
"취업을 준비하는 입장에서 스스로의 기술적 흥미만을 따라 갈수만은 없다" 라는 이야기를 주변에서 들어본 적이 있다. 맞는 말이라고 생각하며, 단순히 "그냥 일자리 많아서 Java / Spring 으로 프로젝트를 시작 & 공부 할건데용?ㅋ" 라고 하며 공부를 하는 사람들 또한 비난 하고싶은 마음이 전혀 없다.
여기서 포인트는 다음 두가지를 정확하게 인지하며, 그에 대한 스스로의 가치관을 가지고 취업 전략을 수립하는 것 이다.
- 왜 다들 Java/Spring 쓰는거임?
- 각 언어 & 프레임워크의 장단점이 뭐임?
Java / Spring
주로 자바는 규모가 큰 엔터프라이즈를 개발할때에 그 강점이 두드러진다.
도입부에서 언급한 영상을 보면 이런 말이 나온다.
카카오 스타일(지그재그)은 전통적으로 Node.js로 서비스를 일으켰던 회사였는데, 지금은 거의 다 Java / Spring 기반 이에요. 당근도 처음에는 Ruby on Rails로 시작을 했지만, 지금은 Java / Spring이 많이 섞여있는 상태.... - 향로
회사가 커지면 커질수록 Java / Spring 으로 핵심 서비스가 마이그레이션 되는 케이스가 많은 것 같다. 왜 그런걸까?
압도적인 국내 커뮤니티
SW 기술(여기서는 언어)이 언제 발전한다고 생각 하는가?
바로 많은 사람들이 기술을 발전시키고자 함께 머리를 맞대고 토론하며 기여할 때 그 기술은 비로소 진정한 진보를 이룬다고 생각한다. 예를 들자면 기업에서 진행하는 다양한 기술 컨퍼런스, (회사 내/외)스터디 모임, 활발한 오픈소스 활동 등이 될 수 있을 것이다.
국내에서는 이러한 활동들이 Java / Spring 쪽이 매우 우세한 것을 볼 수 있다.
어찌보면 당연한 것이, 많은 영리 기업들이 사용하는 기술이기에, 그만큼 그 기술을 더 잘 다뤄보려는 시도들도 많을 것이다.
전 세계적으로 이런걸까?
2024 Stackoverflow Developer Survey 를 보면, 2024년에 가장 많은 점유율로 투표를 받은 웹 프레임워크 기술스택은 Node.js가 선정 되었다. 이는 필자의 뇌피셜에 따르면 많은 소규모 회사에서 채택중인 기술이기도 하고, 무엇보다 FE 개발 언어에는 선택권이 JS 밖에 없으니 저렇게 통계가 잡히지 않았나 싶다. (이유를 아시는 분이 있으면 좀 알려주십시오ㅠ)
안정적인 서비스 & Opinionated Framework
Java / Spring은 공개된지 20년이 넘은 전통적인 웹프레임워크이기에, 그동안 수많은 상황에 대한 레퍼런스 + 모범사례에 대한 데이터가 축적 되어있고, 이를 통해 안전성이 높고 유지보수가 용이한 서비스를 구축할 수 있다.
또한 Java / Spring 은 대표적인 Opinionated Framework로, 엔지니어에게 특정한 작성 패턴을 강조하는 대신, 다양한 기능을 제공하는 완전 관리형 프레임워크이다. 이렇게 강제되고, 확립된 코드 작성 규칙들은 협업을 할때 강력한 장점을 발휘한다.
예를 들어 express과 같은 경우에는 규칙이 없다. 함수형? 객체지향형? 디렉토리 구조? 디자인 패턴? 등등 선택할 범위가 매우 광범위 하고 복잡하게 개념들이 얽혀 있다. 이러한 자유도는 1인 개발일때는 오히려 장점으로 다가올 수도 있으나, 단일 제품을 여러명이 돌아가며 맡게되는 현업의 특성상 이 높은 자유도는 독이 된다.
모든 개발자들은 특정한 기능을 개발할 때 마다 무슨 기능을 써야할지 헷갈리고, 골치가 아파온다. 하지만 프레임워크가 이를 정해놓아 버린다면? 개발자들은 비교적 선택된 범주 내에서 개발을 하기 때문에, 다른 사람이 작성한 코드도 더욱 빠르게 이해할 수 있으며 일관된 코드를 작성할 수 있다.
싱글 스레드 vs 멀티 스레드
Node.js VS Spring 을 할때는 스레드 이야기를 빼놓을 수 없다. 다소 성급한 결론처럼 보일 수 있으나 정리 해보면
- Node.js (논블로킹 + 비동기) : 비교적 적은 리소스 환경에서 많은 작업을 적당한 속도로 수행하기에 적합하다. (저비용, 적절한 성능 Which means, 고성능 PC를 사용해도 100% 활용하기 힘들다...)
- Java Spring : 비용은 많이 들지만, 대규모 환경에서 많은 작업을 높은 속도로 수행이 가능하다. (고비용, 고성능)
간단한 JWT 검증 후 DB에 쿼리를 보낸 상황을 기준으로 NestJS vs Spring Boot 를 벤치마킹한 결과를 여기서 볼 수 있다.
결과를 보면 속도나 소요시간 측면에서 Spring Boot가 항상 10~20% 우위를 점하고 있으나, NestJS가 메모리와 CPU 사용률이 SpringBoot의 약 1/3 수준임을 확인할 수 있다.
이는 물론 웹 서버에 국한된 상황이며 그마저도 반례를 들 수 있는 상황들이 있을 수 있으나, 보편적으로는 위 특징을 따라간다고 생각한다. (이와 관해서 조금 디테일하게 알아보며 포스팅을 작성중이다.)
SW 강소 기업들은 사용자에게 높은 수준의 사용자 경험을 제공하기 위해서 고성능의 리소스를 활용할 준비가 되어있다. 이 상황에서는 많은 CPU 집약적 연산에 강한 멀티스레드 환경이 조금 더 적절할 것이다.
Node.js
언어의 확장성
현 세대에 FE 개발 언어에는 거의 선택권이 없다싶이 Javascript(Typescript)를 사용 해야 한다.
근데 BE개발에 Node.js를 활용하면 FE 개발 환경과 여러가지 도구를 공유할 수 있다. 코드 일관성 & 테스트 도구 등 다양한 환경에 빠르게 적응하고 재활용할 수 있다.
한정된 인력자원을 활용할 수 밖에없는 영리 조직에서 이러한 장점은 꽤나 크게 다가올 수 있다.
싱글 스레드 VS 멀티 스레드
싱글 스레드 + 비동기 + 논블로킹 기반 Node.js 에서 얻을 수 있는 이점들을 강력하게 활용할 수 있는 환경에서는 이점이 될 수 있다. 위에서의 특징을 다시 언급해보면...
- Node.js (논블로킹 + 비동기) : 비교적 적은 리소스 환경에서 많은 작업을 적당한 속도로 수행하기에 적합하다. (저비용, 적절한 성능)
여기서 포인트는 비교적 적은 리소스 환경에서 많은 I/O 작업을 처리할 때 강점을 보인다는 것이다. 마찬가지로 한정된 자본과 컴퓨팅 자원을 가지는 영리 조직(스타트업, 중소기업 등..)에서 서버의 가용성이나 서비스 품질을 고려하는 과정에서 이러한 특징은 매력적으로 다가올 수 있다.
Java에 비하면 Node.js는 모듈이나 실행 과정들이 비교적 가벼운 파편들로 나뉘어져 있다.
단점을 해결하기 위한 여러가지 시도들
이건 사실 어느 기술이든 같은 양상을 보이는 부분이라고 생각한다. 모든 기술은 커뮤니티가 형성되고, 발전을 거치는 과정에서 다른 진영에서는 이미 해결한 과제에 봉착하게 되고, 이 문제들을 해결하기 위해 다양한 방안들이 제시된다.
Javascript 환경에서는 강타입 개발 환경에 익숙한 개발자들을 지원하기 위해 나온 Typescript, 단일 스레드의 한계를 확장하기 위한 클러스터링 등...
문제 해결을 위한 다양한 기법, 오픈소스들이 제공되고 활발한 커뮤니티가 형성되어 있다. "Node.js의 한계로 이러한 기능은 디벨롭하기 힘들다..." 라는 말은 거의 할 일이 없다는 것이다.
결론
필자의 미숙한 경험과 생각들을 정리해 보았다. 쓰면서 새롭게 알게된 사실도 많았어서 생각보다 재미있었다.
어떤 던전을 공략하는데 딜러, 탱커, 힐러가 모두 필요하다고 생각해보자, 내가 전 서버 1등 탱커라고 해서 그 던전을 혼자 클리어가 가능할까? 편법을 사용해 겨우 클리어하거나 불가능 할 것이다. 이렇게 상황에 따라 필요한 기술을 완벽하게는 아니더라도 자유롭게 다룰 수 있는, 도구에 의존되지 않는 사람이 곧 문제 해결력이 높은 사람이라고 생각한다. 특정한 기술 스택역시도 이러한 도구에 불과하다.
앞으로 내가 경험을 하게 되면서 위에 써놓은 내용들이 모두 엉터리라고 생각할 만큼 생각이 바뀔수도 있겠지만, 최소한 지금은 이렇게 생각하고 있으며, 누군가가 물었을 때 내 생각을 말할 수 있을 정도는 된다고 생각한다.
내가 1년, 5년, 10년뒤에 어떠한 기술 스택을 결정해야 하는 상황이 왔을 때, 이렇게 웹 서버에만 국한된 것이 아닌 다양한 기술에 대해 넓은 시야와 트렌드를 이해하고 깊은 수준의 지식으로 현명한 선택을 할 수 있는 사람이 되어있었으면 좋겠다.
'Web' 카테고리의 다른 글
NestJS + TypeORM + Testcontainers 를 사용한 통합 테스트 DB환경 구축하기 (1) | 2025.01.17 |
---|---|
코딩테스트 준비를 위한 Java 입출력 정리 (0) | 2024.05.23 |
Java record 에 대하여 (1) | 2024.03.10 |