대한민국 백엔드 시장에서 스프링부트와 전자정부프레임워크가 왕좌를 내려놓지 않는 진짜 이유는 기술적 우월함이 아니라 오랜 조달 관행과 업체 교체 구조가 굳힌 인력 조달의 편리함 때문이다. 특정 악당이 음모를 꾸며 설계한 시스템이 아니라, 저임금 국비 지원 인력을 즉각적으로 현장에 투입하고 언제든 부품처럼 갈아 끼우기 위해 시장 구조 자체가 그렇게 진화한 결과다. 이 기형적인 생태계는 기술 스택을 극도로 좁은 호환 범위 안에 가두어둠으로써 사람을 바꾸어 끼워도 사고방식과 산출물 형식을 비슷하게 유지하도록 강제한다. 이것은 대규모 트래픽을 효율적으로 제어하거나 시스템의 확장성을 고민한 엔지니어링의 산물이 아니라, 외주 업체가 통째로 바뀌어도 시스템이 대충 유지보수되어야 하고 공공과 금융 대기업의 관료제적 행정 편의주의 안에서 리스크를 최소화하려는 행정적 선택일 뿐이다.
이 구조가 현장에 정착하면서 만들어낸 코드는 도메인 규칙과 트랜잭션 경계를 코드 안에서 일관되게 모델링하기는커녕 시스템을 단순한 납품용 CRUD 기계로 전락시켰다. 요구사항이 조금만 바뀌어도 데이터베이스 테이블부터 무지성으로 설계하고, 화면 ID 단위로 패키지를 기계적으로 쪼개며, Controller와 Service를 거쳐 MyBatis XML의 누더기 같은 조건문으로 SQL을 붙여 화면에 게시판과 엑셀 다운로드를 뿌려대는 행위가 백엔드 개발의 전부가 되었다. 비즈니스 규칙은 데이터베이스 프로시저와 서비스 레이어 그리고 프론트엔드 검증 사이에 사분오열 찢겨 들어가 있으며, 공통 유틸 클래스는 정체 모를 쓰레기장처럼 불어난다. 여기서 테스트는 납품 검수의 중심이 아니라 형식적인 통과 의례로 밀려나고 실제 품질 보증은 담당자의 수동 화면 클릭과 운영 DB 직접 확인에 떠넘겨진다. 결국 운영 장애가 터지면 아키텍처적 추적은 불가능하기에 그저 실시간으로 서버에 접속해 로그를 grep으로 긁어대거나 운영 DB를 직접 수정하며 땜질하는 고통스러운 악순환이 매일 반복된다.
자바 진영의 개발자들은 Java 21의 Virtual Threads나 Spring Boot의 GraalVM Native Image 기능, 그리고 Spring AI와 RAG, Redis Stack, Ollama, ONNX Runtime 의존성을 관리하는 최신 eGovFrame 5.0.0 진화형 샘플을 들고 와서 반박하려 들 것이다. 하지만 OpenJDK 공식 문서에서도 명시하듯 Virtual Threads는 I/O 대기가 많은 고동시성 병목을 줄이는 도구일 뿐이지 CPU-bound 작업의 처리량을 개선하지 못하며, DB 커넥션 풀, 잠금, 동기화된 레거시 라이브러리, ThreadLocal 남용, 관측성 부재라는 근본적인 아키텍처 결함을 자동으로 고쳐주는 면죄부가 아니다. 실제 현장에서는 spring.threads.virtual.enabled=true 옵션 하나 켜는 것으로 때우려다 pinned virtual threads 문제로 처리량이 무너져도 원인 프로파일링조차 하지 못한다. 이름만 최신 기술로 갈아끼운 eGovFrame 5.0.0 공식 샘플 조차도 그 내부 구조를 열어보면 여전히 controller, service, repository, context/SessionContext 같은 전형적인 스프링식 골격 안으로 비즈니스를 무지성으로 빨아들이고 있다. 시스템이 모놀리스로 남으면 배포 단위와 장애 범위가 통제 불능으로 비대해지고, 유행을 따라 마이크로서비스 흉내를 내면 정작 아무 일도 안 하는 idle memory 고정비가 누적되며 오토스케일링 과정에서의 cold start와 warm pool 인프라 비용, 그리고 관측성 비용이 폭발한다. 자바냐 아니냐의 문제가 아니라 배포 단위와 운영 경계를 설계할 능력 자체가 부재한 상태에서 스택만 기계적으로 복제하고 있는 게 현실이다.
현대적인 소프트웨어 아키텍처의 핵심은 프레임워크를 종교처럼 받드는 것이 아니라 해결해야 하는 문제의 성질에 맞춰 가장 최적의 런타임과 프레임워크를 유연하게 선택하는 능력에 있다. 웹 API 요청을 표준 기반으로 가볍고 신속하게 처리해야 할 때는 Bun이나 Cloudflare Workers 위에서 Hono 프레임워크를 활용하고, 메모리 배치와 시스템 경계를 직접 통제하며 예측 가능한 지연 시간과 작은 배포 단위, 낮은 런타임 의존성을 쥐어짜야 할 때는 Rust를 도입해야 한다. 또한 프론트엔드와 BFF 아키텍처의 일원화를 통해 비즈니스 전환 속도를 극대화할 때는 TypeScript를 쓰고, 대규모 데이터 파이프라인과 인공지능을 결합할 때는 Python 생태계를 활용하는 것이 상식이다. Go나 Rust가 무조건 자동으로 승리하는 만능 열쇠라서가 아니라, 런타임 모델과 배포 단위가 작고 명확하여 작은 엔지니어링 팀이 수많은 서비스를 안정적으로 굴리며 운영비와 장애 발생 표면을 획기적으로 줄일 수 있기 때문이다. 이 명백한 대체 선택지들과 문제별 선택 판단 능력을 완전히 거세한 채 오직 자바라는 단 하나의 규격으로 모든 도메인의 문제를 무차별적으로 찍어 누르는 대한민국 SI 산업은 기술적으로 이미 파산했다.
ㄹㅇ
매우 지루하고 현학적
이라고 SI 땔깜 새끼 ㅂㄷㅂㄷ 거리넼ㅋㅋㅋㅋㅋ
제미나이가 쓴거라니까
@로디짱 제미나이가 역시 똑똑해
@로디짱 첫 문단에서 오랜 조달 관행에서 벌써 구린내 스멀스멀 나지 않노 ㅋㅋㅋ
공감 Ai 나오고 업무에서 자바쓰는 비중이 매우 줄어듬 예전에는 신규 시스템에 무지성 자바였다만 요새는 혼자 여러 시스템 운영 가능해서 상황에 맞게 c++ python node 섞어서 쓰는중