개발일기/Spring + Unix Domain Socket

[Spring + UDS] 1. 사건의 발단…

ignuy 2024. 8. 8.

지난주 ICTK에서의 업무가 정해졌다. 기존에 공부했던 웹 개발 스펙을 활용하여 qTrustVPN의 관리자 웹을 개선하는 것이다. 기존 시스템은 구조가 상당히 특이하다. frontend는 Vue.js(Vue2), 웹서버로 nginx, 그리고 nginx에 혹처럼 달려있는 php fpm, WAS로 c로 작성된 daemon(이하 c server라 말함)이 동작하고 있고 php와 c server가 UDS(Unix Domain Socket)을 활용하여 통신하고 있었다.

기존에 프로젝트에 웹 개발 경험자가 없어서 구조가 특이하게 잡혔고 php와 c를 활용하여 개발하다 보니 구조가 이렇게 잡혔다고 들었다.

현재로 돌아와서 새로운 시스템을 만드는데에 기술적인 제약을 두고 있지 않고 여러 기술 스택을 오픈마인드로 본다고 하니 php fpm과 c server의 기능을 Spring Boot로 3개월 내에 합칠 계획이었다. 하지만, 사이즈가 생각보다 커서 한 번에 바꾸기는 어렵고 c server가 컴퓨터 리소스에 로우레벨로 직접적으로 맞닿아 있는 부분이 많다 보니 모든 부분을 Spring Boot로 이관하기엔 시간적 제약이 분명했다. 따라서 Vue.js - Spring Boot - C server 형태의 layer 구조를 만들 계획이다.

문제는?

Spring은 Tomcat이라는 Http 기반의 서블릿 컨테이너이자 웹 서버를 내장하고 이를 주 엔진으로 돌리고 있기 때문에 Domain socket이라는 IPC 기반 통신에 대한 지원이 미약하다. 따라서 오픈소스 라이브러리를 활용하거나 직접 구현(현실적으로 이건 시간상 여건이 안된다)하여 UDS를 지원할 수 있는 커스텀 빈을 만들어야 했다.

굳이 그렇게 해야하나?

Vue.js - Spring Boot - C Server를 원래 있던 엔드포인트를 정리하지 않고 시작하면 프로젝트 복잡성이 과하게 증가할 것이다. Vue.js는 http 기반 통신으로 Spring boot를 통해 필요한 정보를 응답받고, Spring Boot는 중간중간 UDS를 통해 시스템 리소스에 관련되거나 시스템 커맨드를 활용할 일이 있을 때 C server에 접근하도록 하는 Layer 구조가 각 서버 간 복잡성, 독립성, 목적성 측면에서도 모두 강점이 있을 것이라 판단했다.

두 아키텍처 비교

 

댓글