Preview

[프리뷰] 서블릿의 한계를 넘어: Netty와 가상 스레드로 여는 Aspectran 9.7.0의 새로운 도약

최근 Aspectran은 글로벌 Web Frameworks Benchmark에서 Java 웹 프레임워크 종합 1위를 달성하며 전 세계 엔지니어들에게 압도적인 처리 성능과 효율성을 입증했습니다.

하지만 Aspectran의 도전은 여기서 멈추지 않습니다. 곧 다가올 Aspectran 9.7.0은 단순한 기능 추가나 버전 판올림을 넘어, Aspectran 웹 런타임 아키텍처의 패러다임을 근본적으로 전환하는 거대한 이정표가 될 예정입니다.

9.7.0의 정식 출시에 앞서, 이번 릴리즈가 왜 준비되었으며 어떤 혁신적인 변화를 담고 있는지 블로그를 통해 미리 공유해 드리고자 합니다.

1. 서블릿(Servlet) 생태계의 황혼과 현대 백엔드의 도전

지난 30년 가까이 자바 웹 개발의 절대적인 표준은 서블릿(Jakarta Servlet)이었습니다. Tomcat, Jetty, Undertow 같은 WAS 위에 WAR 파일을 배포하고, web.xml과 필터 체인을 거쳐 요청을 처리하는 모델은 수많은 엔터프라이즈 시스템의 든든한 버팀목이었습니다.

그러나 오늘날의 클라우드 네이티브(Cloud-Native), 컨테이너(Docker/K8s), 마이크로서비스(MSA) 환경에서 서블릿 생태계는 점점 무거운 족쇄가 되어가고 있습니다.

  • 복잡하고 무거운 WAS 오버헤드: 컨테이너 환경에서는 빠른 기동 시간(Cold Start)과 작은 메모리 점유율이 생명입니다. 하지만 전통적인 서블릿 컨테이너의 복잡한 클래스로더 계층, 스펙 검증, 무거운 라이프사이클 관리는 경량 컨테이너의 기동 속도를 갉아먹습니다.
  • 헤드리스(Headless) 아키텍처로의 전환: 과거에는 서버에서 JSP나 템플릿 엔진으로 HTML 화면을 직접 렌더링(SSR)했습니다. 하지만 오늘날 프론트엔드는 React, Vue, Next.js 등으로 완전히 독립했고, 백엔드는 순수한 JSON REST API와 실시간 WebSocket 데이터 서빙에 집중합니다. 화면 제어에 얽매여 있던 서블릿의 수많은 기능들은 현대 API 서버에게 불필요한 군더더기가 되었습니다.
  • 서블릿 스펙과 주변 생태계의 정체: 서블릿 3.1의 논블로킹 I/O 도입 이후, 패키지명이 javax에서 jakarta로 바뀐 것 외에 서블릿 스펙 자체의 근본적인 혁신은 멈추었습니다. 서블릿 기반의 대표적인 유틸리티(commons-fileupload, commons-io, JSP 태그 라이브러리 등) 역시 수년째 새로운 진화 없이 최소한의 유지보수에 머물러 있습니다.

2. 리액티브(Reactive Streams)의 이상과 실무의 환멸

서블릿의 ‘요청당 1스레드(Thread-per-request)’ 블로킹 모델이 대규모 동시성 처리에 한계를 드러내자, 지난 10여 년간 자바 진영을 휩쓴 거대한 물결은 Spring WebFlux를 위시한 리액티브 프로그래밍(Reactive Streams)이었습니다.

“적은 스레드로 수만 건의 동시 요청을 처리할 수 있다”는 약속은 매우 매혹적이었습니다. 그러나 그것이 엔터프라이즈 실무 현장에 도입되었을 때 요구한 대가는 너무나 가혹했습니다.

  • 가독성과 생산성의 붕괴 (Mono/Flux 지옥): 위에서 아래로 직관적으로 읽히던 순차적 비즈니스 코드가 사라지고, 모든 로직이 난해한 함수형 연산자 체인(flatMap, zip, switchIfEmpty)으로 파편화되었습니다. 코드 한 줄을 수정하는 것조차 거대한 인지적 부담이 되었습니다.
  • 검증된 엔터프라이즈 기술과의 단절: 요청 처리 도중 스레드가 수시로 바뀌면서 자바 엔터프라이즈의 근간이었던 ThreadLocal 기반 트랜잭션 관리와 보안 컨텍스트 전파가 무너졌습니다. 또한 수십 년간 검증된 JDBC, MyBatis, JPA 생태계를 온전히 활용하지 못하고 불안정한 R2DBC 드라이버에 의존해야 했습니다.
  • 디버깅과 장애 대응의 악몽: 예외가 발생했을 때 찍히는 에러 로그에는 정작 내가 작성한 비즈니스 코드는 보이지 않고, 수십 줄의 프레임워크 내부 스케줄러 스택만 출력되어 장애 원인을 추적하는 것이 극도로 고통스러웠습니다.

결국 수많은 기업들이 막대한 비용을 치르고 리액티브를 도입했다가 “유지보수가 불가능하다”, “장애 원인을 찾을 수 없다”며 다시 동기식 서블릿 모델로 뼈아프게 회귀하는 모습을 지켜보아야 했습니다.

우리는 묻지 않을 수 없었습니다. “동시성과 고성능을 얻기 위해 개발 생산성과 명확한 비즈니스 로직을 반드시 희생해야만 하는가?”

3. Aspectran 9.7.0의 해답: aspectran-with-netty

Aspectran 9.7.0은 이 딜레마에 대해 가장 명쾌하고 우아한 해답을 제시합니다. 바로 서블릿 컨테이너를 완전히 걷어낸 순수 논블로킹 경량 런타임 모듈, aspectran-with-netty의 탄생입니다.

글로벌 고성능 네트워크 표준인 Netty를 Aspectran의 독립적인 내장 서버 엔진으로 통합했습니다.

  • Servlet-less 순수 논블로킹 엔진: 톰캣이나 서블릿 컨테이너의 복잡한 계층 없이, Netty의 초고속 I/O 이벤트 루프가 클라이언트의 네트워크 소켓을 직접 접수합니다.
  • 외부 의존성 제로의 고성능 멀티파트 엔진: 서블릿에 의존하던 무거운 commons-fileupload 라이브러리를 완전히 배제했습니다. 대신 Netty 내장의 HttpPostRequestDecoder와 다이렉트 버퍼(ByteBuf)를 활용한 독자적인 NettyMultipartFormDataParser를 탑재하여 대용량 파일 업로드를 메모리 낭비 없이 초고속으로 처리합니다.
  • 제로 카피(Zero-Copy) 정적 자원 서빙: NettyResourceHandler는 OS 커널 레벨의 제로 카피 파일 전송(FileRegion), 청크 기반 전송, 캐시 유효성 검증(If-Modified-Since), 디렉터리 인덱스 파일 자동 탐색을 완벽히 지원합니다.
  • 표준 WebSocket (JSR-356) 완벽 호환: Netty 엔진 위에서 표준 WebSocket 엔드포인트를 손쉽게 구축할 수 있습니다.

4. 포스트 리액티브(Post-Reactive)의 완성: Netty와 Java 21 가상 스레드의 결합

그렇다면 비즈니스 로직은 어떻게 작성해야 할까요? 개발자가 또다시 복잡한 비동기 코드를 작성해야 할까요? 전혀 아닙니다.

Aspectran 9.7.0은 Netty의 고성능 논블로킹 I/OJava 21 가상 스레드(Virtual Threads, Project Loom)를 결합하여 완벽한 ‘포스트 리액티브’ 아키텍처를 완성했습니다.

[수만 건의 클라이언트 요청]
       ↓
[Netty I/O EventLoop]        ← 소수의 OS 스레드로 대규모 소켓 접수 (Non-blocking I/O)
       ↓ (Virtual Thread Dispatch)
[Java 21 Virtual Thread]     ← 요청마다 가상 스레드 1개 생성 (메모리 오버헤드 제로에 수렴)
       ↓
[Aspectran Translet]         ← 가장 직관적인 순차 동기식 코드로 비즈니스 로직 수행!
       ↓ (DB 조회 등 블로킹 I/O 대기 시)
[Carrier 스레드 자동 양보]   ← OS 스레드를 즉시 다른 작업에 양보하여 스레드 고갈 원천 차단
  • 네트워크 I/O 계층: Netty가 담당하여 대규모 동시 접속을 빛의 속도로 접수합니다.
  • 비즈니스 실행 계층: Java 21 가상 스레드가 담당합니다. 개발자는 복잡한 Mono/Flux 없이, 가장 직관적이고 친숙한 Aspectran의 동기식 코드(Translet, Action, Bean)를 작성합니다.
  • 완벽한 생태계 호환: 수십 년간 검증된 MyBatis, JPA, JDBCThreadLocal 기반 트랜잭션 관리가 아무런 제약 없이 100% 정상 작동합니다.

I/O 대기가 발생하면 가상 스레드는 OS 스레드(Carrier Thread)를 즉시 다른 요청에 양보하므로, 트래픽이 폭증해도 서버의 스레드가 고갈되어 멈추는 일이 없습니다.

“개발자에게는 가장 명확하고 편안한 비즈니스 개발 환경을 제공하고, 인프라에는 타협 없는 극단적인 성능을 제공한다.” 이것이 바로 Aspectran 9.7.0이 정의하는 차세대 런타임의 본질입니다.

5. 다른 Netty 프레임워크에는 없는 혁신: 진정한 ‘멀티 컨텍스트(Multi-Context)’ 지원

Spring WebFlux, Quarkus, Micronaut 등 현대적인 Netty 기반 프레임워크들은 대부분 “1 프로세스(컨테이너) = 1 애플리케이션 컨텍스트”라는 단순화된 모델에 갇혀 있습니다. URL 프리픽스(/api, /admin)로 경로를 나눌 수는 있지만, 그것은 단순한 문자열 라우팅일 뿐 모든 빈(Bean), 세션, 보안, 설정이 하나의 거대한 컨텍스트에 뒤섞입니다.

과거 서블릿 WAS(Tomcat, Jetty)는 하나의 포트(8080) 안에서 여러 개의 독립된 웹 애플리케이션(/, /admin, /api)을 클래스로더와 세션 레벨에서 완벽히 격리 배포할 수 있었습니다. 하지만 Netty 기반으로 넘어가면서 현대의 프레임워크들은 이 우아하고 강력한 모듈화 능력을 상실했습니다. 그 결과 관리자(/admin) 기능을 격리하려면 별도의 포트를 열거나, 아예 별도의 컨테이너 프로세스를 추가로 띄워야만 했습니다.

Aspectran with Netty는 서블릿의 가장 큰 장점(완벽한 컨텍스트 격리)과 Netty의 가장 큰 장점(초고속 논블로킹 I/O)을 결합하여 이 한계를 뛰어넘었습니다.

단 하나의 Netty 서버 포트(8080)에서:

  • 완벽한 DI 컨테이너 및 규칙 격리: / (루트 컨텍스트), /admin (관리자 컨텍스트), /api (공개 API 컨텍스트)가 각자 독립된 ActivityContext(Bean Registry, Aspect, Translet 규칙)를 가집니다. admin에서 사용하는 빈과 설정이 api 컨텍스트와 절대 충돌하지 않습니다.
  • 완벽한 세션 격리 (NettySessionManager): 컨텍스트마다 독립된 세션 쿠키 경로와 세션 매니저를 가집니다. 일반 사용자 세션과 관리자 세션이 메모리 및 저장소 레벨에서 완벽히 분리되어 높은 보안성을 보장합니다.
  • 독립적인 정적 리소스 및 WebSocket 바인딩: 컨텍스트별로 고유한 NettyResourceHandler와 WebSocket 리스너를 독립적으로 구성할 수 있습니다.
  • 독립적인 라이프사이클 제어: 메인 서버를 중단하지 않고도 특정 서브 컨텍스트만 동적으로 시작, 정지, 리로드할 수 있는 유연성을 제공합니다.

별도의 프로세스나 추가 포트 낭비 없이, 단 하나의 초고속 Netty 런타임 안에서 여러 엔터프라이즈 서브 애플리케이션을 깔끔하게 통합 운영할 수 있는 것은 오직 Aspectran만이 제공하는 독보적인 아키텍처적 우위입니다.

6. 웹 모듈의 우아한 구조적 혁신

이러한 도약에 발맞추어, Aspectran 9.7.0에서는 웹 모듈 체계도 가장 정교한 형태로 재편되었습니다.

  • aspectran-web (순수 웹 추상화 레이어):
    • 서블릿이나 외부 특정 라이브러리에 종속되지 않는 순수한 Web 추상화 레이어로 다이어트되었습니다.
    • 기존에 남아있던 서블릿 전용 commons-fileupload, commons-io 의존성을 완전히 제거하여 극단적인 경량화를 달성했습니다.
  • aspectran-web-servlet (Jakarta Servlet & JSP 전용 런타임):
    • 기존 WAS 배포, JSP 렌더링, 서블릿 필터/리스너 지원이 필요한 전통적인 엔터프라이즈 환경을 위해 완벽히 격리된 모듈로 제공됩니다.
    • 서블릿 환경을 위한 멀티파트 파서와 커스텀 JSP 태그 라이브러리가 이 모듈에서 안전하게 유지됩니다.

개발자는 서블릿 기반(aspectran-with-undertow, aspectran-with-jetty, aspectran-web-servlet)을 사용하든, 서블릿-리스 기반(aspectran-with-netty)을 사용하든 동일한 Aspectran 설정(XML, APON, Java Config)과 동일한 Translet 비즈니스 규칙을 단 한 줄의 수정 없이 그대로 사용할 수 있습니다.

7. 에필로그: 가장 실용적인 것이 가장 위대한 혁신이다

Aspectran은 결코 반짝이는 유행에 편승하지 않습니다. 오랜 시간 현장에서 묵묵히 엔터프라이즈 시스템을 지켜온 개발자들의 고충을 깊이 이해하고, 기술이 나아가야 할 가장 정직하고 실용적인 길을 고민해 왔습니다.

과거의 검증된 유산(서블릿/JSP)을 완벽히 존중하며 품어 안으면서도, 미래의 클라우드 마이크로서비스 표준(Netty & Virtual Threads)을 향해 거침없이 전진하는 것. 그것이 바로 Aspectran이 걸어온 길이자, 9.7.0이 여러분께 드리는 약속입니다.

더 가볍고, 더 빠르며, 더 견고해진 Aspectran 9.7.0의 정식 릴리즈를 기대해 주시기 바랍니다. 감사합니다.

NEWS
Aspectran Netty Virtual Threads Microservices Architecture Cloud Native

Archive