1. Vert.x란 무엇인가?
Eclipse Vert.x는 JVM에서 반응형 애플리케이션을 구축하기 위한 도구이다.
Vert.x는 프레임워크가 아니라 도구 모음이다. 핵심 라이브러리는 비동기 네트워크 애플리케이션을 작성하기 위한 기본 API를 정의하며, 애플리케이션에 유용한 모듈을 선택할 수 있다 (예: 데이터베이스 연결, 모니터링, 인증, 로깅, 서비스 검색, 클러스터링 지원 등). Vert.x는 JVM을 위한 고성능 비동기 네트워킹 라이브러리인 Netty 프로젝트를 기반으로 한다. 필요시 Netty 내부를 접근할 수 있지만, 일반적으로 Vert.x가 제공하는 상위 수준의 API를 활용하여 성능을 희생하지 않고도 더 많은 이점을 얻을 수 있다.
Vert.x는 어떤 패키징이나 빌드 환경도 강요하지 않는다. Vert.x 코어 자체는 정규 Jar 라이브러리이기 때문에 Jar 세트로 패키징된 애플리케이션 내부에 임베드되거나, 모든 종속성을 포함한 단일 Jar로 패키징되거나, 인기있는 구성 요소 및 애플리케이션 컨테이너 내부에 배포될 수 있다.
Vert.x는 비동기 통신을 위해 설계되었기 때문에 Java 서블릿이나 java.net 소켓 클래스와 같은 동기 API보다 적은 스레드로 더 많은 동시 네트워크 연결을 처리할 수 있다. Vert.x는 대량 메시지/이벤트 처리, 마이크로서비스, API 게이트웨이, 모바일 애플리케이션을 위한 HTTP API 등 다양한 애플리케이션에 유용하다. Vert.x와 그 생태계는 종단 간 반응형 애플리케이션을 구축하기 위한 모든 종류의 기술 도구를 제공한다.
Vert.x는 요구가 많은 애플리케이션에만 유용하다고 생각할 수 있지만, 이 가이드는 Vert.x가 전통적인 웹 애플리케이션에도 잘 작동한다고 명시하고 있다. 코드가 상대적으로 이해하기 쉬운 상태로 유지되지만, 애플리케이션이 갑작스러운 트래픽 피크에 직면해야 할 경우, 코드가 이미 확장을 위한 필수 요소인 이벤트의 비동기 처리로 작성되어 있다.
Vert.x에서 언어를 지원할때의 목표는 단순히 API에 대한 접근을 제공하는 것이 아니라, 각 대상 언어에서 언어 특유의 API가 관용적이도록 하는 것이다 (예: Vert.x futures 대신 Scala futures 사용). Vert.x 애플리케이션의 다양한 기술적 부분은 다른 JVM 언어를 사용하여 개발하는 것이 가능하다.
2. 핵심 Vert.x 개념
Vert.x에서 배워야 할 두가지 주요 개념이 있다:
1. verticle이 무엇인지,
2. 이벤트 버스가 어떻게 verticle 간의 통신을 가능하게 하는지.
2.1. 스레딩 및 프로그래밍 모델
많은 네트워킹 라이브러리와 프레임워크는 간단한 스레딩 전략에 의존한다.
각 네트워크 클라이언트는 연결시 스레드가 할당되고, 이 스레드는 클라이언트가 연결을 끊을 때까지 처리한다:
이는 서블릿 또는 java.io, java.net 패키지로 작성된 네트워킹 코드의 경우다. 이 "동기 I/O" 스레딩 모델은 이해하기 쉽다는 장점이 있지만, 시스템 스레드는 저렴하지 않기 때문에 너무 많은 동시 연결로 인해 확장성이 저하된다. 이러한 경우 "비동기 I/O"로 이동해야 하며, Vert.x는 이를 위한 견고한 기반을 제공한다.
Vert.x에서 배포 단위는 Verticle이라고 한다. Verticle은 이벤트 루프를 통해 들어오는 이벤트를 처리하며, 이벤트는 네트워크 버퍼 수신, 타이밍 이벤트, 다른 verticle에서 보낸 메시지 등 무엇이든 될 수 있다. 이벤트 루프는 비동기 프로그래밍 모델에서 일반적이다:
각 이벤트는 이벤트 루프를 차단하지 않도록 적절한 시간 내에 처리되어야 한다. 이는 이벤트 루프에서 실행되는 동안 스레드 차단 작업이 수행되지 않아야 함을 의미한다. 이는 그래픽 사용자 인터페이스의 이벤트를 처리하는 것과 유사하다. (예: 느린 네트워크 요청으로 인해 Java / Swing 인터페이스가 멈추는 경우) 이 가이드에서 나중에 보게 되겠지만, Vert.x는 이벤트 루프 외부에서 차단 작업을 처리할 수 있는 메커니즘을 제공한다. 어떤 경우든 Vert.x는 이벤트 루프가 너무 오랫동안 이벤트를 처리하고 있을때 로그에 경고를 발행하며, 이는 애플리케이션의 특정 요구 사항에 맞게 구성할 수 있다 (예: 느린 IoT ARM 보드에서 작업할 때).
각 이벤트 루프는 스레드에 연결된다. 기본적으로 Vert.x는 CPU 코어 스레드당 2개의 이벤트 루프를 연결한다. 이로 인해 일반적인 verticle은 항상 동일한 스레드에서 이벤트를 처리하므로 verticle 상태를 조작하기 위해 스레드 조정 메커니즘을 사용할 필요가 없다 (예: Java 클래스 필드).
Verticle은 일부 구성 (예: 자격 증명, 네트워크 주소 등)을 전달받을 수 있으며, 여러번 배포될 수 있다:
수신 스레드에서 수신된 네트워크 데이터는 해당 verticle에 이벤트로 전달된다. Verticle이 네트워크 서버를 열고 여러개 배포되면, 이벤트는 라운드 로빈 방식으로 verticle 인스턴스에 분배되어 많은 동시 네트워크 요청으로 CPU 사용을 최적화하는데 매우 유용하다. 마지막으로, Verticle은 간단한 시작/중지 라이프사이클을 가지며, 다른 Verticle을 배포할 수 있다.
2.2. 이벤트 버스
Verticle은 Vert.x에서 코드의 기술적 배포 단위이다. Vert.x 이벤트 버스는 다양한 verticle이 비동기 메시지 전달을 통해 통신할 수 있는 주요 도구이다. 예를 들어 HTTP 요청을 처리하는 verticle과 데이터베이스에 접근하는 verticle이 있다고 가정해보자. 이벤트 버스는 HTTP verticle이 데이터베이스 verticle에 SQL 쿼리를 수행하도록 요청을 보내고, 데이터베이스 verticle이 HTTP verticle에 응답할 수 있도록 한다:
이벤트 버스는 어떤 종류의 데이터도 전달할 수 있지만, JSON은 다양한 언어로 작성된 verticle 간의 통신을 가능하게 하고, 일반적으로 JSON은 인기 있는 범용 반구조화 데이터 마샬링 텍스트 형식이기 때문에 선호되는 교환 형식이다.
메시지는 자유 형식 문자열인 목적지로 보낼 수 있다. 이벤트 버스는 다음과 같은 통신 패턴을 지원한다:
1. 포인트 투 포인트 메시징
2. 요청-응답 메시징
3. 메시지 브로드캐스트를 위한 발행/구독
이벤트 버스는 동일한 JVM 프로세스 내에서뿐만 아니라 투명하게 통신할 수 있도록 한다:
- 네트워크 클러스터링이 활성화되면, 이벤트 버스는 분산되어 다른 애플리케이션 노드에서 실행 중인 verticle에 메시지를 보낼 수 있다.
- 이벤트 버스는 타사 애플리케이션이 통신할 수 있도록 간단한 TCP 프로토콜을 통해 접근할 수 있다.
- 이벤트 버스는 일반적인 메시징 브릿지 (예: AMQP, Stomp)로도 노출될 수 있다.
- SockJS 브릿지는 웹 애플리케이션이 브라우저에서 실행되는 JavaScript를 통해 이벤트 버스를 통해 메시지를 수신하고 발행하여 다른 verticle 처럼 원활하게 통신할 수 있도록 한다.
'프로그래밍(TA, AA) > JVM 언어' 카테고리의 다른 글
Java Concurrency(1) - 동시성 모델 (0) | 2025.06.16 |
---|---|
[Vert.x] Vert.x in Action (1) - Verticle: Vert.x의 기본 처리 단위 (0) | 2025.06.07 |
[Spring] Spring Cloud Config (0) | 2023.10.21 |
[Java] 자바 병렬 프로그래밍(5) - 구성 단위 (0) | 2023.05.15 |
[Java] 자바 병렬 프로그래밍 - Lock Striping (0) | 2023.04.24 |