Nitro는 Tomcat과 비교하면 훨씬 경량화된 서버 환경으로, 특히 서버리스와 엣지 컴퓨팅 환경에 맞춰져 있다는 점에서 큰 차이가 있습니다. Tomcat은 전통적인 웹 애플리케이션 서버(WAS)로, Java Servlet 기반의 요청/응답 파이프라인을 유지하고 있으며, 스레드 풀 관리, 세션 관리, 컨텍스트 간 통신, JSP 컴파일 등 다양한 기능을 포함합니다.
이에 반해 Nitro는 단일 스레드 이벤트 루프를 기본으로 하며, 주요 초점은 빠르고 유연한 배포입니다.
Nitro의 내부 작동 방식과 주요 요소
-
라우팅과 요청 처리
- Nitro의 라우팅은 Nuxt의 파일 기반 라우팅을 사용하여, 파일 위치에 따라 자동으로 라우트를 설정합니다.
- Tomcat의 경우
web.xml
이나 어노테이션 기반의 매핑으로 요청을 특정 서블릿으로 전달합니다. 반면, Nitro는 프레임워크가 URL과 파일 시스템을 동기화해 적합한 핸들러에 요청을 매핑합니다.
실제 파일시스템을 유지하면서 거기서 핸들러에 요청하는거였다니…
그리고 내부에 핸들러가 있긴 한가보다…
- 각 요청은 이벤트 루프 기반으로 비동기 처리되어 스레드 풀이나 블로킹 I/O를 피합니다. 이 방식은 Tomcat의 스레드 풀을 사용하는 동기식 모델과 차별화됩니다.
이게 가장 큰 차이일듯. 자바진영과 node진영의 가장 큰 차이이기도 하다. 멀티 쓰레딩 환경이 아니라서 컨테이너나 싱글톤 이런 이야기가 이 진영에선 안나오는 걸지도…
-
서버리스와 엣지 네트워크 지원
- Nitro는 기본적으로 서버리스 아키텍처에 최적화된 서버로, 요청이 발생할 때 필요한 리소스를 호출하여 비용 효율성을 극대화합니다.
서버리스 아키텍쳐는 진짜 서버가 없다는게 아니라, 개발자가 서버를 생각할 필요 없다는 의미임. 서버관리와 확장을 지가 알아서 하겠다는 느낌…
요청이 필요할때 필요한 리소스를 호출한다는건 지연로딩을 말하는듯. 서버가 소스코드 빌드할때 모든 소스코드를 다 가져가는게 아니라 리소스가 필요할때 빌드해서 제공하는 방식…?
- Tomcat처럼 항상 서버가 떠 있는 상태가 아닌, 사용자가 요청할 때마다 새로운 환경에서 응답을 생성할 수 있습니다.
- 이 구조는 엣지 네트워크에서 빠른 응답을 위해 설계된 것으로, 클라우드의 분산된 노드에서 Nitro가 동작하게 됩니다. 이 과정은 Tomcat과 달리 특정 서버가 아닌 분산된 노드에서 요청을 처리할 수 있게 합니다.
-
빌드 및 배포 방식
- Nitro는 빌드 단계에서 서버 및 API 핸들러를 코드에서 분리하고, 필요한 최소한의 아티팩트만 남겨 배포합니다.
- Tomcat은 배포 시, Java 클래스를 바이트 코드로 컴파일하고, 이를 특정 환경에 맞게 서블릿 컨테이너에 배포합니다.
- Nitro는 JavaScript 코드를 서버리스 환경에서도 동작할 수 있도록 번들링하고, 서버리스 클라우드 환경에 맞게 배포하며, 필요 없는 종속성을 제거해 서버리스 환경에 최적화합니다.
-
미들웨어와 확장성
- Nitro는 미들웨어로 확장 가능하며,
@nuxt/nitro
모듈을 통해 미들웨어를 적용할 수 있습니다. 이는 서버리스 기능을 사용할 때도 클라우드 환경에서 쉽게 확장됩니다.
- Tomcat에서는 필터(Filter)를 통해 요청의 전후 처리를 하며, 각 필터는 서블릿 컨텍스트 내부에서 처리됩니다. 반면, Nitro는 다양한 환경에서 비동기로 동작하는 미들웨어가 추가되기 때문에, 애플리케이션에 미치는 부하가 적고 유연성이 높습니다.
미들웨어가 필터와 대응된다는건 역시 맞는 아이디어인듯…
다만 필터는 동기적으로 동작함. 하지만 미들웨어는 비동기로 동작한다.
-
리스소 관리와 로드 균형
- Nitro는 서버리스 환경에서 요청 기반으로 리소스를 할당하며, 엣지 환경에서는 지역 노드에서 리소스를 배포해 최적의 경로를 찾습니다.
- Tomcat은 서버 자원을 각 요청에 대해 스레드를 할당하며 세션을 유지하는 방식으로 리소스를 관리합니다. Nitro는 사용자 세션 대신 클라우드 기반의 캐싱이나 쿠키로 세션을 대체하며, 여러 사용자 요청이 같은 엣지 서버에서 캐시된 데이터를 공유하는 방식으로 효율성을 높입니다.
핵심 요약
- 비동기 단일 이벤트 루프 기반으로, Nitro는 서버리스와 엣지 환경에 적합하며 동시성에 있어 Tomcat보다 경량화되어 있습니다.
- 라우팅과 요청 처리가 파일 기반이고, 각 요청에 대해 비동기적으로 응답합니다.
- 서버리스 및 엣지 배포 환경을 위한 최적화와, 빌드 시점에 최소화된 배포 아티팩트만 생성하여 빠른 응답을 지원합니다.
이러한 차별화 요소는 Nitro가 Tomcat 같은 전통적인 WAS 서버와 달리, 서버리스와 클라우드 기반의 확장성과 민첩성에 최적화된 서버 솔루션임을 보여줍니다.
상태관리
상태 관리:
- Tomcat: 서버가 HTML을 생성하는 동안 서버에서 세션이나 쿠키를 이용해 상태를 관리할 수 있습니다. 각 요청에 대해 필요한 데이터를 서버에서 불러와 HTML을 렌더링합니다.
- Nuxt: 서버사이드 렌더링 시 클라이언트의 상태나 데이터는 Vuex 또는 Pinia 같은 상태 관리 라이브러리를 통해 관리합니다. Nuxt는 SSR 요청에 필요한 데이터를 API 호출로 불러오고, 렌더링이 끝난 HTML과 함께 클라이언트로 전송합니다.