백엔드 개발자로서 항상 자신이 만들고 있는 서비스가 안정적인지, 이게 최선인지 고민해 보아야 한다.
나 역시 곧 1차 릴리즈를 앞두고 있다. 많은 고민 끝에 기술을 결정하고 서비스를 만들었지만, 예상치 못한 문제가 발생할 수도 있다는 것을 알고 있다. ChatGPT에게 현재 내가 만들고 있는 서비스를 설명해주고 더 안정적인 운영을 하기 위해 어떻게 해야할지 같이 고민해달라고 요청했다.
현재 운영 중이거나 개발 중인 서비스는 웹 화면을 통해 서버의 네트워크 설정, 방화벽 정책, 시스템 설정, IPSec VPN 설정 등을 적용하는 관리형 서비스이다.
기술 스택은 다음과 같다.
이 글에서는 백엔드 시니어 관점에서 안정적인 서비스 운영을 위해 반드시 고려해야 할 사항과 임팩트 있는 개선 포인트를 정리한다.
이 서비스는 일반적인 CRUD 웹 서비스와 본질적으로 다르다.
따라서 모든 설계는 다음 질문을 중심으로 이루어져야 한다.
이 버튼을 잘못 누르거나, 적용 도중 실패하면 어떻게 되는가?
정책은 반드시 상태 기반으로 관리되어야 한다.
DRAFT
→ READY
→ APPLYING
→ APPLIED
→ FAILED
→ ROLLBACKING
→ ROLLED_BACK
DB만 보고도 다음 질문에 답할 수 있어야 한다.
gRPC 통신은 “성공/실패”만으로는 부족하다.
| 상황 | 실제 의미 | 대응 |
|---|---|---|
| gRPC timeout | 적용 중인지, 미수신인지 불명 | Idempotency 필수 |
| 일부 모듈 성공 | 반쪽짜리 적용 | Rollback 또는 보정 |
| Go 모듈 panic | 상태 불명 | 상태 조회 API 필요 |
| 네트워크 단절 | 결과 미확인 | 재조회 기반 판단 |
👉 Go 모듈에는 반드시 “현재 적용 상태 조회 API”가 존재해야 한다.
정책 적용 요청은 반드시 멱등성(Idempotency) 을 가져야 한다.
request_id (UUID) 부여request_id 기준으로 처리Idempotency가 없으면 재시도는 곧 중복 설정이 된다.
특히 방화벽, VPN 설정에서는 치명적이다.
Rollback이 가능하려면 다음 중 하나는 반드시 존재해야 한다.
Rollback은 명확한 조건을 가져야 한다.
Rollback 없는 Apply는 운영 서비스로서 매우 위험하다.
다음과 같은 코드는 매우 위험하다.
@Transactional
savePolicy();
grpc.apply();
DB는 의도(intent) 를 기록하고,
실제 적용은 외부 세계에서 이루어진다.
이미 OpenObserve를 사용 중이라면, 로그 필드 표준화가 핵심이다.
Spring → gRPC → Go → journald → Vector → OpenObserve
전 구간에서 동일한 request_id 유지가 필수다.
다음 메트릭이 없으면 “감으로 운영”하게 된다.
Prometheus + Grafana 조합을 강력히 권장한다.
(OpenObserve는 로그, 메트릭은 분리하는 것이 안정적)
다음 상황은 반드시 감지되어야 한다.
최소한 Alert는 떠야 하며, 가능하면 자동 조치도 고려한다.
운영 관점에서 다음 정보는 반드시 제공되어야 한다.
API 권한은 반드시 분리한다.
Apply 권한은 관리자 중에서도 제한해야 한다.
삭제 불가능한 감사 로그는 필수다.
보안 사고 및 감사 대응을 위해 반드시 필요하다.
이 다섯 가지만 제대로 갖춰도
“운영 가능한 서비스” → “신뢰 가능한 서비스” 로 도약한다.
이 서비스는 단순한 백엔드 API가 아니라 Control Plane에 가깝다.
이 영역을 제대로 경험하면:
로 성장하는 데 매우 큰 자산이 된다.
정말 다양한 내용이 들어있다. 해당 내용을 가지고 현재 내가 진행하고 있는 프로젝트에 잘 적용되어있는지 체크를 해보았다.