백엔드 메타 분석 기초편
백엔드로 선택할 수 있는 것들
요즘 백엔드를 구성할 때 선택할 수 있는 기술 스택은 대략 아래와 같이 나뉜다.
1. Spring Boot (Java / Kotlin) : 엔터프라이즈의 절대 강자
- 대규모 서비스, 복잡한 트랜잭션, 안정성이 중요한 환경에 최적
- 러닝 커브가 높은 편
- 스레드 풀 기반으로 고성능 튜닝 가능
- 원래 Java 기반이지만 JVM 위에서 동작하는 Kotlin으로도 사용 가능
- 최근에는 Kotlin 선호도가 점점 높아지는 추세
2. Node.js (Express / NestJS) : 빠른 개발과 작은 팀
- TypeScript를 사용해도 컴파일 타임 타입 안정성은 상대적으로 약한 편
- 러닝 커브가 낮고 개발 속도가 빠름
- 싱글 스레드 비동기 기반이라 트래픽 증가 시 수평 확장이 필수
- 트랜잭션 처리나 복잡한 도메인 로직에서는 상대적으로 약점 존재
3. Python (FastAPI, Django) : 데이터 처리, AI 특화
- 머신러닝, 대규모 데이터 처리, AI 모델 서빙에 강점
- 웹 개발 자체는 가능하지만 비동기 처리나 고성능 환경에서는 불리한 편
4. Go (Golang) : 고성능 마이크로서비스 + 인프라
- 쿠버네티스 생태계의 사실상 표준 언어
- 고성능 API 서버, 병렬 처리, 크롤러 등에 매우 강함
- 크롤링, 실시간 처리 서버 등 성능이 중요한 핵심 마이크로서비스에 많이 사용됨
5. 서버리스 환경
- AWS Lambda, Cloudflare Workers 등 함수 단위 실행
- 특정 로직을 분리해 독립적으로 운영하기 좋음
회사에서의 경험
이전 회사에서는 원래 Python FastAPI로 백엔드를 구성하고 있었다.
다만 파이썬 생태계가 비동기 처리에 최적화되어 있지 않다는 판단 하에 Node.js로 전면 전환했다.
(이 결정은 시니어 개발자분이 주도하셨다.)
또한 AWS Lambda 위에서 Python으로 크롤링 로직을 돌렸는데,
속도가 상당히 느리고 병렬 처리도 불편했다.
결국 Go로 교체했고, 처리 속도 측면에서 확실한 차이를 체감했다.
특별한 이유가 없다면 Python을 일반 웹 백엔드 용도로 쓰는 선택은 피해야겠다는 생각이 들었다.
Node VS Spring
Node는 빠른 개발이 필요하고 트래픽이 낮은 소규모 프로젝트에 유리하다.
TypeScript를 사용하더라도 타입 검증 측면에서는 한계가 있고, 러닝 커브가 낮은 편이다.
싱글 스레드 비동기 구조이기 때문에 트래픽이 증가하면 수평 확장이 필수적이며, 트랜잭션 관리에는 상대적으로 약하다.
Spring은 엔터프라이즈급 프레임워크로 대규모 서비스와 트랜잭션 관리에 강점이 있다.
스레드 풀 기반 튜닝을 통해 상당한 수준의 성능 최적화가 가능하다.
원래는 Java 기반이지만 JVM 위에서 동작하는 다른 언어들도 활용할 수 있으며,
최근에는 문법이 더 현대적인 Kotlin을 사용하는 사례가 늘고 있다고 한다.
마이크로서비스
마이크로서비스는 큰 서비스를 작은 단위로 분리하여 개발·배포·운영을 각각 독립적으로 수행하는 아키텍처를 의미한다.
서비스별로 독립 DB, 독립 서버, 독립 배포 파이프라인을 갖는다.
보통 작은 팀이 하나의 서비스를 온전히 책임지는 구조를 취한다.
서비스 간 통신은 HTTP API 또는 메시지 큐(Kafka, RabbitMQ 등)를 통해 이루어진다.
또한 서비스의 성격에 따라 기술 스택을 다르게 가져갈 수 있다.
예를 들어 결제 서비스는 Spring을 사용하고, 크롤링 서비스는 Go를 사용하는 식의 구성이 가능하다.

내 생각
나는 당분간 1인 개발자 관점에서 Node.js를 주력으로 사용할 것 같다.
크롤링처럼 고성능 처리가 필요한 영역에서는 AWS Lambda + Go 조합을 추가로 활용할 가능성이 높다.
만약 내가 전통적인 웹 백엔드 개발자 트랙을 선택했다면, 아마 다음과 같은 순서로 준비했을 것이다.
- Spring Kotlin 기반 트랜잭션 처리 및 대규모 서비스 구성 연습
- AWS 기반 인프라 구성·배포·모니터링 경험 축적 후 쿠버네티스 학습
- Go로 고성능 마이크로서비스를 구축해 Spring과 함께 운용하는 연습