본문 바로가기

개발

Service 기반 시스템 권한 기능 구현기 — JSON 프로토콜과 OS 추상화 설계

들어가며

지난 글에서 시스템 권한을 안전하게 사용하기 위한 아키텍처를 설계했다.

2025.12.03 - [개발] - Windows·Linux에서 시스템 권한을 다루는 올바른 아키텍처 설계

Service Architecture

이번 글에서는 그 아키텍처를 기반으로 실제 동작하는 기능을 구현해 본 과정을 정리해 보려 한다.

우선 빠르게 기능을 검증하기 위해 Windows 환경만을 대상으로 최소 기능의 Service 프로그램을 만드는 것을 목표로 했다.

먼저 서비스 프로그램에 필요한 기능들을 쭉 나열해 보았다.

* 서비스 프로그램의 구현 CheckList
☐ IPC통신 기능 (↔Application, QLocalSocket)
☐ 시스템권한 기능
ㄴ☐ Service 프로토콜 설계/개발
ㄴ☐ 시간 쓰기 처리 기능
☐ Windows Installer에 추가 (후순위)
☐ Linux Installer에 추가 (후순위)

우선순위를 따지기보다 할 수 있는 것부터 빠르게 구현하는 방식으로 접근했다.
Installer는 후순위로 미루고, IPC와 서비스 구조를 먼저 잡았다.

역할을 최소화한 Service 구현

Windows Service 개발은 윈도우 API만 이해하면 기본 흐름을 잡는 데 어렵지 않았다.
Qt 프로젝트를 하나 추가하고 간단한 등록/실행 테스트를 해보며 동작을 확인했다.

다만, 서비스는 디버깅이 매우 불편하기 때문에
개발 초반에는 exe를 직접 실행하면 Console 모드로 실행되도록 분기해 개발 효율을 높였다.

 

☑ Service 프로토콜 설계/개발

관리자 권한이 필요한 기능들은 실시간성이나 대량 호출이 없기 때문에,
가독성과 확장성이 좋은 JSON 기반 프로토콜로 구성했다.

필드 크기 설명
Length 4 byte         이후 JSON 데이터 바이트 수
Payload N byte JSON 문자열 (UTF-8)

ex) 통신 프로토콜 문서화에 들어가는 요청/응답 예시

요청

{

    "version": 1,

    "type": "request",

    "cmd": "SET_TIME",

    "req_id": 1,

    "auth": "TOKEN_STRING",

    "data": { … }

}

응답

{

    "version": 1,

    "type": "response",

    "cmd": "SET_TIME",

    "req_id": 1,

    "result": "ok",

    "data": { … }

}

실패 케이스를 대비해 "error_code", "error_msg" 필드도 초안에 포함했다.

프로토콜만 정리되면 구현은 어렵지 않다.
Qt의 QJsonObject를 활용해 빠르게 처리할 수 있었고, AI도 단순 반복 코드는 잘 만들어줘 큰 도움이 됐다.

 

☑ 시간 쓰기 처리 기능

서비스는 관리자 권한으로 동작하므로 시간 설정 자체는 단순하지만,
앞으로 Windows / Linux 각각 다른 방식을 호출해야 한다는 점을 고려해
OS별로 클래스를 추상화해 구조를 잡았다.

“서비스는 최소한의 역할만 수행하고, OS별 구현은 클래스로 분리한다.”

이 원칙을 적용하니 코드가 단순해지고 기능 확장이 쉬워졌다.

OS별로 설계된 Class

TDD를 따른다면 유닛 테스트를 작성한 후 Class를 통해 시간이 잘 변경되는지 테스트를 작성해야 할 것이다.
난 TDD를 싫어하고, 여기선 필요성 또한 느껴지지 않아 생략했다.

회고.

이번 기능 개발에서 특히 느낀 것은 개발 속도가 눈에 띄게 빨라졌다는 점이다.
JSON 구조 활용, 그리고 Gemini CLI AI를 적극적으로 사용하면서
내가 직접 구현하면 돌아갔을 법한 코드를 AI가 순식간에 정리해 주니
설계에 더 집중할 수 있었다.

특히 프로토콜 문서화처럼 반복적이고 부정확해지기 쉬운 작업에서 AI가 큰 도움이 됐다.
그럼에도 개발 과정에서 AI가 클래스 분리나 구조적 설계는 스스로 못 챙기는 부분을 보며

결국 아키텍처는 개발자가 직접 책임져야 한다는 걸 다시 느꼈다.

* 서비스 프로그램의 구현 CheckList
☐ IPC통신 기능 (↔Application, QLocalSocket)
☑ 시스템권한 기능
ㄴ☑ Service 프로토콜 설계/개발
ㄴ☑ 시간 쓰기 처리 기능
☐ Windows Installer에 추가 (후순위)
☐ Linux Installer에 추가 (후순위)

Ps. IPC통신 기능을 QLocalSocket으로 설계했다가 문제를 만나 QTcpSocket으로 변경했다. 관련된 내용은 다음 포스팅으로 작성하려 한다.