벌써 9월이 다가오고 삼성의 공채가 열리며 하반기의 시작을 알렸다. 나도 꾸준히 공부하던 도중.. 문득 이런 의문이 들었다.
스타트업에서는 왜 Node 기반을 많이 쓸까?
한국 기준으로 자바가 많이 활성화 되어있고, 이에 따라 인재풀 또한 자바가 많을 거라 생각해서 기업 입장에서도 당연히 자바를 많이 쓸 거라 생각했다.
하지만 실상은 달랐고 오늘은 그 이유를 알아보기 위해 두 기술을 비교해보았다.
일단 예시를 위해 실제 어느 한 기업의 기술스택을 가져왔다.
Frontend
Backend
가장 먼저 마주한 차이는 바로 동시성 모델의 차이였다. 이것은 단순히 언어 문법의 차이가 아닌, 서버가 요청을 처리하는 방식에 대한 근본적인 차이점이였다.
요청이 들어올 때마다 새로운 스레드를 할당하거나(혹은 스레드 풀에서 꺼내) 처리하는 방식에 익숙했다. 한 스레드가 DB 조회나 API 호출로 잠시 멈춰(Blocking) 있더라도, 다른 스레드가 다른 요청을 처리하기에 전체 서버가 멈추는 일은 없었다.
마치 손님마다 전담 웨이터가 한 명씩 붙는 레스토랑과 같았다.
Node.js는 단 하나의 메인 스레드로 모든 요청을 받는다. 그리고 오래 걸리는 I/O 작업(DB 조회, 파일 읽기 등)은 운영체제(libuv)에게 위임하고, 자신은 바로 다음 요청을 받으러 간다.
위임했던 작업이 끝나면 그 결과(콜백 함수)는 이벤트 큐에 등록되고, 메인 스레드는 순서대로 큐의 작업들을 처리한다.
엄청나게 손이 빠른 웨이터 한 명이 모든 테이블의 주문을 받고, 주방에 던져놓고, 요리가 완성되면 서빙하는 방식이었다.
⚠️ 중요한 차이점
Node.js에서는 모든 I/O가 'Non-Blocking'으로 동작해야만 했다. 만약 단 하나라도 Blocking 작업이 메인 스레드를 차지하면, 서버 전체가 멈춰버리는 끔찍한 재앙이 발생한다.
이 기술 스택은 단순히 Node.js를 사용하는 것을 넘어, 그 생태계의 장점을 극대화하는 조합으로 구성되어 있었다.
가장 충격적이었던 기술은 tRPC였다. Spring Boot 환경에서는
1. Controller에 API를 만들고
2. Swagger 같은 도구로 API 문서를 생성하고
3. 프론트엔드 개발자는 그 문서를 보며 요청/응답 타입을 수동으로 만들어야 했다
tRPC는 이 모든 과정을 없애버렸다.
개발 속도와 안정성을 동시에 잡는 이 방식은 혁신적으로 느껴졌다.
Prisma는 JPA/Hibernate와는 또 다른 경험을 제공했다:
tRPC가 그대로 프론트엔드까지 전달해 주는 End-to-End 타입 안정성 아키텍처는 매우 견고하고 좋아보였다.Next.js는 백엔드와 프론트엔드를 하나의 프로젝트, 하나의 언어(TypeScript)로 개발하게 해주었다
/pages/api 폴더에는 백엔드 API 코드를/pages 폴더에는 사용자에게 보여줄 React 컴포넌트를 작성이는 마치 Spring Boot 프로젝트 안에 React 프로젝트가 완벽하게 통합된 것과 같은 경험을 제공하며, 엄청난 개발 생산성을 가져다줄 것 같았다.
이 새로운 세계는 장점만 가득한 유토피아처럼 보였다. 하지만 모든 기술 선택에는 반드시 트레이드오프가 존재한다. Java/Spring 생태계가 수십 년간 엔터프라이즈 시장을 지배해 온 데에는 그만한 이유가 있었다.
@Transactional 어노테이션 하나로 해결되는 정교한 트랜잭션 관리, 강력한 Spring Security 등 엔터프라이즈급 기능들이 프레임워크 자체에 단단하게 통합되어 있다이번 조사를 통해 Java/Kotlin의 세계와 Node.js/TypeScript의 세계를 깊이 있게 비교하며 탐험할 수 있었다.
결론적으로 어떤 기술 스택이 절대적으로 '더 좋다'고 말할 수는 없었다.
결국 중요한 것은 해결하려는 문제의 본질을 이해하고, 각 기술의 철학과 트레이드오프를 고려하여 가장 적합한 도구를 선택하는 능력이었다.
특히 AI가 발전하고 다양한 MCP 및 에이전트가 등장함에 따라 언어의 장벽이 더 낮아졌다고 생각한다. 결국은 어떤 기준으로 선택하고 어떻게 빨리 학습해 구현할 것인지가 더 중요하지 않을까....
언젠가는 Node로 한번 프로젝트를 해봐야겠다는 생각이 든다.