이번 Aspectow v4.2.0 릴리즈는 Aspectran 9.8.0 연동 및 Netty(aspectran-with-netty) 임베디드 서버 엔진 전면 지원, AppMon 대시보드의 실시간 시계열 메트릭 시각화(인라인 스파크라인 및 팝오버 상세 차트), 초경량 락프리(Lock-Free) Redis 커넥션 풀 아키텍처 전환, 그리고 MaxMind GeoIP2 기반 경량 IPCountryResolver 신규 도입을 중심으로 한 대규모 기능 및 성능 혁신 릴리즈입니다.
서블릿 컨테이너 없이 구동되는 고성능 비동기 Netty 런타임을 appmon-demo 및 console-demo의 기본 서버 엔진으로 채택하여 마이크로서비스 운영 효율성을 극대화하였으며, 대시보드 모니터링 메트릭의 직관적인 트렌드 분석 기능, commons-pool2를 배제한 고성능 Lettuce 공유 커넥션 풀링, 정밀한 세션 수명 주기 추적과 UI/UX 개선을 통해 플랫폼 관리의 신뢰성과 운영 편의성을 대폭 향상했습니다.
🚀 새로운 기능
- Aspectran 9.8.0 기반 Netty (
aspectran-with-netty) 임베디드 서버 엔진 지원 및 기본화appmon-demo및console-demo모듈의 기본 웹 서버 엔진으로aspectran-with-netty를 도입하고 기본 의존성 구조를 Netty 기반으로 전환했습니다.NettyServerPortProvider를 구현하여 Netty 서버에서 동적으로 할당된 활성 포트를 획득하고 Console 및 AppMon 서비스 간에 유연하게 공유하도록 지원했습니다.- 가상 스레드(Virtual Threads) 환경에서 스레드 메트릭을 정밀하게 측정하기 위해 피크 동시 요청 수(
getPeakRequests())를 총 용량으로 산출하는NettyThreadPoolMetricsReader를 도입했습니다. - Netty와 Undertow 전반에 걸쳐 표준 WebSocket 서버 컨테이너(
WebSocketServerContainer) 설정 및 세션 처리 구조를 일원화했습니다. - 접근 로그 구성을
logback-undertow에서 표준화된logback-accesslog로 통합했습니다.
- AppMon 대시보드 실시간 메트릭 시각화 (인라인 스파크라인 및 팝오버 상세 차트)
- AppMon 대시보드 메트릭 바(Metrics Bar)의 각 지표(CPU, Heap, 세션, 스레드 풀, 커넥션 풀 등)에 인라인 스파크라인(Sparkline)을 추가하여 최근 시계열 추세를 한눈에 직관적으로 파악할 수 있도록 UI를 개선했습니다.
- 각 메트릭 아이템 클릭 시 상세 시계열 추이와 최소/최대/평균 통계를 확인할 수 있는 인터랙티브 팝오버(Detail Popover) 상세 차트 기능을 추가했습니다.
MetricInfo및MetricData에 메트릭 단위(unit, 예:%,MB,conn,req) 지원 필드를 추가하고, 대시보드 뷰어에서 단위에 맞춘 정밀한 포맷팅 및 값 렌더링 로직을 구현했습니다.
- 초경량 락프리(Lock-Free) Redis 커넥션 풀 아키텍처 도입
- 무겁고 락 경합이 발생하는
commons-pool2의존성을 완전히 제거했습니다. - Lettuce 기반의 락프리 스트라이프(Lock-free Striped) 공유 커넥션 구조(
RedisConnectionPool)로 전면 리팩토링하여 멀티스레드 동시성 환경에서의 커넥션 획득 오버헤드와 블로킹을 원천 차단했습니다. - 복잡하던 기존 커넥션 풀 설정을 단일
poolSize프로퍼티 중심으로 대폭 간소화하고, 레거시 하위 호환성 프로퍼티 및 메서드를 정리했습니다. - Redis 메시지 릴레이 파싱 로직을 개선하여 Netty 이벤트 루프 스레드의 블로킹을 방지하고 배치 퍼블리싱(Batch Publishing) 성능을 최적화했습니다.
- 무겁고 락 경합이 발생하는
- MaxMind GeoIP2/GeoLite2 기반 경량
IPCountryResolver신규 구현- 고성능 경량 리더인
maxmind-db(v4.1.0)를 직접 활용하여 MaxMind GeoIP2 및 GeoLite2 바이너리 데이터베이스(.mmdb) 파일 기반의MaxMindIPCountryResolver를 신규 구현했습니다. - 파일 시스템 절대/상대 경로뿐만 아니라 JAR 내부 클래스패스 리소스(
classpath:...) 경로로부터 데이터베이스를 직접 로드할 수 있도록 유연성을 강화했습니다.
- 고성능 경량 리더인
- CPU 사용률 메트릭 리더 (
CpuUsageMetricsReader) 신규 추가- JVM 프로세스 및 전체 시스템의 CPU 사용률을 실시간 수집하는
CpuUsageMetricsReader를 추가하고 메트릭 수집 주기를 최적화했습니다.
- JVM 프로세스 및 전체 시스템의 CPU 사용률을 실시간 수집하는
🚀 개선 사항
- Undertow 및 Netty 컨텍스트 배포 순서(
order) 및 라이프사이클 최적화TowServletContext및NettyContext의order프로퍼티를 활용하여 Console 컨텍스트를 최하위 배포 순서로 설정함으로써, 다른 의존 컨텍스트들이 완전히 기동된 후 콘솔이 활성화되도록 배포 라이프사이클을 보장했습니다.NettyContext및 서버 컨텍스트 설정 빈에prototype스코프를 적용하여 컨텍스트 재시작 및 동적 재배포 시의 인스턴스 격리를 강화했습니다.
- 세션 수명 주기 추적 및 만료 타이머(
SessionEventReader) 정밀화- Aspectran 9.8.0의
getRemainingInactiveInterval및getMaxInactiveInterval과 연동하여 비활성 세션 및 임시 상주 세션(isTempResident)의 잔여 시간을 정확히 계산하고 세션 축출(Eviction) 타이머를 정밀하게 갱신하도록 개선했습니다. SessionEventReader의 동기화 구조를 간소화하고SessionManager직접 바인딩 방식으로 라이프사이클 리스너를 개편했습니다.- 서비스 재시작 시
UserTrackingListener가 누락 없이 안전하게 교체 등록되도록 보정했습니다. - 일관된 명명 규칙을 위해 세션 쿠키 이름에서 대시(
-) 대신 언더스코어(_)를 사용하도록 변경했습니다 (ASPECTOW_SESSION_ID등).
- Aspectran 9.8.0의
- 프록시 포워딩 및 쿠키 발급 API 현대화
WebConfig의proxyAddressForwarding설정을 표준화하고 노후화된proxyProtocolAware옵션을 제거했습니다.- Aspectran 9.8.0의 신규
Cookie.builder()및WebUtils쿠키 헬퍼 API를 적용하여AppMonCookieIssuer및 콘솔 세션 쿠키 발급 로직을 리팩토링했습니다.
- 대시보드 메트릭 바 레이아웃 및 반응형 UI 스타일 개선
- 대시보드 상단 메트릭 바의 레이아웃을 리스트럭처링하고 다크 모드 및 라이트 모드에서의 보더 대비(Contrast)와 가독성을 향상했습니다.
- CPU, Heap 등 주요 메트릭 박스의 반응형 최소 너비(
min-width) 및 탭 스타일 CSS를 보정하여 다양한 해상도에서의 정렬 깨짐을 방지했습니다.
- WebSocket 클라이언트 에러 핸들링 및 토큰 수명 주기 개선
WebSocketClient의 에러 핸들링 및 자동 재연결(Reconnect) 로직을 최적화하고, 무효 토큰 수신 시의 불필요한 ERROR 로그를 DEBUG 레벨로 완화했습니다.- Console 환경에서 WebSocket 인증 토큰 획득 및 연결 수명 주기 제어를 안정화했습니다.
- 정적 에셋 번들링 빌드 파이프라인 개선
- Maven 빌드 구성(
.mvn/bundle-assets.js)에서 Node.js 번들링 실행 시 인자를 명시적으로 전달하도록 개선했습니다. - Thymeleaf 템플릿의 로컬 에셋 임포트 링크에 최신 캐시 무효화 파라미터(
v=20260909)를 적용했습니다.
- Maven 빌드 구성(
🐛 버그 수정
- 클러스터 재조인(Cluster Rejoin) 시 비동기 노드 중복 렌더링 방지
- 노드가 클러스터에 재참여할 때 비동기 노드 재구성 동시성 경합으로 인해 대시보드 상에 동일 노드가 중복 렌더링되던 현상을 비동기 락 제어로 해결했습니다.
- 신규 노드 참여 알림 시 초기화 완료 시간을 확보할 수 있도록 대시보드 알림 딜레이 처리를 추가했습니다.
- PENDING 상태 빌드 실행 취소 시 UI 미반영 오류 수정
- 대기 중(
PENDING)인 빌드 실행을 취소했을 때 백엔드 상태 취소와 동시에 UI 화면에 즉각적으로 반영되지 않던 문제를 수정했습니다.
- 대기 중(
- 세션 비활성 타이머 설정 시 음수 인터벌 예외 방어
SessionEventReader및 대시보드 뷰어에서inactiveInterval이 0 이하인 경우 타이머가 오작동하지 않도록 양수 조건 방어 로직을 추가했습니다.
- 비임시 상주 세션의 제로 액티비티 카운트 처리 보정
- 비임시 상주(non-temp resident) 세션의 액티비티 카운트가 0인 경우에도 세션 이벤트가 유실되지 않도록 처리를 보정했습니다.
🛠️ 의존성 라이브러리 업그레이드
- 프레임워크 및 코어 컴포넌트
- Aspectran: 9.6.5 → 9.8.0
- Aspectran with Netty (
aspectran-with-netty): 9.8.0 (신규 도입)
- 데이터베이스 및 IP 분석 라이브러리
- MaxMind DB Reader (
maxmind-db): 3.1.1 → 4.2.0 (신규 도입) - H2 Database: 2.4.240 → 2.5.252
- MaxMind DB Reader (
- 빌드 및 플러그인
- Maven Compiler Plugin: 3.15.0 → 3.16.0
- Maven Surefire Plugin: 3.5.6 → 3.6.0
- Maven Bundle Plugin: 6.1.0 → 6.1.2
Juho Jeong NEWS
Release