· 11675 words · 55 min read

4. 진실의 원천#

새로운 서비스가 주말까지 가동되어야 했다. 변경은 간단했다: 새 VLAN, 새 서브넷, 업데이트된 방화벽 규칙, 엣지 라우터의 새 BGP 커뮤니티. 네트워크 엔지니어는 정확히 무엇을 해야 하는지 알고 있었다. 이어진 것은 다섯 개의 시스템에 걸친 4일간의 조율이었다: 서브넷을 예약하는 IPAM 도구, 서비스를 등록하는 CMDB, 새 정책을 푸시하는 방화벽 관리 플랫폼, BGP 커뮤니티를 위한 라우터 설정 시스템, 그리고 새 임계값을 추가하는 모니터링 플랫폼. 각 시스템은 고유한 인터페이스, 고유한 데이터 모델, 고유한 승인 워크플로가 있었다. 그리고 공유 레퍼런스가 없었기 때문에 엔지니어는 컨텍스트를 수동으로 가지고 다녀야 했다: 한 시스템에서 다른 시스템으로 값을 복사하면서 단계 사이에 아무것도 드리프트되지 않기를 바라면서.

6개월 후, 서비스가 폐기됐다. VLAN이 제거됐다. 서브넷이 해제됐다. 하지만 방화벽 규칙은 남아 있었다. 아무도 그것이 그 서비스와 연결되어 있었다는 것을 기억하지 못했다. BGP 커뮤니티는 두 개의 엣지 라우터에 머물렀다. 모니터링 임계값은 NOC가 무시하는 법을 배운 저우선순위 경보를 계속 발화했다. 시간이 지남에 따라, 네트워크는 고아가 된 설정의 레이어를 축적했다: 완전히 추적되지 않고, 완전히 되돌려지지 않으며, 공유된 인텐트 기록에 연결되지 않은 변경들의 잔재.

이것이 진실의 원천 없이 네트워크를 운영하는 것이 실제로 어떻게 보이는지다. 단 하나의 극적인 실패가 아니라, 일관성의 느린 축적이다. 모든 변경이 여러 연결되지 않은 시스템을 업데이트해야 하고, 무엇이 함께 속하는지 추적하는 것이 없는 상태.

모든 자동화 시스템은 하나의 질문으로 시작한다: 실제로 무엇을 할 것인가? 방화벽 규칙을 배포하거나, IP 주소를 추가하거나, VLAN을 설정할 때, 어떤 인텐트 표현을 기반으로 한다. 그 표현이 진실의 원천이다: 배포되어야 하는 것의 단일하고 신뢰할 수 있는 버전.

나는 “진실의 원천 (Source of Truth)“과 “인텐트 (Intent)“를 상호 교환적으로 사용한다. 정확히 동일한 개념이다.

신뢰할 수 있는 진실의 원천 없이는, 네트워크 운영이 부족 지식의 혼란이 된다. 엔지니어들이 무엇이 배포됐는지에 대해 의견이 다르다. 스프레드시트가 실제 실행 중인 것과 모순된다. 두 개의 다른 자동화 시스템이 같은 장비에 충돌하는 변경을 한다. 무언가 고장났을 때, 고고학을 하게 된다: “왜 이렇게 설정됐을까? 누가 승인했을까? 언제 변경됐을까?”

이 장은 수십 개에서 수십만 개의 장비가 있든, 데이터가 필요한 모든 사람(인간, 자동화, 다른 시스템)을 서비스하든, 데이터를 정확하고 신뢰할 수 있게 유지하든, 여러 소스에서 데이터를 가져오는 복잡성을 처리하든 작동하는 진실의 원천을 어떻게 구축하는지 살펴본다. 모델링, 소비, 시행, 버전 관리, 집계, 설계 주도의 여섯 가지 구성 요소를 다룰 것이다. 이것들이 함께 네트워크 자동화를 위한 탄탄한 기반을 만든다. 기존 네트워크를 이 시스템에 가져오는 실용적인 문제도 다루고, 실제로 사용 가능한 솔루션을 보여줄 것이다.

4.1. 기초#

진실의 원천은 세 가지를 한다: 원하는 것을 어떻게 표현하는지, 그 인텐트가 어디에 있는지, 그리고 시간이 지남에 따라 어떻게 신뢰할 수 있게 유지하는지 정의한다. 진실의 원천 없이, 다른 구성 요소들은 공유 레퍼런스 없는 독립형 도구가 된다. 진실의 원천이 있으면, 그것들이 함께 작동한다.

4.1.1. 목표#

진실의 원천은 여섯 가지를 해야 한다:

  1. 필요한 모든 것을 캡처하라. 네트워크의 전체 그림을 저장하라: 설정, 자산, 토폴로지, 서비스, IP 주소, 회선, 장비 사양, 비밀, 유지보수 윈도우, 컴플라이언스 내용, 그리고 누가 무엇을 소유하는지. 오늘 실행 중인 것뿐만 아니라, 계획한 것과 퇴역시키는 것도 포함하라. 이 모든 데이터가 스프레드시트와 사람들의 머릿속에 흩어지는 대신 한 곳에 있으면, 자동화 시스템이 실제로 스마트한 결정을 내리는 데 필요한 컨텍스트를 갖게 된다.

  2. 운영자가 장비 구문이 아닌 비즈니스 용어로 생각할 수 있게 하라. 직원들은 Command Line Interface (CLI) 수준이 아닌 비즈니스 수준에서 작업해야 한다 (“새 지사 추가” 또는 “MPLS 서비스 설정”). 뒤에서, 시스템이 실제 장비별 설정을 파악한다. 이것은 사람들이 낮은 수준의 세부 사항이 아닌 달성하려는 것에 집중하게 한다.

  3. 사람과 기계가 데이터에 쉽게 접근할 수 있게 하라. 시스템에는 자동화가 데이터를 가져오고 수정할 수 있는 Application Programming Interface (API)(Representational State Transfer (REST), GraphQL)가 필요하다. 인간이 검색하고 편집할 수 있는 웹 UI와 Command Line Interface (CLI)가 필요하다. 모든 사람에게 자신이 봐야 할 것만 볼 수 있는 견고한 접근 제어가 필요하다. 동시에 수백 개의 자동화 워크플로가 실행되고, 수십 명의 직원이 데이터를 편집하며, 외부 시스템이 동기화하더라도 모든 것이 일관성 있고 빠르게 유지된다.

  4. 데이터를 깨끗하고 신뢰할 수 있게 유지하라. 모든 것을 검증하라: 데이터 유형이 올바른지, 관계가 의미 있는지, VLAN이 유효한 범위에 있는지, IP 주소가 중복되지 않는지 확인하라. 누가 무엇을 언제 변경했는지 추적하라. 중요한 변경은 적용되기 전에 사람이 승인하게 하라. 무언가 잘못되면 롤백할 수 있다. 자동화는 데이터가 정확하다는 것을 신뢰해야 한다. 잘못된 데이터는 잘못된 네트워크 상태와 서비스 중단으로 이어지기 때문이다.

  5. 사람들이 서로 방해하지 않고 병렬로 작업할 수 있게 하라. 여러 팀이 동시에 변경을 제안할 수 있어야 한다. 변경은 원자적 묶음으로 그룹화된다: 모두 들어가거나 모두 실패하며, 중간 상태가 없다. 라이브로 배포되기 전에 스테이징 환경에서 변경을 테스트할 수 있다. 대규모 마이그레이션의 경우, 브랜치를 만들고, 작업하고, 다시 병합할 수 있다. 현재 사용 중인 인텐트와 제안된 것의 차이를 항상 알 수 있다.

  6. 다른 시스템에서 데이터를 가져오라. 이미 하드웨어를 위한 자산 관리, 주소를 위한 IP 시스템, 연결성을 위한 회선 제공업체, 서비스를 위한 CMDB가 있을 것이다. 그것을 중복으로 만들지 말라. 대신 동기화하라. 어떤 시스템이 어떤 데이터를 소유하는지 명확한 규칙을 만들어라. 양방향으로 모든 것을 동기화하라. 이것은 바퀴를 재발명하지 않고 모든 것의 통합된 뷰를 얻는다는 의미다.

4.1.2. 기둥#

이 여섯 가지 기둥은 독립적인 기능이 아니다; 계층적 아키텍처를 형성한다. 모델링은 무엇을 표현할 수 있는지 정의한다. 설계 주도는 그 표현을 기술적 아티팩트로 변환한다. 소비는 이러한 아티팩트를 그것이 필요한 모든 시스템에서 사용할 수 있게 한다. 시행은 데이터를 들어올 때 신뢰할 수 있게 유지한다. 버전 관리는 시간이 지남에 따라 인텐트 기록을 보존하여 롤백과 감사를 가능하게 한다. 집계는 SoT가 또 다른 격리된 사일로가 되는 것을 방지한다. 이미 데이터를 소유하고 있는 시스템에서 권위 있는 데이터를 가져옴으로써.

하나를 제거하면 다른 것들이 저하된다. 시행 없이는 소비가 나쁜 데이터를 제공한다. 버전 관리 없이는 무언가 고장났을 때 무엇이 변경됐는지 추론하는 방법이 없다. 집계 없이는 운영자가 시스템 간에 중복 데이터를 유지하고 SoT가 신뢰를 잃는다. 4.2절에서 각각을 깊이 다룬다.

여섯 가지 기능을 자세히 설명하기 전에, 진실의 원천의 범위를 명확히 하자.

4.1.3. 범위#

구현 세부 사항에 들어가기 전에, 진실의 원천이 책임지는 것과 그렇지 않은 것을 이해하는 것이 중요하다.

범위 내:

진실의 원천은 모든 인텐트 데이터를 관리한다: 네트워크가 어떻게 보여야 하는지에 대한 완전한 정의. 여기에는 프로덕션 설정, 스테이징 환경, 개발 브랜치, 테스트 시나리오가 포함된다. “원하는 것"을 설명하는 모든 것이 여기에 있다.

범위 밖:

진실의 원천은 관련된 것처럼 보일 수 있는 몇 가지를 하지 않는다:

  1. 옵저버빌리티 데이터: 진실의 원천은 메트릭, 로그, 또는 런타임 상태를 저장하지 않는다. 하지만 경보 임계값이나 기준 성능 수치와 같이 비교할 기대치를 정의한다. 실제 옵저버빌리티 데이터는 다른 곳에 있다 (6장에서 다룸).

  2. 네트워크 상호작용: 진실의 원천은 장비와 대화하거나 설정을 푸시하지 않는다. 필요한 아티팩트(장비 설정, 검증 규칙, 배포 매니페스트)를 제공하지만 실행하지 않는다. 그것은 실행기의 역할이다 (5장).

  3. 오케스트레이션 로직: 진실의 원천은 변경 배포를 위한 단계의 순서나 워크플로를 정의하지 않는다. 의도된 최종 상태를 정의한다. 어떻게 도달하는지 (어떤 장비가 먼저, 어떤 검증 단계, 롤백 절차)는 오케스트레이터에 속한다 (7장).


진실의 원천을 네트워크 자동화 전략의 북극성으로 생각하라. “네트워크가 어떻게 보여야 하는가?“에 대한 단일하고 권위 있는 답이다. 자동화 시스템의 다른 모든 것(실행, 모니터링, 오케스트레이션)은 자신의 역할을 수행하기 위해 이 진실을 참조한다. 현실이 인텐트에서 드리프트될 때, 진실의 원천은 현실이 되어야 할 것을 알려준다.

4.2. 기능#

이제 이 모든 것을 실제로 구현하는 여섯 가지 기능에 대해 이야기해보자.

각각은 목표와 기둥에 매핑된다:

  1. 모델링: 저장하는 데이터와 그것이 어떻게 관련되는지 정의한다. 장비 모델, 인터페이스, VLAN, 회선, 서비스. 필요에 따라 발전할 수 있게 하라.

  2. 설계 주도: 템플릿과 로직을 통해 고수준 인텐트를 실제 장비 설정으로 변환한다.

  3. 소비: 사람과 시스템이 실제로 데이터를 얻고 사용하는 방법. Application Programming Interface (API), 웹 UI, Command Line Interface (CLI). 모든 사람이 역할에 맞는 접근 제어를 받는다.

  4. 시행: 나쁜 데이터가 몰래 들어오지 않게 한다. 검증, 유일성 검사, 참조 무결성. 명확한 오류 메시지.

  5. 버전 관리: 완전한 이력을 유지한다. 누가 무엇을 언제 왜 변경했는지. 필요할 때 롤백.

  6. 집계: 다른 시스템(CMDB, IPAM 등)에서 데이터를 가져와 동기화 상태를 유지한다.

graph LR

    %% --- Subgraphs ---
    subgraph 목표
        direction TB
        A1[필요한 모든 것 캡처]
        A2[비즈니스 용어로 생각]
        A3[데이터 접근 용이성]
        A4[데이터 품질 유지]
        A5[병렬 작업 지원]
        A6[다른 시스템 데이터 통합]
    end

    subgraph 기둥
        direction TB
        B1[유연한 데이터 모델링]
        B2[설계와 템플릿]
        B3[APIs와 인터페이스]
        B4[데이터 검증]
        B5[변경 이력]
        B6[데이터 집계]
    end

    subgraph 기능
        direction TB
        C1[모델링]
        C2[설계 주도]
        C3[소비]
        C4[시행]
        C5[버전 관리]
        C6[집계]
    end


    %% --- Row connections ---
    A1 --> B1 --> C1
    A2 --> B2 --> C2
    A3 --> B3 --> C3
    A4 --> B4 --> C4
    A5 --> B5 --> C5
    A6 --> B6 --> C6

    %% --- Row gradient classes ---
    classDef row1 fill:#eef7ff,stroke:#4a90e2,stroke-width:1px;
    classDef row2 fill:#ddeeff,stroke:#4a90e2,stroke-width:1px;
    classDef row3 fill:#cce5ff,stroke:#4a90e2,stroke-width:1px;
    classDef row4 fill:#b3d8ff,stroke:#4a90e2,stroke-width:1px;
    classDef row5 fill:#99ccff,stroke:#4a90e2,stroke-width:1px;
    classDef row6 fill:#80bfff,stroke:#4a90e2,stroke-width:1px;

    %% --- Apply classes per row ---
    class A1,B1,C1 row1;
    class A2,B2,C2 row2;
    class A3,B3,C3 row3;
    class A4,B4,C4 row4;
    class A5,B5,C5 row5;
    class A6,B6,C6 row6;

다음은 인텐트 블록의 아키텍처 관점이다:

graph TB

    %% Tier 1
    subgraph T1[외부]
        A[소비]
    end

    %% Tier 2
    subgraph T2[데이터]
        B[설계 주도]
        D[모델링]
    end

    %% Tier 3
    subgraph T3[엔진]
        C[집계]
        E[시행]
        F[버전 관리]
    end

    %% Tier connections
    A <--> B
    A <--> D

    B <--> D

    D <--> C
    D <--> E
    D <--> F

4.2.1. 모델링#

데이터 모델은 중요하다: 무엇을 표현할 수 있는지와 얼마나 쉽게 작업할 수 있는지 결정한다. George Box가 언급했듯이: “모든 모델은 틀렸지만, 일부는 유용하다.” 모든 사람에게 맞는 완벽한 모델은 없다. 내 경험상, 데이터 모델링은 과학보다 예술에 가깝다. 하지만 성공적인 프로젝트에서 일관되게 나타나는 특정 패턴들이 있다.

4.2.1.1. 기본 원칙#

데이터를 어떻게 구성하는지가 중요하다. 무엇을 표현할 수 있는지와 시스템이 얼마나 효율적으로 검증하고 사용할 수 있는지 결정한다. 다른 형식은 다른 트레이드오프를 갖는다. YAML은 읽기 쉽지만 많이 검증하지 않는다. JavaScript Object Notation (JSON)은 어디서나 작동하지만 장황하다. Yet Another Next Generation (YANG)은 검증을 추가하지만 학습 곡선이 가파르다. 실제로 필요한 것을 기반으로 선택하라.

형식유스케이스강점트레이드오프
YAML설정, 사람이 편집읽기 쉽고 간결스키마 검증 제한
JavaScript Object Notation (JSON)Application Programming Interface (API), 문서 저장도구 생태계사람이 읽기 번거롭
XML표준 기반 교환XSLT 처리, 스키마무거운 구문
Protocol Buffers성능, 직렬화압축, 버전 관리바이너리, 코드 생성 필요
YANG네트워크 장비 모델링업계 표준 (RFC 6020), 계층적 제약가파른 학습 곡선

데이터는 다른 수준에 존재한다. 동일한 네트워크 요소를 다른 목적으로 여러 방법으로 설명할 수 있다:

  • 서비스 수준: 비즈니스 친화적 (“지사 X에 MPLS L3VPN 설정”)
  • 기술 수준: 기술 사양 (“BGP AS 65001, route targets 65001:100, 정책…”)
  • 장비 수준: 실제 설정 (“interface xe-0/0/0; unit 100;…”)

좋은 모델은 이러한 레이어들을 연결한다. 비즈니스 수준에서 시작해서 자동으로 장비 설정을 생성할 수 있다. 하지만 항상 세 레이어 모두가 필요한 것은 아니다: 무엇을 구축하는지에 따라 다르다.

4.2.1.2. 데이터 영속성과 규모#

모델 데이터를 저장하는 방법을 선택하는 것은 일관성, 성능, 진화에 심오한 영향을 미친다. 네트워크가 수백에서 수십만 개의 관리 객체로 성장함에 따라 이러한 영향은 중요해진다.

  • 관계형 데이터베이스 (예: MySQL, PostgreSQL): 대부분의 팀에게 안전한 선택이다. 칭찬으로 말하는 것이다. 스키마 일관성을 강제하고, ACID 트랜잭션을 제공하며, 팀의 모든 엔지니어가 이미 SQL을 알고 있다. 정규화된 계층(인터페이스를 포함하는 VLAN)을 표현하고 데이터 이상을 방지하는 데 탁월하다. 단점: 스키마 변경이 규모에서 힘들고, 수백만 행에 걸친 깊은 조인으로 성능이 저하된다. 하지만 그것은 좋은 문제다: 실제로 무언가를 배포했다는 의미이기 때문이다.

  • 문서 데이터베이스 (예: MongoDB, CouchDB): 스키마 유연성과 수평 확장성이 필요한 경우 좋다. 문서는 자연스럽게 중첩 구조를 모델링한다 (모든 설정과 메타데이터가 하나의 블롭으로 있는 장비). 하지만 문서 간 일관성을 직접 책임져야 하고, 복잡한 쿼리는 빠르게 비용이 많이 든다. 문서 기반으로 가야 할 특별한 이유가 없다면, 관계형을 고수하라.

  • 그래프 데이터베이스 (예: Neo4j): 객체보다 관계가 더 중요할 때 진정으로 더 낫다: “이 인터페이스는 어떤 VLAN에 연결되는가? 이 두 위치 사이를 어떤 장비가 라우팅하는가?” 임의 깊이의 관계를 효율적으로 탐색한다. 하지만 복잡한 토폴로지 쿼리를 지속적으로 하지 않는다면, 이국적인 옵션을 선택하는 것이다. 운영 팀이 모르고, 도구가 덜 성숙하며, 단순한 업데이트에는 쓰기 성능이 뒤처진다. 그래프 데이터베이스는 실제 문제를 해결하지만, 먼저 그 문제가 실제로 있는지 확인하라.

flowchart TD
    Q1{주요 요구사항?}
    Q1 -->|깊이 있는 복잡한 관계 탐색| Q2{지속적인 토폴로지 쿼리?}
    Q1 -->|스키마 자주 변경| DB_D[문서 저장소]
    Q1 -->|구조화된 쿼리, 참조 무결성| DB_R[관계형 데이터베이스]
    Q2 -->|예| DB_G[그래프 데이터베이스]
    Q2 -->|가끔| DB_R

    style DB_R fill:#ccffcc,stroke:#28a745
    style DB_G fill:#cce5ff,stroke:#4a90e2
    style DB_D fill:#ffffcc,stroke:#ffc107

다른 관점에서 데이터 영속성에 대한 더 많은 내용은 옵저버빌리티 장에서 다룬다.

데이터베이스 선택은 이 분야 제품들 중 주요 차별화 요소 중 하나다. 예를 들어, NetBoxNautobot은 관계형 데이터베이스를 사용하는 반면, Infrahub4.2.8절에서 볼 수 있듯이 그래프 데이터베이스를 사용한다.

영속성은 버전 제어를 위해 Git 시스템에서 일반적으로 추적되는 YAML 또는 JavaScript Object Notation (JSON) (또는 CSV)과 같은 데이터 모델의 파일 기반 저장소를 사용하여 구현될 수도 있다.

대부분의 프로덕션 진실의 원천 시스템은 **다중 언어 영속성 (polyglot persistence)**을 사용한다: 권위 있는 인텐트와 관계를 위한 관계형 데이터베이스, 유연성과 캐싱을 위한 문서 저장소 또는 Git, 그리고 토폴로지 분석을 위한 그래프 기능.

모델이 얼마나 세분화되어야 하는가? 이것은 성능에 영향을 미친다. 모든 장비의 모든 인터페이스를 별도의 객체로 모델링하면, 중간 규모 네트워크에 50,000개 이상의 객체가 생긴다. 쿼리가 느려진다. 업데이트가 고통스러워진다.

실용적인 접근: 공통 패턴에 템플릿을 사용하라. “인터페이스 1-40은 이 표준 템플릿을 사용한다"고 하고 예외만 추적하라. 40개 대신 2개의 객체이고, 쿼리는 빠르며, 렌더링은 여전히 작동한다.

11장에서 이러한 결정들이 성능에 어떻게 영향을 미치는지에 대한 더 많은 통찰을 다룰 것이다.

4.2.1.3. 네트워크 데이터 도메인#

포괄적인 진실의 원천 구현은 일반적으로 이러한 상호 연결된 도메인들을 모델링한다:

  • 인벤토리와 자산: 물리적 및 논리적 장비, 하드웨어 사양, 시리얼 번호, 구매 날짜, 계약 조건, 라이프사이클 단계
  • 데이터 센터 인프라: 위치(지리적 및 계층적), 건물, 층, 실, 랙, 전력 배분, 케이블 경로
  • IP 주소 관리 (IPAM): 주소 풀, 서브넷, 할당, DNS 확인, DHCP 범위, 활용 추적
  • 가상화와 클라우드: VPC, 서브넷, 보안 그룹, 컴퓨트 인스턴스, 스토리지, 컨테이너 오케스트레이션 관계
  • 연결성: 물리적 회선(MPLS, Ethernet), 가상 터널, 피어링 관계, 대역폭 할당, QoS 정책
  • 라우팅: BGP 커뮤니티, 자율 시스템, 라우팅 정책, 프리픽스 목록, L3VPN 서비스용 route target
  • 서비스: 논리적 서비스 정의(L3VPN, L2VPN, 방화벽 통과), 서비스-장비 매핑, SLA
  • 보안과 컴플라이언스: 접근 제어 목록, 방화벽 규칙, 보안 존, 컴플라이언스 태그, 감사 요구사항
  • 관리: SNMP 세부 정보, gNMI 구독, NTP 소스, syslog 대상, TACACS+/RADIUS 통합

이 도메인들은 상호 의존적이다: 라우팅은 연결성을 참조하고, 서비스는 인벤토리와 IPAM에 걸쳐 있으며, 보안 정책은 장비와 서비스 모두에 적용된다. 잘 설계된 SoT는 각 도메인을 격리된 테이블로 취급하는 대신 이러한 관계를 명시적으로 모델링한다.

graph TD
    INV[인벤토리와 자산]
    DC[DC 인프라]
    IPAM[IP 주소 관리]
    VIRT[가상화와 클라우드]
    CONN[연결성]
    ROUTE[라우팅]
    SVC[서비스]
    SEC[보안과 컴플라이언스]
    MGMT[관리]

    DC --> INV
    INV --> IPAM
    INV --> MGMT
    CONN --> INV
    VIRT --> IPAM
    ROUTE --> CONN
    SVC --> INV
    SVC --> ROUTE
    SVC --> IPAM
    SEC --> INV
    SEC --> SVC

    classDef foundation fill:#ddeeff,stroke:#4a90e2,stroke-width:2px
    classDef overlay fill:#e8f5e9,stroke:#28a745
    classDef policy fill:#fff3cd,stroke:#ffc107
    class INV,IPAM,CONN foundation
    class ROUTE,VIRT,DC,MGMT overlay
    class SVC,SEC policy

네트워크 특정 도메인 외에도, 다른 많은 데이터 유형이 필요하다. 예를 들어, 자격 증명을 저장하는 비밀 백엔드. 더 일반적으로, 포괄적인 데이터 관리는 글로벌 IT 인프라 관리 시스템 내에 맞는다.

많은 팀이 NetBox와 같은 네트워크 특정 데이터 소스를 사용할지 대 ServiceNow와 같은 범용 소스를 사용할지 논쟁하는 일반적인 질문을 공유하고 싶다. 내 경험상, 유사한 결과를 달성하는 것이 가능하더라도, ServiceNow가 회사 전체 시스템이라는 사실이 발전을 더 어렵고 느리게 만들어 네트워크 팀이 완전한 네트워크 표현을 위해 그것을 활용하기 시작하는 것을 늦춘다.

데이터 분류와 공통 속성

네트워크 도메인 전반에 걸쳐 특정 분류 패턴이 일관되게 나타난다. 잘 설계된 모델은 일관된 데이터 조작을 위해 이러한 기본 속성들을 포함한다:

  • 역할: 이 객체가 어떤 목적을 수행하는가? (코어, 배포, 액세스; 기본, 보조)
  • 상태: 활성, 계획됨, 폐기 중, 또는 퇴역됐는가?
  • 종류: 어떤 유형의 객체인가? (VLAN, 장비, 회선, 서비스)
  • 소유권: 어떤 팀이나 사업부가 이것을 관리하는가?
  • 위치: 이 리소스가 지리적으로 또는 조직적으로 어디에 있는가?

4.2.1.4. 모델 설계 패턴: 확장성, 다형성, 마이그레이션#

일부 솔루션은 제작자가 네트워크가 어떻게 보여야 한다고 생각하는 것을 기반으로 내장 모델을 제공한다. 네트워크가 그 가정과 일치한다면 훌륭하고, 그렇지 않으면 좋지 않다. 다른 솔루션은 처음부터 구축하게 한다: 훌륭한 유연성이지만 규율이 필요하다. 보통, 가장 좋은 접근 방식은 하이브리드다: 일반적인 경우(모든 사람이 하는 80%)에는 내장 모델을 사용하되, 특정 필요를 위해 확장할 수 있게 하라.

스펙트럼: 독자적 모델에서 커스텀 모델까지

여기에 스펙트럼이 있고, 어디에 해당하는지 이해하는 것이 가치 있다:

  • 고도로 독자적인 모델 (예: 기본 설정의 NetBox):

    • 장점: 빠른 배포, 적은 의사결정, 내장 모범 사례
    • 단점: 네트워크가 틀에 맞지 않으면 고통스럽고, 모델 변경이 어렵다
  • 완전 커스텀 모델 (처음부터 구축, Infrahub처럼):

    • 장점: 특정 필요에 완벽하게 맞고, 낭비되는 필드 없음
    • 단점: 설계에 추가 시간, 많은 시행착오, 참조할 다른 사람이 없음 (하지만 레퍼런스는 있음)

Infrahub이 완전 커스텀 모델을 구축할 수 있게 하지만, 시작할 수 있는 독자적인 모델도 제공한다.

실제로 어디서 시작해야 하는가? 모든 사람에게 하는 말은: NetBox, Nautobot, 또는 Infrahub와 같이 독자적인 모델을 가진 도구로 시작하라. 마침표. 네트워크가 얼마나 특별하다고 생각하는지 신경 쓰지 않는다. “완벽한 모델을 직접 구축하겠다"는 팀들은 이 도구 팀들이 몇 달 전에 유효한 모델을 출시하는 동안 2년이 지난 후에도 여전히 모델링 중이다.

구글이 아니다 (아닐 수도 있다). 많은 경우, 하이퍼스케일 클라우드를 구축하는 것이 아니다. 존재하는 것을 사용하고, 실제 한계에 부딪혔을 때 확장하며 (상상이 아닌), 작동하는 것을 출시하라.

명백히, 이미 매우 특별한 네트워크 유스케이스가 있을 것을 예상한다면, 어떤 도구가 더 잘 지원할지 고려할 수 있지만, 첫날부터 바퀴를 완전히 재발명하지 말라.

중요한 단 하나의 결정: 재작성 없이 확장할 수 있는가? “비용 센터"를 추적하는 커스텀 필드를 추가하는 것이 전체 스키마를 재구축해야 한다면, 도망쳐라. 20분에 커스텀 속성으로 추가할 수 있다면, 올바른 도구를 찾은 것이다.

20%의 유연성이 있는 80% 표준화를 원한다 (특정 현실을 처리하는). “무한히 유연하다"고 주장하는 것은 설정에 무한한 시간이 걸릴 것이다.

다형성: 하나의 모델, 다양한 종류

모든 인터페이스가 동일하게 만들어지지 않는다. 물리적 광학 포트와 터널 인터페이스는 몇 가지 속성을 공유하지만, 서로 다른 것이다. 각각에 대해 완전히 별개의 모델을 만들 수 있지만, 그것은 빠르게 복잡해지고 사용성을 제한한다.

더 나은 접근: 공통점을 커버하는 공유 기본 모델을 정의하고, 차이가 나는 세부 사항을 위한 특화된 변형을 만들어라.

# 모든 인터페이스는 이 기본 사항을 공유한다
interfaces:
  - name: "eth0"
    type: "physical"
    status: "up"
    mtu: 1500
    ipv4_address: "192.0.2.1/24"

# 하지만 물리적 광학 포트는 추가적인 것이 있다
  - name: "eth0"
    type: "physical_optical"
    status: "up"
    mtu: 1500
    ipv4_address: "192.0.2.1/24"
    optics_module: "100GBASE-LR4"
    tx_power_dbm: -2.5
    rx_power_dbm: -8.3
    laser_temperature: 48.2

# 그리고 터널은 내부적으로 완전히 다르게 보인다
  - name: "tun-vpn-dallas"
    type: "tunnel_gre"
    status: "up"
    mtu: 1476
    ipv4_address: "10.0.0.1/30"
    tunnel_source: "203.0.113.1"
    tunnel_destination: "198.51.100.5"
    tunnel_encap: "GRE"
    tunnel_key: 100

이 방식으로, 스크립트는 광학이나 터널과 대화하는지 알 필요 없이 “이 장비의 모든 인터페이스"를 쿼리할 수 있다. 하지만 광학 특정 세부 사항(TX 전력 읽기)이 필요할 때, 그 특화된 필드에 접근할 수 있다. 나중에 새 인터페이스 유형을 추가? 문제없다: 또 다른 변형만 추가하면 된다.

모델은 변한다: 계획하라

네트워크는 수십 년 동안 지속된다. 모델은 정적으로 남지 않을 것이다. 새 필드를 추가하고, 관계를 변경하고, 더 이상 작동하지 않는 것을 폐기할 것이다. 하지만 스위치를 켜서 이전 스키마에서 실행 중인 모든 것을 깨뜨릴 수는 없다.

도전은 모델이 변경될 때, 다운스트림의 많은 것이 깨질 수 있다는 것이다: 검증자는 새 규칙이 필요하고, API는 반환하는 것을 변경하며, 데이터베이스 쿼리는 특정 열이 존재한다고 가정하고, 템플릿은 다른 필드 경로가 필요하며, 보고서는 이전 구조에 대해 작성됐다. 그 모든 것이 적응해야 하며, 적어도 치명적으로 깨지지 않아야 한다. 모든 것을 날리지 않고 변경을 처리하는 방법은 다음과 같다:

  • 제거하기 전에 폐기됐다고 표시하라. 필드가 사라질 예정이라면, 2-3 릴리즈 전에 모든 사람에게 알려라. 마이그레이션을 위한 유예 기간을 줘라.

  • 전환 기간 동안 필드 별칭을 지원하라. device_name을 요청하는 이전 코드? 내부적으로 hostname으로 라우팅하라. API는 여전히 작동하고, 사람들은 자동화를 업데이트할 시간이 있다.

  • 마이그레이션 헬퍼를 만들어라. 데이터를 재구성할 때(인터페이스를 평면 목록에서 장비 아래 중첩으로 이동할 때처럼), 작업을 처리하는 스크립트를 제공하라.

  • 데이터에 의존하는 모든 것으로 테스트하라. 스키마 변경을 롤아웃하기 전에:

    • API가 여전히 이전 방식으로 데이터를 반환하는가? (별칭을 통해)
    • 템플릿이 여전히 렌더링되는가?
    • SQL 쿼리가 여전히 작동하는가?
    • 외부 시스템과의 통합이 여전히 받은 것을 파싱하는가?
  • 잠시 동안 프로덕션에서 혼합 버전을 예상하라. 대규모 조직은 종종 세 개의 다른 스키마 버전에 동시에 장비를 갖는다:

    스키마 1.9 (이전)에 150개 장비
    스키마 2.0 (현재)에 300개 장비
    스키마 2.1 (베타 테스팅)에 50개 장비

시스템은 깨지지 않고 세 가지 모두를 처리해야 한다. 그 복잡성은 가치 있다: 네트워크는 부주의한 스키마 변경으로 깨지기에는 너무 중요하다.

4.2.1.5. 설정 템플릿#

템플릿은 추상적인 인텐트(“VLAN이 필요하다”)를 실제 Command Line Interface (CLI) 명령으로 전환한다. 핵심 규칙: 템플릿에는 데이터가 아닌 로직이 포함된다. 템플릿은 “데이터 모델의 VLAN ID를 사용하고, 여기에 출력하라"고 말한다. 실제 VLAN ID는 템플릿이 아닌 데이터에서 온다. 이것은 데이터를 이식 가능하고 테스트 가능하게 한다. Jinja2는 사람이 읽을 수 있고, Python 및 Ansible과 통합되며, 실제 네트워크에 실용적이기 때문에 인기 있다. 하지만 유일한 옵션은 아니다. 많은 유효한 대안이 있다.

예를 들어, 인터페이스를 위한 데이터 구조가 주어지면

interfaces:
  - name: Ethernet1
    description: Uplink to core
    enabled: true
  - name: Ethernet2
    description: Server port
    enabled: false

그리고 이 CLI 설정 Jinja2 템플릿이

# Interfaces
{% for iface in interfaces %}
interface {{ iface.name }}
  description {{ iface.description }}
  {% if iface.enabled %}
  no shutdown
  {% else %}
  shutdown
  {% endif %}
{% endfor %}

다음 CLI 출력을 생성한다:

# Interfaces
interface Ethernet1
  description Uplink to core
  no shutdown
interface Ethernet2
  description Server port
  shutdown

데이터와 설정 아티팩트 간의 명확한 관심사 분리에 주목하라.

Jinja의 흥미로운 대안은 여러 데이터 기능을 통합하는 CUE 선언적 설정 언어다:

  • YAML과 같은 원시 데이터
  • JSON Schema와 같은 데이터 검증/스키마 (시행 섹션에서 더)
  • Jinja와 같은 동적 데이터 생성

CUE는 설정을 느슨하게 구조화된 텍스트(Jinja처럼)가 아닌 강제된 불변량을 가진 타입이 지정되고 합성 가능한 데이터로 취급한다.

4.2.2. 설계 주도 (Design-Driven)#

장비가 50개, VLAN이 30개라면 개별 관리가 가능하다: VLAN마다 생성하고, 인터페이스마다 설정하고, IP를 손으로 하나씩 할당한다. 지루하지만 감당할 만하다.

장비가 5,000개, 서비스가 수백 개라면 수동 관리는 불가능하다. 지사 하나를 추가하려면 위치당 100개 이상의 설정 항목을 일일이 지정해야 한다. 설계 주도 빌딩 블록이 이 문제를 해결한다: 운영자는 원하는 것을 높은 수준에서 기술하고(“지사 추가”), 시스템이 그것을 완전한 기술 사양으로 확장한다.

4.2.2.1. 비즈니스 인텐트에서 기술 데이터로#

예시 시나리오 - “달라스에 지사 추가”:

비즈니스 인텐트 (상위 수준):

{
  "type": "branch_office",
  "location": "dallas-tx",
  "site_code": "DAL-01",
  "circuit_count": 2,
  "employee_count": 50,
  "applications": ["erp", "voip", "video"]
}

설계 처리 과정

flowchart LR
    A[비즈니스 인텐트]
    B[템플릿 적용]
    C[리소스 할당]
    D[로직 결정]
    E[세부 렌더링]
    F[실행기용 객체]

    A --> B --> C --> D --> E --> F

    style A fill:#fff3cd,stroke:#ffc107
    style B fill:#ffe6cc,stroke:#fd7e14
    style C fill:#d4edda,stroke:#28a745
    style D fill:#cce5ff,stroke:#4a90e2
    style E fill:#e2d9f3,stroke:#6f42c1
    style F fill:#d1ecf1,stroke:#17a2b8
단계작업
1. 템플릿 적용- 사이트 객체 생성
- 위임 풀(지역 IPAM)에서 서브넷 할당
- 데이터, 음성, 게스트 VLAN 생성
- 보안 존과 방화벽 규칙 정의
2. 리소스 할당- 사이트용 다음 가용 서브넷 /22: 10.15.0.0/22
- 다음 가용 VLAN 범위: 2010-2014
- 다음 가용 BGP 커뮤니티: 65001:2010
3. 로직 결정- site_count < 100 직원? 예 → 소형 사무소 템플릿
- 이중화 회선 필요? 예 → BGP 네이버 2개 생성
- Applications = [erp, voip]? 예 → 방화벽 정책 추가
4. 세부 렌더링- PE 장비 설정 (BGP 설정, route targets, 음성용 QoS)
- CE 장비 설정 (LAN 인터페이스, VLAN, NTP)
- 방화벽 정책 (ERP 트래픽 허용, 음성 우선순위)
- 사무소 서비스용 DNS 항목
- 모니터링 설정 (SNMP, syslog, 경보)
5. 출력배포 준비된 50개 이상의 설정 객체

이로써 낮은 노력의 고수준 인텐트가 포괄적인 기술 세부 사항으로 변환된다.

4.2.2.2. 설계 패턴과 재사용 가능한 빌딩 블록#

효과적인 설계 시스템은 패턴 라이브러리에 의존한다.

네트워크 설계 패턴 라이브러리

패턴구성 요소
소형 지사 사무소- 단일 엣지 라우터 (백업을 통한 복원력)
- 2-3개 VLAN (데이터, 음성, 게스트)
- 백업 BGP 피어가 있는 단일 MPLS VPN
- 음성용 QoS (EF, AF 클래스)
- 방화벽 규칙: ERP와 VoIP 외 접근 제한
중형 지역 허브- 이중화 엣지 라우터 (액티브-스탠바이)
- 10-15개 VLAN (부서별 + 게스트 + OOB)
- 다중 MPLS VPN (일부 애플리케이션별 커스텀)
- 정교한 QoS (6개 클래스)
- 고급 방화벽 정책 (애플리케이션 레이어)
데이터 센터 엣지- 쿼드 이중화 Clos 토폴로지
- 100개 이상 VLAN (고객별 자동 생성)
- BGP unnumbered, 멀티패스
- 자동 VLAN 할당

각 패턴에는 검증된 아키텍처 결정이 담겨 있다. 이탈에는 명시적 승인이 필요하지만, 패턴 배포 자체는 일반적인 운영으로 봐야 한다.

4.2.2.3. 설계를 재현 가능하게 만들기#

이런 문제가 있다: 월요일에 사이트를 설계하면서 VLAN 100을 할당한다. 화요일에 다른 사이트를 설계하면서 VLAN 101을 할당한다. 그런데 6개월 후 검증을 위해 월요일 설계를 다시 실행하면, VLAN 100이 이미 사용 중이므로 시스템이 VLAN 102를 할당할 수 있다.

이는 재현 가능하지 않다. 해결책: 설계 요청이 들어올 때마다 어떤 설계가 어떤 리소스를 받았는지 기록하라. 동일한 요청이 다시 들어오면 같은 VLAN을 받는다. 이를 위해 요청-리소스 매핑을 영구적으로 추적하고 항상 동일한 순서로 할당해야 한다.

  • 결정론적 할당 순서: 항상 동일한 순서로 후보를 반복
  • 원자적 할당: 리소스 예약은 원자적; 부분 할당 불가

이 때문에 많은 설계 시스템이 일관성을 보장하기 위해 콘텐츠 어드레서블 스토리지(설계의 해시)를 사용한다.

4.2.2.4. 렌더링 vs. 빌드 구분#

설계 시스템은 두 단계를 분리한다:

단계입력출력부작용답하는 질문유스케이스
렌더링고수준 설계기술 사양없음 - 리소스 할당 안 됨, 변경 없음“무엇이 생성될 것인가?"
“오류가 있는가?"
“제안된 데이터 확장을 볼 수 있는가?”
승인 전 검토
검증 테스트
변경 범위 추정
빌드렌더링된 사양실제 변경 (IP 확정, VLAN 생성, 설정 푸시, 감사 추적)Atomic Operation, Idempotency, 모니터링 가능, 롤백 가능“실제로 무엇이 배포됐는가?"
“언제 발생했는가?"
“롤백할 수 있는가?”
프로덕션 배포
리소스 예약
실행 워크플로 트리거

빌드 없이 렌더링만 지원하면:

  • 커밋 전 안전한 검증
  • 위험 없는 가상 분석
  • 팀 검토 및 승인 워크플로
  • 먼저 테스트 환경에서 스테이징

4.2.2.5. 설계 버전 관리와 진화#

네트워크 설계는 시간이 지남에 따라 발전한다. 새로운 패턴이 등장하고, 도구가 개선된다. 2020년 설계는 2025년을 위해 업데이트가 필요할 수 있다.

설계 버전 관리의 과제:

  • 설계 버전 1 (2020): 지사 사무소 템플릿: 단일 라우터, 2개 VLAN

  • 설계 버전 2 (2023): 지사 사무소 템플릿: 이중 라우터 (이중화), 4개 VLAN, 보안 강화

버전 1로 배포된 지사들은 어떻게 되는가?

  • 이전 버전을 계속 실행? (보안 부채)
  • 모든 지사를 강제 업그레이드? (변경 위험)
  • 점진적 마이그레이션? (운영 복잡성)

해결책:

코드로서의 설계와 버전 관리

designs/
  ├─ branch_office_v1.yaml (deprecated 2023-01-01)
  ├─ branch_office_v2.yaml (current)
  └─ branch_office_v2_beta.yaml (testing)

Sites:
  - site: DAL-01
    design: branch_office_v2 (특정 버전 참조)
    design_parameters: {...}

이를 통해:

  • 각 사이트를 생성한 설계 버전을 정확히 파악
  • 점진적 마이그레이션 (사이트별 업데이트)
  • v2에 문제 있으면 v1으로 롤백
  • 출시 전 스테이징에서 v3 테스트

스노우플레이크 수용

대부분 사이트는 design_v2 템플릿을 사용하지만 DAL-01 사이트에는 특수 요구사항이 있다:

  • 추가 랙 공간 (오래된 건물 특성)
  • 특이한 IP 주소 지정 (레거시 할당)
  • 커스텀 방화벽 규칙 (과거 비즈니스 요구사항)

해결책:

  • design_v2를 기본으로 배포
  • 사이트별 오버라이드 적용
  • 오버라이드를 별도로 추적 (스노우플레이크 문서화)

이를 통해 방지할 수 있는 것:

  • 예외를 템플릿에 설계하는 것 (설계를 오염시킴)
  • 예외를 수동으로 설정하는 것 (시간이 지나면 드리프트)
  • 예외가 존재하는 이유의 컨텍스트 손실

4.2.3. 소비 (Consumption)#

데이터베이스에 잠긴 데이터는 쓸모없다. 소비 레이어는 사람과 시스템이 실제로 데이터를 얻고 사용하는 방법이다. 쉽게 만들면 참여를 얻는다. 어렵게 만들면 사람들이 우회한다.

4.2.3.1. API 설계와 보안#

다양한 API 스타일이 서로 다른 소비 패턴을 서비스한다. 현재 가장 인기 있는 스타일은 다음과 같다:

API 스타일 비교

인터페이스요청 패턴유스케이스강점트레이드오프
Representational State Transfer (REST)리소스 URL에 대한 Hypertext Transfer Protocol (HTTP) 동사 (GET, POST, PATCH, DELETE)범용 CRUD간단하고 널리 이해됨, 무상태많은 요청 필요 가능성; Versioning 과제
GraphQL단일 엔드포인트, 클라이언트가 정확히 필요한 필드 지정복잡한 다중 리소스 쿼리유연하고 클라이언트 중심, 과다 가져오기 감소더 복잡한 서버 구현, N+1 쿼리 위험
gRPCHTTP/2를 통한 Protobuf 기반 RPC고성능, 저지연양방향 스트리밍, 바이너리 효율성, REST보다 10-100배 빠름학습 곡선, 브라우저 지원 제한
Webhooks서버가 등록된 엔드포인트에 변경 사항 푸시반응형 자동화, 실시간 동기화비동기, 분리, 폴링 오버헤드 없음불안정한 전달, 재시도 복잡성, 보안 과제

효과적인 소비 전략은 종종 여러 인터페이스를 조합한다:

  • REST: 사람 친화적이고 단순한 작업
  • GraphQL: 권한 부여 필터링이 있는 복잡한 다중 도메인 쿼리
  • gRPC/스트리밍: 대용량 자동화
  • Webhooks: 반응형 다운스트림 시스템

MCP (모델 컨텍스트 프로토콜)에 대한 참고 사항 전통적인 API 스타일 외에도, 모델 컨텍스트 프로토콜 (MCP)과 같은 새로운 상호작용 모델이 AI 에이전트가 구조적이고 도구 지향적인 방식으로 시스템과 상호작용할 수 있게 한다. REST나 gRPC가 전송과 요청 의미론을 정의하는 것과 달리, MCP는 안전한 기능 발견, 컨텍스트 데이터 검색, 에이전트 중심 워크플로를 위한 제어된 액션 실행에 중점을 둔다. 이 패턴은 자동화된 추론 시스템이 텔레메트리, 설정, 교정 도구에 구조적 접근이 필요한 AI 지원 운영 및 옵저버빌리티 유스케이스에서 특히 관련이 있다. 아직 발전 중이지만, MCP는 리소스 중심 API에서 에이전트 지향 상호작용 모델로의 전환을 나타낸다.

중요한 규칙 하나: 인증과 권한 부여는 다운스트림이 아닌 API 레이어에서 하라. 이것은 보안 허점을 막고 감사를 제대로 작동하게 한다.

보안 함의에 대한 더 많은 내용은 12장에서.

4.2.3.2. API 운영: 버전 관리, 성능, 캐싱#

API 설계와 보안이 끝나면, 진화와 성능에 관한 운영 문제가 중요해진다.

API 버전 관리와 진화

네트워크는 오래 지속되는 인프라다; 자동화 시스템은 운영 워크플로를 깨뜨리지 않고 발전해야 한다.

  • URL 버전 관리: /api/v1/devices/api/v2/devices는 별도 구현을 유지한다

    • 장점: 명시적, 디버그 가능, 클라이언트가 업그레이드 시점 선택
    • 단점: 여러 구현을 유지해야 한다 (이것은 사실 좋다: 마이그레이션 계획을 강제하기 때문이다)
  • 헤더 버전 관리: 동일 엔드포인트, Accept: application/vnd.company+json; version=2에 버전

    • 장점: 단일 엔드포인트, 더 깔끔한 URL
    • 단점: 로그에서 보이지 않음, 디버그 어려움, 클라이언트가 지속적으로 잘못 사용

어느 쪽이든, 폐기 헤더를 통해 6-12개월 전에 중요 변경 사항을 발표하라:

Deprecation: true
Sunset: Mon, 01 Jan 2026 00:00:00 GMT
Link: <https://docs/migration>; rel="deprecation"

URL 버전 관리를 권장한다: /api/v1/devices/api/v2/devices. 헤더 버전 관리가 문서에서 더 깔끔해 보인다는 것을 안다. 하지만 새벽 3시에 무언가 고장나서 로그를 grep할 때, 어떤 API 버전이 문제를 일으켰는지 알기 위해 요청 헤더를 파헤치는 것이 아니라 즉시 /v1//v2/를 보고 싶을 것이다. 미래의 당직 자신이 감사해할 것이다.

성능과 캐싱

일부 유스케이스에서는 데이터를 하나씩 소비해도 잘 작동하지만, 규모가 커지면 결국 성능 한계에 도달한다.

벌크 작업을 사용하면 단일 API 호출로 수천 개의 객체를 업데이트할 수 있다. 규모에 필수적이지만 트레이드오프가 있다:

  • 단일 객체 API: POST /api/devices/device 장점: 모든 변경 유효성 검사, 객체별 명확한 오류 메시지 비용: 10,000개 장비 업데이트 = 10,000개 API 요청 + 라운드트립 = 수 분

  • 벌크 API: POST /api/devices/bulk-update 장점: 10,000개 업데이트에 단일 라운드트립, 백엔드 처리 병렬화 가능 비용: 유효성 검사 단축 (비용이 많이 드는 검사 건너뜀), 객체별 오류 보고 어려움

데이터 소비를 개선하는 다른 대안으로는 다음을 통한 범위 제한이 있다:

  • 페이지네이션과 필터링: 클라이언트가 수백만 개의 객체를 메모리에 로드하거나 타임아웃하는 것을 방지한다: GET /api/devices?location=datacenter-1&status=active&limit=100&offset=0

    커서 기반 페이지네이션은 대용량 데이터셋 처리 시 오프셋 기반보다 장점이 있다: 분산 시스템에 더 효율적이고, 요청 사이에 데이터가 수정되어도 일관성을 유지한다.

  • 캐싱 전략은 성능을 크게 향상시킨다:

    • 서버 측 캐싱: “위치 X의 모든 장비"의 Redis 캐시, 해당 위치의 장비가 변경되면 무효화
    • 클라이언트 측 캐싱: HTTP ETag는 재가져오기 없이 캐시된 데이터를 검증할 수 있게 함
    • 유효성 검사 레이어 우회: 읽기 전용 쿼리의 경우, 유효성 검사 검사 건너뜀
  • 속도 제한은 백엔드를 과부하로부터 보호한다. 예:

    • 사용자당 초당 10개 요청
    • API 키당 분당 1,000개 요청
    • 백프레셔 신호 (HTTP 429)는 클라이언트에게 속도를 줄이라고 알림

4.2.3.3. 컨텍스트 인식 데이터 모델링#

다른 사람들은 다른 것을 필요로 한다. 네트워크 엔지니어는 데이터를 검색하고 찾고, 특정 필드를 편집하며 유효성 검사 피드백을 받고, 관계를 보기 원한다. 자동화 워크플로는 API, 트랜잭션, 웹훅이 필요하다. 운영 팀은 작업 중심 뷰와 감사 추적을 원한다. 비즈니스는 기술적 세부 사항 없는 보고서를 원한다. 외부 시스템은 양방향으로 데이터를 동기화해야 한다.

소비 블록의 사용자 인터페이스는 프레젠테이션 레이어에 속한다. 8장에서 더 다룰 것이다.

데이터는 각 소비자 컨텍스트에 맞게 적응해야 한다. 예를 들어, 모든 장비 세부 사항이 각 페르소나에게 노출될 필요는 없다. 컨텍스트 인식 커스터마이제이션은 데이터 소비를 더 효율적이고 효과적으로 만든다.

네트워크 엔지니어는 인터페이스와 라우팅 세부 사항이 필요하다. 재무팀은 비용과 보증 정보를 원한다. 보안팀은 컴플라이언스 존을 원한다. 모든 사람에게 500개 필드를 모두 반환하는 대신, 각 소비자에게 필요한 것만 제공하라. API 쿼리 파라미터(?view=network_engineer)나 GraphQL을 통해 특정 필드를 요청하게 할 수 있다.

과제: 하나의 데이터 모델이 모든 소비자에게 맞을 수 없다

SoT에 수백 개의 속성을 포함하는 단일 장비 객체를 생각해보자:

  • 하드웨어 세부 사항 (모델, 시리얼 번호, 펌웨어 버전)
  • 네트워크 설정 (IP 주소, VLAN, 라우팅 프로토콜)
  • 운영 메타데이터 (위치, 비용 센터, 보증 만료)
  • 서비스 관계 (어떤 고객이 이 장비를 사용하는가)
  • 보안 컨텍스트 (컴플라이언스 존, 접근 정책)

서로 다른 소비자는 이 데이터의 근본적으로 다른 뷰가 필요하다:

예시: 다양한 컨텍스트에서의 장비 “router-core-01”

소비자컨텍스트데이터 표현핵심 속성
네트워크 엔지니어연결성 문제 해결네트워크 중심 뷰인터페이스, IP 주소, BGP 피어, 라우트, VLAN, 업링크 상태
재무팀비용 배분비즈니스 중심 뷰비용 센터, 감가상각 일정, 보증 상태, 구매일, 벤더
보안팀컴플라이언스 감사보안 중심 뷰컴플라이언스 존, 접근 정책, 마지막 보안 스캔, 패치 레벨, 열린 취약점
자동화 워크플로설정 배포실행 중심 뷰관리 IP, 자격 증명 참조, 장비 플랫폼, 설정 템플릿 이름
서비스 카탈로그고객 영향 분석서비스 중심 뷰서비스 대상 고객, 호스팅 서비스, SLA 티어, 이중화 그룹

구현 패턴

  1. 뷰 기반 변환: API 쿼리가 원하는 컨텍스트를 지정하고, 서버가 그에 따라 데이터 모델을 변환한다

    GET /api/devices/router-core-01?view=network-engineer
    → 반환: {interfaces: [...], bgp_peers: [...], vlans: [...]}
    
    GET /api/devices/router-core-01?view=finance
    → 반환: {cost_center: "...", warranty_expiry: "...", purchase_cost: ...}
  2. GraphQL 필드 선택: 소비자가 필요한 필드만 명시적으로 요청한다

    query NetworkEngineerView {
      device(name: "router-core-01") {
        interfaces { name, ip_address, status }
        bgp_neighbors { peer_ip, state }
      }
    }
    
    query FinanceView {
      device(name: "router-core-01") {
        cost_center
        purchase_date
        warranty_expiration
      }
    }
  3. 프로젝션 레이어: 백엔드가 특정 접근 패턴에 최적화된 파생 뷰를 계산한다

    • 네트워크 토폴로지 그래프: 노드로서의 장비, 엣지로서의 연결 (토폴로지 시각화용)
    • 서비스 종속성 트리: 서비스 → 장비 → 구성 요소의 계층적 뷰 (영향 분석용)
    • 컴플라이언스 매트릭스: 정책 준수 상태와 함께 존별로 그룹화된 장비 (감사용)
  4. 도메인별 언어 (DSL): 사용자 정신 모델에 맞춘 특수 쿼리 언어

    • 네트워크 엔지니어: “datacenter-1에서 BGP 세션이 다운된 장비를 보여줘”
    • 재무팀: “2025년 3분기에 구매한 장비의 월별 감가상각을 계산해”
    • 보안팀: “심각한 CVE가 있는 PCI 존의 장비 목록”

컨텍스트 인식 모델링의 이점

이점영향예시
인지 부하 감소사용자는 작업에 관련된 데이터만 본다재무팀은 VLAN 설정을 보지 않음; 네트워크 엔지니어는 구매 주문을 보지 않음
성능 최적화API가 최소한의 데이터를 반환해 대역폭과 처리 감소모바일 앱이 장비 전체 객체 (200개 이상 필드) 대신 요약 (5개 필드) 요청
모호성을 통한 보안 감소소비자 역할에 따라 민감한 필드 필터링권한 없는 소비자에게 자격 증명, 보안 존 숨김
API 안정성뷰가 안정적으로 유지되면 백엔드 스키마 변경이 소비자에게 영향 없음새 장비 필드 추가가 기존 네트워크 엔지니어 뷰 소비자에게 영향 없음
다국어 지원소비자 로케일에 따라 필드 이름, 열거형, 설명 번역카탈루냐어 사용 운영자가 “Location” 대신 “Ubicació"를 본다

그러나 과제와 다른 고려 사항도 있다:

  • 뷰 유지 오버헤드: 각 새 뷰는 정의, 테스트, 문서화가 필요하다
  • 뷰 간 일관성: 여러 뷰를 통해 노출되는 동일 데이터는 일관성을 유지해야 한다
  • 성능 복잡성: 동적 뷰 계산은 지연을 추가하므로 캐싱 전략이 필요하다
  • 발견 가능성: 소비자는 어떤 뷰가 있고 언제 사용할지 알아야 한다

컨텍스트 인식 모델링은 데이터 구조 최적화 (데이터를 효율적으로 저장하는 방법)와 소비 최적화 (소비자가 자연스럽게 데이터에 접근하는 방법) 사이의 다리다. 진실의 원천이 많은 주인을 섬기며, 각각이 자신의 작업에서 “진실"이 무엇을 의미하는지에 대한 자신만의 관점을 가지고 있음을 인식한다.

4.2.3.4. AI 지원 인터페이스#

소비 레이어에 AI를 적용하면 크고 복잡한 데이터 모델과 작업하는 인지 오버헤드가 줄어든다. 현대 SoT 구현에서 세 가지 패턴이 점점 더 일반화되고 있다:

  • 컨텍스트 제안: 장비 이름을 입력할 때, 시스템이 이 위치에서 이전에 편집한 일치하는 장비를 제안한다. 서비스를 생성할 때, 서비스 유형과 과거 패턴을 기반으로 합리적인 기술 파라미터를 제안한다. 유효성 검사 마찰을 추가하지 않고 입력 오류를 줄인다.

  • 쓰기 시 이상 경고: 벌크 업데이트 전에, 인터페이스가 작업이 과거 패턴과 비교해 비정상적인 경우 플래그를 세운다. 일반적으로 10개 장비를 건드리는 벌크 VLAN 재할당이 400개를 건드리려 하면 확인 단계가 트리거된다. 시스템은 작업을 차단하지 않고, 질문을 제기한다.

  • 자연어 쿼리: LLM 기반 인터페이스를 통해 운영자가 일반 언어로 SoT를 쿼리할 수 있다: “building-b에서 모니터링 태그가 없는 장비는 무엇인가?” 인터페이스가 이것을 구조화된 API 쿼리로 번역하고 사람이 읽을 수 있는 형식으로 결과를 반환한다. 임시 조사에는 가치 있지만 구조화된 자동화 인터페이스를 대체하지는 않는다.

세 가지 패턴 모두 동일한 기반에 의존한다: 과거 작업 데이터에 대한 접근과 AI가 추론할 수 있는 잘 모델링된 스키마. 4.2.4.4절에서 유사한 기법이 쓰기 경로의 데이터 품질 유효성 검사에 어떻게 적용되는지 다룬다.

4.2.4. 시행 (Enforcement)#

나쁜 데이터는 자동화를 망친다. 잘못된 인텐트는 네트워크 장애, 보안 침해, 혼란스러운 운영팀으로 이어진다. 시행은 수문장이다: 명백히 잘못된 데이터가 들어오는 것을 막고 그 이유를 명확하게 설명한다.

4.2.4.1. 스키마와 제약 시행#

유효성 검사 유형목적예시 규칙예시 오류
스키마 유효성 검사데이터 유형과 형식 강제VLAN id: 정수 1-4094
VLAN name: 문자열, 최대 32자
VLAN sites: 사이트 참조 배열
VLAN status: enum(active, planned, deprecated)
{ "id": 5000, "name": "CUSTOMER-VLAN" }
→ 오류: VLAN ID 5000이 최대값 4094를 초과
유일성 제약중복 항목 방지VLAN 100: 사이트당 유일
IP 192.0.2.1: IPAM 전체에서 유일
호스트명 “pe-01”: 지역당 유일
동일 지역에 두 번째 “pe-01” 생성 시도
→ 오류: 호스트명 이미 존재
참조 무결성관계가 유효하게 유지되도록 보장회선 참조: site_a, site_b (Sites에 존재해야 함), vendor (Vendors에 존재해야 함)회선이 참조하는 site_a 삭제
→ 옵션: 삭제 거부, 캐스케이드 삭제, 또는 “사이트 알 수 없음"으로 고아 처리
범위 유효성 검사숫자 및 패턴 제약 강제BGP AS: 1-4294967295
IPv4: regex ^(\d{1,3}\.){3}\d{1,3}$
인터페이스 속도: {1G, 10G, 25G, 40G, 100G}
인터페이스 속도 “5G”
→ 오류: 유효하지 않은 속도, {1G, 10G, 25G, 40G, 100G} 중 하나여야 함
비즈니스 규칙 유효성 검사조직 정책 강제VLAN status=‘active’이면 → 최소 1개 사이트 필요
장비 type=‘firewall’이면 → security_zone 필요
서비스 type=‘L3VPN’이면 → route_distinguisher는 고객당 유일해야 함
사이트 없는 활성 VLAN
→ 오류: 활성 VLAN은 최소 하나의 사이트에 할당되어야 함

스키마 유효성 검사를 구현하는 방법은 범용 코딩 언어에서 더 특화된 솔루션까지 다양하다:

  • JSON Schema: 실제 데이터와 비교하기 위한 데이터 제약을 설명하는 JSON 문서.
  • CUE: 제약과 유효성 검사가 있는 타입이 지정된 검증된 데이터 생성을 제공한다.
  • YANG: 내장 제약 강제가 있는 네트워크 특화 모델링 언어.

예를 들어, JSON Schema를 사용하면 JSON (또는 YAML) 데이터를 유효성 검사할 수 있다:

  • JSON 데이터
{
  "hostname": "sw-core-01",
  "mgmt_ip": "192.0.2.10",
  "role": "core",
  "interfaces": [
    {
      "name": "Ethernet1",
      "enabled": true,
      "vlan": 100
    },
    {
      "name": "Ethernet2",
      "enabled": false,
      "vlan": 200
    }
  ]
}
  • JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "required": ["hostname", "mgmt_ip", "role", "interfaces"],
  "additionalProperties": false,
  "properties": {
    "hostname": {
      "type": "string",
      "pattern": "^[a-z0-9-]+$"
    },
    "mgmt_ip": {
      "type": "string",
      "format": "ipv4"
    },
    "role": {
      "type": "string",
      "enum": ["core", "distribution", "access"]
    },
    "interfaces": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": ["name", "enabled", "vlan"],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "pattern": "^Ethernet[0-9]+$"
          },
          "enabled": {
            "type": "boolean"
          },
          "vlan": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4094
          }
        }
      }
    }
  }
}

4.2.4.2. 강한 시행 vs. 약한 시행#

나쁜 데이터를 거부하라. 완전한 차단이다. “약한 유효성 검사” 시스템이 “이번 한 번만"이 표준 운영 절차가 되어 쓰레기 더미로 변하는 것을 너무 많이 봤다. 유효성 검사를 할 만큼 중요하다면, 강제할 만큼도 중요하다.

하지만 항상 그렇듯이 예외가 있다:

  1. 정책 가이드라인 (규칙이 아닌): “/24를 보통 사용하는데 /22 서브넷을 사용하고 있다"는 경고이지 오류가 아니다. 사용자에게 경고하고 로그를 남기되, 오버라이드하면 진행하게 하라.

  2. 비용이 많이 드는 객체 간 검사: 유효성 검사에 몇 초 이상 걸린다면, 변경을 수락하고 비동기적으로 유효성 검사하라. 하지만 여전히 결과를 강제하라: 위반에 플래그를 세우고, 사용자에게 알리며, 수정을 요구하라.

  3. 브라운필드 네트워크 검색: 기존 설정을 가져올 때, 곳곳에서 위반을 발견할 것이다. 플래그를 세우되, 가져오기를 차단하지 마라. 핵심은 이상적인 모델을 위반하더라도 실제로 있는 것을 발견하는 것이다.

그 외에는? 거부하라. 자동화는 신뢰할 수 있는 데이터에 의존한다. 나쁜 데이터는 중단으로 이어진다.

4.2.4.3. 유효성 검사 비용과 성능 트레이드오프#

유효성 검사는 공짜가 아니다. 유효성 검사 비용의 계층 구조가 설계 결정에 영향을 미친다:

graph LR
    SPEED["⚡ 속도"]
    V1["< 1ms<br/>타입 유효성 검사"]
    V2["~10ms<br/>유일성"]
    V3["5-50ms<br/>Regex"]
    V4["50-200ms<br/>참조<br/>무결성"]
    V5["100-500ms<br/>규칙 엔진"]
    V6["1-5초<br/>외부 API"]
    V7["수 시간+<br/>일관성"]
    THOROUGH["철저함 🎯"]

    SPEED --> V1
    V1 --> V2
    V2 --> V3
    V3 --> V4
    V4 --> V5
    V5 --> V6
    V6 --> V7
    V7 --> THOROUGH

    style SPEED fill:none,stroke:none,font-size:14px,font-weight:bold
    style THOROUGH fill:none,stroke:none,font-size:14px,font-weight:bold
    style V1 fill:#d4edda,stroke:#28a745,stroke-width:2px
    style V2 fill:#d7ecf1,stroke:#17a2b8,stroke-width:2px
    style V3 fill:#dfe8f1,stroke:#17a2b8,stroke-width:2px
    style V4 fill:#fff3cd,stroke:#ffc107,stroke-width:2px
    style V5 fill:#ffe8cd,stroke:#ffc107,stroke-width:2px
    style V6 fill:#f8d7da,stroke:#dc3545,stroke-width:2px
    style V7 fill:#f5c2c7,stroke:#dc3545,stroke-width:2px

실용적인 시스템은 성능 목표를 선택하고 동기 쓰기 경로에 대해서만 그 수준까지 유효성 검사한다:

  • 빠른 경로 (< 10ms): 타입, regex, 로컬 인덱스 검사
  • 표준 경로 (< 100ms): 유일성, 참조 무결성
  • 느린 경로 (< 5초): 규칙 엔진, 복잡한 비즈니스 로직
  • 비동기 경로 (나중에 수 시간): 백그라운드 유효성 검사, 일관성 검사

4.2.4.4. AI 강화 데이터 품질#

머신러닝은 처리량을 늦추지 않고 데이터 품질을 개선한다. 이러한 AI 기반 유효성 검사 기법은 4.2.3.4절의 사용자 대면 AI 기능을 보완하여 포괄적인 지능형 데이터 레이어를 만든다.

이상 탐지

새 요청에 대해 과거 패턴을 비교해 불일치를 추론한다:

  • 과거 패턴: 새 지사를 프로비저닝할 때, 운영자는 1000-1999 범위에서 VLAN을 생성하고, site_a에 할당하며, 정적 라우팅을 설정한다
  • 새 요청: VLAN 2500 생성, site_c에 할당, OSPF 활성화
  • 경보: “이 VLAN 생성 패턴이 비정상적이다. 확실한가? (98% 신뢰도로 1000-1999 범위여야 함)”
  • ML 기법: 과거 변경 벡터에 대한 클러스터링 및 이상치 탐지

자동 수정 제안

가장 가능성 높은 유효한 솔루션으로 수정을 자동으로 제안한다:

  • 입력: IP 주소 “192.0.2.1/33” (유효하지 않은 프리픽스 길이 > 32)
  • 시스템: “/24를 의미한 것인가? (이 사이트의 유사 서브넷에서 추론)”
  • ML 기법: 동일 위치 내 서브넷 할당에 대한 패턴 매칭

일관성을 위한 벡터 임베딩

임베딩을 사용해 피어 설정과의 큰 차이를 탐지한다:

  • 각 장비 설정의 임베딩 저장
  • 새 장비 설정 제출
  • 임베딩을 동일 역할의 유사 장비와 비교
  • 크게 다른 경우: “이 장비는 역할에서 피어와 다르다: 유사 장비들은 NTP 서버 X, Y, Z를 가지고 서버 Z로 syslog를 보낸다”
  • ML 기법: 장비 설정 임베딩에 대한 코사인 유사도

ML 구현 고려 사항

측면권장 사항근거
신뢰도 임계값90% 이상 신뢰도를 가진 제안만 표시거짓 양성으로 인한 경보 피로 방지
학습 데이터6-12개월의 검증된 변경 사용최신성과 통계적 유의성의 균형
모델 업데이트주간 또는 드리프트 감지 시 재학습진화하는 네트워크 패턴에 적응
설명 가능성AI가 문제를 플래그한 이유 항상 표시권장 사항에 대한 운영자 신뢰 구축
인간 오버라이드운영자가 거짓 양성을 표시하게 허용피드백 루프를 통해 모델 개선

“신뢰도” 점수의 사용에 주목하라. 이는 AI를 사용할 때 중요한 개념으로, 권장 사항을 얼마나 믿을 수 있는지에 대한 더 많은 컨텍스트를 제공한다. AI 제안에는 항상 제안을 촉발한 기저 패턴의 설명을 함께 제공하라.

4.2.4.5. 시행 비용: 시스템 설계 함의#

고충실도 유효성 검사는 아키텍처에 영향을 미친다:

접근 방식장점단점적합한 경우
동기 유효성 검사
(쓰기 수락 전 유효성 검사)
사용자가 즉각적인 피드백 받음
데이터 일관성 보장
느린 API 응답 (유효성 검사 지연)
고처리량 자동화 차단
중요 데이터 무결성 작업
대화형 사용자 워크플로
비동기 유효성 검사
(먼저 수락, 나중에 유효성 검사)
빠른 API 응답
높은 처리량
데이터 일관성 윈도우 존재
복잡한 오류 보고 (“쓰기는 성공했지만 5분 후 유효성 검사 실패”)
벌크 작업
대용량 자동화
하이브리드 접근타입/형식 유효성 검사는 동기적으로 빠르게
비용이 많이 드는 객체 간 유효성 검사는 비동기적으로
유효성 검사 상태 확인 API 엔드포인트
더 복잡한 구현
상태 추적 필요
대부분의 프로덕션 시스템
성능과 정확성의 균형

4.2.5. 버전 관리 (Versioning)#

네트워크 인텐트는 끊임없이 변한다. 장비가 추가되고, 설정이 업데이트되고, 서비스가 이동하고, 정책이 조정된다. 버전 관리를 통해 언제 무엇이 사실이었는지, 어떻게 그렇게 됐는지 이해하고, 필요할 때 안전한 상태로 돌아갈 수 있다.

4.2.5.1. 버전 관리와 불변 감사 추적#

모든 변경은 불변적으로 기록되어 완전한 이력을 생성해야 한다. 이는 다양한 형태를 취할 수 있다. 예를 들어:

  • 변경 로그

    Change Event:
      timestamp: 2025-02-07T14:32:15Z
      user: engineer@company.com
      action: UPDATE
      resource_type: vlan
      resource_id: vlan-100
      changes:
        description: "Customer VLAN" → "Production Customer VLAN"
        assigned_sites: [site-a, site-b] → [site-a, site-b, site-c]
      reason: "Adding new office location"
      request_id: req-12345
  • Git 커밋

    commit 0c0ad51152f9b3be307802badb15eca8d121c576 (HEAD -> new-site, origin/new-site)
    Author: Engineer <engineer@company.com>
    Date:   Sat Feb 7 09:43:59 2026 +0100
    
        Adding a new site: BCN01
    
    diff --git a/sites.yaml b/site.yaml
    index ae18c87..dabf6c5 100644
    --- a/sites.yaml
    +++ b/sites.yaml
    @@ -219,51 +219,1279 @@ sites:
    
    + BCN01:

이 불변 로그는 중요한 질문에 답한다:

  • X 날짜에 네트워크 인텐트는 무엇이었는가? (시간 여행)
  • 누가 이 변경을 왜 했는가? (책임성)
  • 이 인텐트에 해당하는 배포 설정은 무엇인가? (추적 가능성)
  • 버전 Y와 Z 사이에 무엇이 변경됐는가? (diff/비교)

불변성이 핵심이다: 관리자조차도 과거 기록을 편집할 수 없다. 이것은 은폐를 방지하고 감사 추적이 신뢰할 수 있게 유지한다.

버전 관리는 보존 정책과도 관련이 있으며, 컴플라이언스와 실용성의 균형이 필요하다. 예:

  • 모든 변경을 7년 동안 유지 (규정 요구 사항)
  • 2년 후 중간 버전 정리 (예: VLAN 100이 10번 변경됐다면 시작과 끝만 유지)
  • 1년 후 콜드 스토리지에 아카이브 (비용 절감)

데이터 변경 이벤트와 관련해, 이벤트 소싱 패턴 (완전한 데이터 재현을 위해 모든 변경을 이벤트로 저장)은 강력하지만 네트워크 인프라 관리에서는 덜 일반적이다. 네트워크 인텐트는 고도로 상태 기반이기 때문이다. 변경으로 이어진 일련의 시퀀스보다 현재 데이터가 더 중요하다. 또한 네트워크 변경은 종종 이벤트만으로 완전히 재현할 수 없는 외부 상태 (장비 설정, 외부 시스템의 IP 할당)를 포함한다. 그러나 이벤트 소싱은 감사 컴플라이언스나 포렌식 분석과 같은 특정 유스케이스에서 가치 있을 수 있다.

4.2.5.2. 버전 관리 패턴: 브랜칭, 병합, 롤백#

현대 진실의 원천 시스템은 소프트웨어 버전 관리 패턴을 많이 차용한다. 이러한 기능은 안전한 병렬 작업, 실험적 변경, 실수로부터의 빠른 복구를 가능하게 한다.

병렬 작업 스트림을 위한 브랜칭

두 명 이상의 엔지니어나 AI 에이전트가 병렬로 작업하는 조직은 서로를 차단하지 않고 작업하는 방법이 필요하다. 한 주체 (인간 또는 AI)가 새 데이터를 프로비저닝하는 작업 중에 전체 진실의 원천을 차단할 수는 없다.

소프트웨어 개발에서 배워서, 브랜칭 메커니즘이 병렬 작업 스트림을 가능하게 한다. 각 팀은 병렬 데이터 트랙에서 작업하고, 준비됐을 때 “main” 트랙과 병합할 수 있다. 이 병합은 도입됐을 수 있는 불일치를 해결하는 기회다.

예시 워크플로:

main 브랜치 (프로덕션 인텐트)
  │
  ├─── feature/add-dallas-office (엔지니어 A)
  │     • 사이트 DAL-01 생성
  │     • VLAN 2100-2110 할당
  │     • 새 장비 5개 정의
  │
  └─── feature/upgrade-ntp-servers (엔지니어 B)
        • 모든 장비에 대한 NTP 설정 변경
        • 3,000개 장비 레코드 업데이트

두 브랜치가 main으로 다시 병합될 때:

  • 충돌 없음: 서로 다른 객체가 수정됨 → 자동 병합
  • 충돌 감지: 둘 다 device-core-01의 NTP를 수정함 → 수동 해결 필요
  • 유효성 검사: 병합된 결과가 커밋 전에 모든 시행 규칙을 통과해야 함

전통적인 데이터베이스에 이 브랜칭 메커니즘을 구현하는 것은 그 자체로 중요한 문제다. 예를 들어, 관계형 데이터베이스에 의존하는 NetBoxNautobot은 서로 다른 접근 방식을 취했다: NetBox는 브랜칭에 데이터베이스 사본을 사용하고, Nautobot은 Dolt (내장 Git 유사 Versioning이 있는 SQL 데이터베이스)를 활용한다. Git 유사 브랜칭을 염두에 두고 처음부터 설계된 Infrahub는 내장 네이티브 브랜칭 기능이 있는 그래프 데이터베이스를 사용해 이를 구현했다.

Rollback과 복구

실수는 발생한다. 데이터 Rollback은 빠르고 신뢰할 수 있어야 한다. 이것은 네트워크 설정이 아닌 인텐트 데이터 자체의 Rollback임에 주목하라.

데이터를 롤백하려면 실행 구성 요소가 설정 변경을 강제해야 한다 (네트워크 인프라의 설정을 가능하다면 롤백할 수 있지만, 결국 네트워크와 인텐트 모두 안정적인 상태를 유지하기 위해 동기화되어야 한다).

데이터 Rollback을 지원하는 두 가지 주요 접근 방식이 있다:

접근 방식작동 방식스토리지 오버헤드복구 속도복잡성
스냅샷전체 데이터셋의 주기적 전체 복사높음 (스냅샷당 전체 복사)빠름 (직접 복원)낮은 구현 복잡성
이벤트 소싱모든 변경을 이벤트로 기록, 재생하여 상태 재구성낮음 (델타만 저장)느림 (이벤트를 재생해야 함)높은 구현 복잡성
하이브리드N시간마다 스냅샷 + 스냅샷 사이의 이벤트 로그중간스냅샷까지 빠름, 이후 이벤트 재생중간 복잡성

Rollback은 두 가지 방식으로 트리거될 수 있다:

  • 수동: 운영자가 문제를 인식하고 Rollback 시작
  • 자동:
    • 옵저버빌리티가 배포 후 증가한 오류율 감지
    • 배포 후 유효성 검사 실패 (“변경 후 500개 장비 연결 불가”)
    • 비즈니스 영향 임계값 초과 (“고객 SLA 위반 > 10건”)

브랜칭 (충돌 없는 병렬 작업)과 Rollback (실수로부터의 빠른 복구)의 조합은 대규모 네트워크 자동화가 요구하는 시간적 유연성을 제공한다.

4.2.5.3. 원자적 트랜잭션과 일관성 보장#

트랜잭션 보장은 여러 관련 변경이 함께 성공하거나 실패해야 할 때 데이터 일관성을 보장한다:

  • 원자성: 모든 것이 성공하거나 모든 것이 롤백된다
  • 일관성: 변경 전후에 데이터 제약 유지
  • 격리: 동시 트랜잭션이 서로 간섭하지 않음
  • 영속성: 일단 커밋되면 시스템이 충돌해도 유지

이를 구현하려면 신중한 설계가 필요하다:

  • 데이터베이스 트랜잭션 (모든 데이터가 단일 DB에 있는 경우)
  • 분산 트랜잭션 (데이터가 여러 시스템에 걸친 경우)
  • Saga 패턴 (네이티브 분산 트랜잭션 지원이 없는 경우)

11장에서 이러한 요구사항이 신뢰할 수 있는 시스템에 어떻게 영향을 미치는지 더 다룰 것이다.

4.2.5.4. 변경 승인 워크플로#

데이터 변경이 제안되면, 활성화되기 전에 인간 승인 워크플로가 필요할 수 있다. 데이터는 최종으로 간주되기 전에 지속적 통합 파이프라인과 유사하게 여러 단계를 거친다.

graph LR
    A["운영자가 변경 제안<br/>새 지사 장비 50개 추가"] --> C["스테이징<br/>아직 네트워크 영향 없음<br/>미리보기, 테스트, 드라이런"]
    C --> D["자동화 검사 유효성 검사<br/>스키마 및 제약?"]
    C --> E["시뮬레이션<br/>라우팅/MPLS 영향?"]
    C --> F["컴플라이언스<br/>보안 정책?"]
    D --> G{모든 검사<br/>통과?}
    E --> G
    F --> G
    G -->|통과| H["인간 검토<br/>변경 제어"]
    G -->|실패| I["거부됨<br/>제안자에게 통보"]
    H --> J{승인?}
    J -->|예| K["승인됨<br/>배포 준비 완료"]
    J -->|아니오| I

예시 데이터 변경 워크플로는 다음과 같다:

  1. 운영자가 변경 제안: “새 지사 장비 50개 추가”

  2. 변경이 스테이징 진입: (아직 네트워크에 영향 없음, 미리보기, 테스트, 드라이런 가능)

  3. 자동화 검사 실행 (지속적 통합):

    • 유효성 검사: 스키마와 제약을 통과하는가?
    • 시뮬레이션: 라우팅, MPLS 등을 깨뜨리는가?
    • 컴플라이언스: 보안 정책을 위반하는가?
    • 보고: 모두 통과
  4. 인간 검토:

    • 변경 제어 위원회가 알림을 받는다
    • diff, 근거, 영향 범위 검토
    • 승인하거나 변경 요청
  5. 승인 결정, 변경이 승인 상태로 전환.

  6. 배포 트리거: 승인되면, 네트워크에 관련 변경을 최종 배포하기 위해 워크플로 구성 요소를 트리거한다 (자동화된 실행 워크플로의 일반적인 트리거)

그러나 모든 변경에 인간 승인이 필요한 것은 아니며, 대부분의 조직이 여기서 실수를 한다. 변경 제어 위원회는 자동화가 죽으러 가는 곳이다. 승인을 건너뛰라는 것이 아니라, 자동화하라는 것이다 (즉, 규모에서의 변경 승인).

CAB가 VLAN 추가를 승인하기 위해 매주 모인다면, 이미 뒤처진 것이다. 변경의 95%를 자동 승인하는 가드레일을 구축하고, 실제로 위험한 것에 대해서만 인간 검토를 남겨라. 예를 들어, AWS VPC를 프로비저닝할 때 운영자는 네트워크 변경을 승인받기 위해 인간을 기다리지 않는다: 정의된 경계 내에서 검증된 템플릿을 따르는 것이다.

규칙은 이렇다: 명확한 가드레일 내에 맞는 변경은 자동으로 진행되고, 가드레일 로직 자체만 인간 검토와 승인이 필요하다. 최소 가드레일 커버리지와 최대 영향 허용 한도를 정의하라. 그런 다음 비켜서서 시스템이 작동하게 하라.

그렇지 않으면, “자동화"는 그냥 회의를 기다리는 더 예쁜 방식일 뿐이다.

4.2.6. 집계 (Aggregation)#

네트워크 데이터는 진공 속에 존재하지 않는다. HR 시스템은 누가 어디서 일하는지 추적한다. 자산 관리 시스템은 장비 세부 정보와 보증 날짜를 안다. IPAM 시스템은 IP 주소 할당을 소유한다. 회선 제공업체는 연결성 정보를 가지고 있다. 서비스팀은 SLA 세부 정보를 갖고 있다.

또 다른 데이터 사일로를 만들지 마라. 조직에는 이미 너무 많다. 진실의 원천이 ServiceNow, Infoblox, CMDB에서 가져올 수 없다면, API가 있는 스프레드시트 2.0을 구축하는 것이다. 아무도 유지하지 않을 것이다. 사람들이 기존 도구를 계속 사용하면서 당신이 무시당하는 동안 “SoT를 업데이트해 주세요"라고 애걸하는 데 평생을 보내게 될 것이다.

집계는 선택 사항이 아니다: 기존 시스템에서 데이터를 가져오고, 양방향으로 동기화 상태를 유지하며, 통합된 뷰를 제공하라. 진실의 원천은 대체 데이터베이스가 아닌 연합 레이어가 되어야 한다.

4.2.6.1. 제로에서 시작하지 않는다#

여러 시스템에 데이터가 흩어져 있을 가능성이 매우 높다. 각 시스템은 자신의 도메인에 대해 권위 있다: HR은 조직을 소유하고, 자산 시스템은 하드웨어 세부 정보를 소유하며, IPAM은 IP 할당을 소유한다. 진실의 원천은 이러한 시스템을 대체하지 않는다; 클라이언트가 다섯 개의 다른 시스템을 쿼리하지 않아도 되도록 데이터를 하나의 일관된 인터페이스로 통합한다.

  • 조직 컨텍스트:

    • HR 시스템: 부서, 팀, 역할, 책임 매트릭스
  • 인프라:

    • 자산 관리: 하드웨어 세부 정보, 시리얼 번호, 조달, 보증
    • 클라우드 플랫폼: VPC, 서브넷, 보안 그룹, 인스턴스 세부 정보
    • 회선 제공업체 (외부): 연결성 상태, 활용도, 장애
    • IPAM 시스템: IP 할당, DHCP 범위, DNS 항목
    • 설정 관리: 템플릿, 기준선
  • 서비스:

    • 서비스 카탈로그: 서비스 정의, SLA, 고객
    • 청구 시스템: 차지백, 용량 계획

각 시스템은 자신의 도메인 내에서 권위 있다 (도메인을 데이터 유형, 또는 명확하게 구분된 데이터 유형의 하위 집합으로 이해). 진실의 원천은 이것들을 대체하지 않는다; 복잡한 클라이언트 애플리케이션이 여러 소스에서 데이터를 상관시킬 필요 없이 일관된 인터페이스를 통해 접근 가능한 일관된 전체로 데이터를 조율한다.

4.2.6.2. 연합 시스템의 충돌 해결#

데이터가 여러 소스에서 올 때 충돌이 발생한다:

  • 중앙 집중식 IPAM 시스템 말: 192.0.2.0/24는 고객 X에 할당됨
  • CMDB 말: 192.0.2.0/24는 고객 Y에 할당됨

누가 맞는가? 거버넌스를 통한 권한 지정에 따라 다르다.

예를 들어, 리소스 도메인 소유권 전략은 다음과 같이 지정할 수 있다:

  • 중앙 집중식 IPAM, 다음의 진실의 원천:

    • IP 주소 할당
    • 서브넷 크기
    • DHCP 범위
  • CMDB, 다음의 진실의 원천:

    • VLAN-서브넷 매핑
    • 인터페이스 IP 할당
    • 네트워크 인터페이스 운영 상태

충돌 해결 전략:

  • 소스 권한 (가장 일반적): 거버넌스 결정이 한 시스템을 권위 있는 것으로 지정 (예: 자산 시스템이 장비 자격 증명에 대해 권위 있음)

  • 타임스탬프 기반: 마지막 수정 타임스탬프 사용; 가장 최근 변경이 우선. 위험: 수정 변경 대 실수를 설명하지 않음

  • 논리적 해결: 컨텍스트 평가:

    • SoT 값이 현재 장비에서 사용 중 (현재, 작동 검증됨)
    • 자산 시스템 값이 Desired State로 주장됨 (되어야 할 것)
    • 옵션 1: 현재를 신뢰 (작동하는 것)
    • 옵션 2: 되어야 할 것을 신뢰 (거버넌스 모델)
    • 옵션 3: 탐지: 장비의 설정이 두 값 모두와 일치하지 않음, 더 조사
  • 수동 에스컬레이션: 신뢰도가 중간일 때 (값이 다르지만 모순되지 않음), 인간 검토로 에스컬레이션

4.2.6.3. 집계 아키텍처#

데이터 집계에 두 가지 근본적인 접근 방식이 있다:

접근 방식아키텍처작동 방식동기화 패턴장점단점
중앙 집중식 집계
(풀 모델)
중앙 SoT가 외부 시스템에서 가져옴- 집계기가 소스를 폴링/구독
- 통합 스키마로 변환
- 충돌 감지
- 로컬 데이터 보강
- 통합 뷰 제공
- 양방향 (SoT ↔ IPAM)
- 단방향 (SoT ← HR)
중앙 집중식 제어
적극적인 유효성 검사/보강
단일 소비자 쿼리 포인트
소스까지 네트워크 지연
외부 가용성에 의존
최종 일관성만
규모 과제
분산 연합
(푸시 모델)
각 시스템이 자체 데이터 유지, SoT가 조율- 이벤트 기반 (메시지 버스)
- 실시간 알림을 위한 웹훅
- 참조 데이터를 위한 캐시 레이어
- 느리게 변하는 데이터를 위한 예약 갱신
- 이벤트 기반
- 웹훅 기반
- 캐시된 참조 데이터
도메인 소유 데이터 품질
중복 없음
병목 없이 확장
강한 도메인별 일관성
소비자가 여러 시스템 쿼리
시스템 간 조인 비용이 많이 듦
복잡한 메시지 조율

4.2.6.4. 동기화 메커니즘#

시스템 간 데이터 일관성 유지가 집계의 핵심 과제다. 아키텍처 선택이 어떤 동기화 접근 방식을 사용할지 결정한다:

메커니즘작동 방식예시 흐름장점단점일반적인 지연
주기적 동기화
(일정 기반)
일정에 따라 데이터 풀6시간마다:
1. SoT가 IPAM에서 읽음
2. 로컬 캐시와 비교
3. 뷰에 변경 적용
4. SoT 변경 다시 게시
간단함
예측 가능
낮은 오버헤드
시간 단위의 불일치 윈도우
배치 충돌
분에서 시간
이벤트 기반
(메시지 버스)
실시간으로 변경에 반응IPAM이 서브넷 10.0.0.0/24 변경
→ “Subnet:Changed"를 버스에 게시
→ SoT가 메시지 소비
→ 로컬 캐시 업데이트
실시간
반응형
복잡한 코레오그래피
디버그 어려움
스트리밍/웹훅
(직접 푸시)
소스가 등록된 웹훅에 푸시SoT가 웹훅 등록
→ IPAM이 10.0.2.5/32 할당
→ 웹훅에 HTTP POST
→ SoT가 유효성 검사, 업데이트
직접 통신
메시지 버스 불필요
웹훅 지원 필요
네트워크 신뢰성 문제
1초 미만에서 초

실시간 동기화 시스템은 없다. 데이터는 결국 일관성을 갖게 되지만, 이는 각 유스케이스에서 평가해야 하는 시간이 걸릴 수 있다.

4.2.6.5. 데이터 거버넌스와 권한 프레임워크#

효과적인 연합은 데이터 도메인별 명시적 정의와 함께 명확한 거버넌스를 필요로 한다. 예:

도메인권위 있는 소스동기화 방향주기충돌 해결
장비 인벤토리자산 관리 시스템자산 → SoT (SoT에서 읽기 전용)일별자산이 항상 우선
네트워크 토폴로지중앙 SoTSoT → 보고 시스템실시간해당 없음 (SoT가 소스)
IP 할당IPAM 시스템양방향인바운드 시간별, 아웃바운드 실시간자유 풀은 IPAM 우선, 정적 할당은 SoT 우선

각 데이터 요소에 대해 권한 메타데이터가 추적해야 할 것:

  • 소스 시스템: 어디서 왔는가?
  • 마지막 동기화 시간: 언제 확인됐는가?
  • 업데이트 방법: 폴링, 푸시, 또는 웹훅?
  • 권한 수준: 이 데이터는 얼마나 신뢰할 수 있는가?

이 메타데이터로 시스템은 데이터 처리에 대한 정보에 입각한 거버넌스 결정을 내릴 수 있다.

여러 엔티티를 다룰 때는 실패에 대비하라. 외부 시스템은 필연적으로 실패한다. 연합 소스를 사용할 수 없을 때 (예: IPAM이 30분 동안 다운), 몇 가지 전략이 있다 (독을 골라라):

  1. 작업 차단: “IPAM 없이는 IP 주소를 할당할 수 없다”
  2. 캐시된 데이터 사용 + 오래됐다고 표시: “2시간 전 캐시된 IPAM 데이터 사용 중; 불일치할 수 있다”
  3. 우아한 저하: “여전히 장비를 프로비저닝할 수 있고, IP 할당을 건너뛰고, IPAM이 복구될 때 IP 할당을 큐에 넣는다”

4.2.7. 브라운필드 온보딩 (Brownfield Onboarding)#

위의 여섯 가지 기능은 SoT가 채워지고 신뢰된 후 어떻게 작동하는지 설명한다. 두 가지 운영 현실이 그 상태에 도달하고 유지하는지를 결정한다: 기존 네트워크에서 어떻게 채우는지, 그리고 시간이 지남에 따라 정확하게 유지하는지. 어느 것도 단일 기능에 깔끔하게 매핑되지 않지만, 두 가지 모두 실제로 여섯 가지 중 하나가 작동하기 위한 전제 조건이다.

기존 네트워크에 진실의 원천을 배포할 때, 까다로운 문제에 직면한다: 모든 레거시 잡동사니를 영구적인 진실로 포함시키지 않고 현재 상태로 어떻게 채우는가?

잘못된 접근: 장비를 폴링하고 “현재 실행 중인 것 = 있어야 할 것"이라고 가정하라. 그러면 모든 임시방편, 해킹, 기술 부채를 진실의 원천에 곧바로 로드하게 된다.

올바른 접근: 현재 네트워크 상태를 진실이 아닌 출발점으로 사용하라. 스냅샷을 찍어 로드한 다음, 의도적으로 깔끔하게 재설계하라. 원하는 설계를 갖게 되면, 네트워크에서 동기화를 중단하라. 진실의 원천이 주인이 된다; 네트워크가 그 선도를 따른다. 실제로 이렇게 보인다:

  1. 부트스트랩: 현재 네트워크의 스냅샷을 찍어 (장비, IP, VLAN, 회선) 시작 데이터로 진실의 원천에 로드한다.

  2. 재설계: 몇 주에서 몇 달에 걸쳐, 사람들이 그 데이터를 검토하고 의도된 상태가 실제로 어때야 하는지 결정하게 하라. 중복 VLAN을 통합하고, 레거시 항목을 정리하며, 명명 규칙을 표준화하고, 향후 배포를 위한 설계 템플릿을 작성하고 싶을 것이다.

  3. 방향 전환: 원하는 설계가 생기면, 네트워크에서 진실의 원천으로 다시 동기화를 중단하라. 이제 진실의 원천이 주인이다. 실행 (5장)이 변경을 네트워크에 외부로 밀어낸다.

  4. 드리프트 감지: 옵저버빌리티 (6장)가 진실의 원천이 있어야 한다고 말하는 것에서 드리프트하는 장비를 감시한다. 드리프트가 발생하면, 운영자가 결정한다: 장비를 수정할지 진실의 원천을 수정할지?

이 문제에 집중한 Slurpit.io나 NetBox 또는 Nautobot용 확장 같은 도구들이 있다.

이 접근 방식은 초기 노력이 필요하지만 배포된 상태를 영구적인 진실로 취급하는 함정을 피한다. 네트워크가 완전히 정렬되는 데 시간이 걸리더라도 SoT는 깔끔한 설계 인텐트를 향해 발전한다. 물론, 네트워크가 드리프트하지 않았는지 재확인하기 위해 드라이런 모드로 계속 사용할 수 있다.

4.2.8. 데이터 수명 주기와 조정 (Data Lifecycle and Reconciliation)#

데이터는 오래된다. 스위치가 SoT에서 제거되지 않은 채 폐기된다. IP 주소가 인시던트 중에 수동으로 재할당된다. 긴급 작업을 하는 계약자가 VLAN을 트렁크 포트에 추가한다. 3개월 후, 아무도 기억하지 못하고, SoT는 네트워크가 몇 주 전에 중단한 것을 기록한다.

시행 (4.2.4절)은 들어오는 데이터를 유효성 검사한다. 그것으로 충분하지 않다. 생성 시에 정확했던 레코드는 주변 세계가 변했다는 이유만으로도 부정확해질 수 있다. 지속적인 조정 프로세스 없이는 SoT가 점진적으로 신뢰성을 잃는다: 팀이 신뢰를 중단하고, 자체 스프레드시트를 유지하기 시작하며, 그 위에 구축된 자동화가 조용히 잘못된 결과를 생성하기 시작한다.

조정 패턴

조정은 실제 네트워크 상태를 SoT와 주기적으로 비교하고 모든 불일치를 분류하는 것을 의미한다:

  • 설정 드리프트: 장비가 SoT 인텐트와 다르다. SoT가 맞고, 네트워크가 드리프트했다. 실행 블록을 트리거해 수정한다.
  • 기록되지 않은 변경: 의도적인 변경이 네트워크에 이루어졌지만 SoT에 기록되지 않았다. 네트워크가 맞고, SoT가 오래됐다. 운영자에게 인텐트를 업데이트하도록 경보를 보낸다.
  • 고아 레코드: SoT에 네트워크에 더 이상 존재하지 않는 것의 객체 (장비, 프리픽스, VLAN)가 있다. 정리 검토를 위해 큐에 넣는다.

각 클래스는 다른 응답이 필요하다. 자동화가 드리프트 수정을 처리할 수 있다 (정의된 가드레일 내에서). 기록되지 않은 변경은 인간의 판단이 필요하다: 공식화해야 할 긴급 수정이었는가, 되돌려야 할 무단 변경이었는가? 고아 레코드는 자동으로 삭제하지 않고, 후보를 검토를 위해 표시하는 정리 워크플로가 필요하다.

주의해야 할 데이터 부패 패턴

실제로, SoT 오래됨의 가장 일반적인 원인은:

  • 제거되지 않은 폐기 장비: SoT에 관리 IP가 있는 장비 레코드가 있지만 장비는 물리적으로 제거됐다. 해당 IP를 대상으로 하는 자동화는 실패하거나, 더 나쁘게는 다른 역할로 재배포된 장비에 도달한다.
  • 수동으로 재할당된 IP: SoT에 장비 A에 속하는 것으로 나열된 IP가 인시던트 중에 장비 B에 의해 사용 중이다. SoT와 IPAM 모두 내부적으로 일관성이 있지만 실제 네트워크 대비 잘못됐을 수 있다.
  • VLAN 범위 확장: VLAN이 정의된 스위치 집합에 배포됐지만, 문제 해결 중에 추가 트렁크에 추가됐다. SoT 인텐트가 더 이상 실제 멤버십과 일치하지 않는다.

조정 주기

모든 데이터가 같은 속도로 노화되는 것은 아니다. 장비 인벤토리는 느리게 변한다; 운영 상태는 지속적으로 변한다. 실용적인 접근은 데이터 유형별로 조정 주기를 계층화하는 것이다: 장비 인벤토리는 일별 조정, IP 할당은 시간별 조정, VLAN 멤버십은 모든 변경 이벤트 후와 일별 배치 스위프.

브라운필드 온보딩 (4.2.7절)은 일회성 마이그레이션이다. 조정은 운영 중에 SoT를 신뢰할 수 있게 유지하는 운영 프로세스다. 조정을 건너뛰는 팀은 몇 달 내에 SoT에 대한 신뢰가 무너지고, 그 위에 구축된 자동화가 조용히 잘못된 결과를 생성하기 시작하는 것을 발견하게 될 것이다.

라이브 의존성으로서의 SoT

참조로 사용되는 SoT (자동화가 워크플로 시작 시 읽음)와 라이브 의존성으로 사용되는 SoT (자동화가 데이터가 현재임을 신뢰하면서 워크플로의 각 단계에서 읽음) 사이에는 구조적 차이가 있다. 두 패턴 모두 유효하지만, 두 번째는 첫 번째가 필요로 하지 않는 운영 요구사항을 만든다.

실행기나 오케스트레이터가 워크플로 시작 시 SoT에서 장비 인벤토리를 읽고 200개 장비에 걸쳐 팬아웃하면, 스냅샷에서 작동하는 것이다. 실행 단계와 스냅샷 읽기 사이에 장비가 폐기되거나 IP 주소가 재할당되면, 자동화가 오래된 데이터로 행동한다. 짧은 워크플로에서는 일반적으로 허용 가능하다. 장기 실행 워크플로 (몇 시간 동안 실행되는 펌웨어 업그레이드, 유지보수 윈도우에 걸친 프로비저닝 실행)에서는 오래됨 윈도우가 중요하다.

완화책은 SoT 가용성을 가정이 아닌 의존성으로 취급하는 것이다:

  • 오케스트레이터는 팬아웃 단계를 시작하기 전에 SoT 읽기가 성공하고 현재 레코드를 반환했는지 확인해야 한다 (마지막 동기화 타임스탬프를 확인하거나 SoT의 자체 상태 엔드포인트를 사용).
  • 장기 실행 워크플로의 경우, 시작 시 한 번이 아니라 각 주요 워크플로 단계에서 SoT를 다시 읽는 것을 고려하라.
  • SoT를 사용할 수 없는 경우, 워크플로는 알 수 없는 나이의 캐시된 스냅샷으로 진행하지 않고, 명확한 오류로 깔끔하게 실패해야 한다.

이것은 또한 SoT 자체가 가용성을 위해 설계되어야 함을 의미한다. 모든 자동화에 대한 쓰기 권위 있는 소스이지만 고가용성 설정이 없는 SoT는 전체 자동화 플랫폼의 단일 장애 지점이다. 4.2.9절에서 특정 솔루션을 다룬다; 11장에서 플랫폼 전체의 가용성 설계를 다룬다.

4.2.9. 솔루션 현황 (Solutions Landscape)#

진실의 원천 제품은 많다. 일부는 오픈 소스고, 일부는 상용이다. 일부는 범용이고, 일부는 IP 관리와 같은 특정 도메인에 특화되어 있다. 이것은 2026년 초 기준의 스냅샷이다: 상황은 계속 변하므로, 선택하기 전에 항상 현재 기능과 모멘텀을 확인하라.

4.2.9.1. 오픈 소스 솔루션#

솔루션다루는 데이터 도메인주요 기술 특성
NetBoxIPAM, DCIM, 회선, 장비, 가상화, 인벤토리- 광범위한 플러그인 생태계 (150개 이상 플러그인)
- 대규모 커뮤니티와 함께 성숙 (10년 이상)
- 버전 간 빈번한 브레이킹 변경
NautobotIPAM, DCIM, 회선, 장비, 인벤토리, 확장 가능한 앱- 강화된 확장성을 가진 NetBox 포크
- 자동화 워크플로를 위한 Job 프레임워크
- Git 데이터 소스 통합
- 전문 지원이 있는 안정적인 API
Infrahub네트워크 토폴로지, 장비, IPAM, 스키마, 관계- 복잡한 관계 모델링을 위한 그래프 데이터베이스
- 코어 아키텍처에 내장된 Git 유사 브랜칭
- 동적 데이터 모델을 가진 스키마 기반
- 변경 검토를 위한 제안된 상태 워크플로

4.2.9.2. 상용 솔루션#

솔루션다루는 데이터 도메인주요 기술 특성
ServiceNow CMDB설정 항목, 서비스, 자산, 변경- 엔터프라이즈 ITSM 통합
- ITIL 정렬 워크플로
- 다중 벤더 연합 기능
- AI/ML 기반 통찰과 권장 사항
Device42데이터 센터 자산, 종속성, 애플리케이션 매핑, IPAM- 빠른 온보딩을 위한 포괄적인 자동 검색
- 애플리케이션 종속성 매핑
- 여러 플랫폼에 걸친 에이전트리스 검색

앞서 나열한 모든 오픈 소스 솔루션은 상용 제공도 있다.

4.2.9.3. 특화 플랫폼#

솔루션다루는 데이터 도메인주요 기술 특성
InfobloxDNS, DHCP, IPAM (DDI)- 엔터프라이즈급 DDI 권한
- DNS 보안 및 위협 인텔리전스
- 다중 사이트 복제
SolarWinds IPAMIP 주소 관리, DHCP, DNS- SolarWinds 모니터링 생태계와의 네이티브 통합
- 자동화된 IP 충돌 감지
- Active Directory 통합
phpIPAMIP 주소 관리, 서브넷, VLAN- 가볍고 비용 효율적
- 간단한 배포 (LAMP 스택)
- DCIM 복잡성 없는 간단한 IPAM

4.2.9.4. 선택 고려 사항#

진실의 원천 솔루션을 평가할 때, 이러한 정렬 요소를 고려하라:

  • 규모 요구사항: 장비 수 (수백 대 대 수십만 대), 변경 속도, 쿼리 볼륨
  • 데이터 모델 필요: 관계형 구조 (NetBox, Nautobot) 대 그래프 관계 (Infrahub) 대 유연한 문서 저장소
  • 통합 생태계: 데이터를 연합해야 하는 기존 도구 (모니터링, ITSM, 클라우드 플랫폼)
  • 팀 전문성: Python/Django 친숙도, 로우코드 플랫폼 선호, Git 워크플로 편안함
  • 운영 모델: 자체 호스팅 대 SaaS, 변경 승인 프로세스, RBAC 요구사항
  • 진화 궤적: 브라운필드 마이그레이션 경로, 스키마 확장성, API 안정성

4.3. 구현 예시#

4.3.1. 유스케이스: 캠퍼스 네트워크를 위한 SoT 구축#

3장에서 소개한 캠퍼스 네트워크로 돌아간다. 여러 건물에 걸쳐 Cisco, Arista, HPE의 약 800개 액세스 및 배포 스위치가 있으며, 운영팀은 새 VLAN, IP 서브넷 할당, 라우팅 정책 업데이트, 접근 제어 변경 등의 꾸준한 서비스 요청을 처리한다. 이 모든 것을 안정적으로 자동화하기 전에, 데이터가 일관되고 권위 있는 곳에 있어야 한다.

현재 캠퍼스는 각각 그림의 일부를 소유하는 세 개의 별도 시스템으로 운영된다:

  • Infoblox: 모든 캠퍼스 서브넷에 걸쳐 IP 주소 할당, 프리픽스 할당, DNS를 관리하는 권위 있는 IPAM
  • ServiceNow: 스위치 위치, 하드웨어 모델, 건물 할당, 유지보수 이력을 추적하는 자산 인벤토리와 CMDB
  • 캠퍼스 스위치: 800개 장비에 분산된 실제 실행 중인 설정, 무엇이 어디에 배포됐는지에 대한 단일 통합 뷰가 없다

과제: 애플리케이션팀이 새 VLAN 서비스 세그먼트 요청을 제출하면, 네트워크 엔지니어는 사용 가능한 서브넷을 찾기 위해 Infoblox, 대상 건물의 스위치를 알기 위해 ServiceNow, 현재 VLAN 할당을 확인하기 위해 장비 Secure Shell (SSH) 세션을 수동으로 교차 참조해야 한다. 각 스위치의 의도된 상태에 대한 단일 합의가 없기 때문에 Configuration Drift가 누적된다. 새 벤더 설계 템플릿을 추가하려면 일관성을 보장할 방법 없이 여러 곳의 문서를 업데이트해야 한다.

솔루션: Infoblox와 ServiceNow 모두와 통합하고, 캠퍼스 스위치에서 현재 상태를 가져오며, Infoblox나 ServiceNow가 제공할 수 없는 네트워크 특화 데이터 모델을 추가하는 연합 네트워크 진실의 원천으로 Nautobot을 배포한다: VLAN 정의, 벤더별 설정 템플릿, 액세스 및 배포 레이어를 위한 설계 패턴, 실행기가 단일 플레이북을 실행하기 전에 존재해야 하는 기술 객체에 비즈니스 요청을 연결하는 서비스 요청 데이터 모델.

이 예시는 설명을 위한 것이지 규정하는 것이 아니다. 이 시나리오를 해결할 수 있는 많은 유효한 SoT 제품과 아키텍처가 있다. 핵심은 여섯 가지 빌딩 블록 - 모델링, 소비, 시행, 버전 관리, 집계, 설계 주도 - 이 실제 시나리오에서 어떻게 함께 작동하는지 보여주는 것이다. 조직의 SoT는 기존 도구, 팀 전문성, 제약 조건에 따라 다르게 보일 것이다.

4.3.2. 솔루션 아키텍처#

graph TB
    IPAM["Infoblox<br/>권위 있는 IPAM<br/>IP 범위, DNS"]
    CMDB["ServiceNow<br/>권위 있는 CMDB<br/>자산, 위치, 메타데이터"]
    DEVICES["캠퍼스 스위치<br/>Cisco, Arista, HPE<br/>~800개 장비"]

    SLURPIT["Slurpit<br/>브라운필드 검색<br/>설정 추출"]

    subgraph NAUTO ["Nautobot (집계 허브)"]
        direction TB
        AGG["집계 레이어<br/>권한 규칙<br/>충돌 해결"]
        SOT["통합 SoT 및 데이터 확장<br/>장비, IP, 사이트<br/>관계"]
        API["소비 API<br/>REST, GraphQL<br/>웹훅"]
    end

    EXEC["실행 시스템<br/>설정 생성<br/>장비 배포"]
    OBS["옵저버빌리티<br/>상태 유효성 검사<br/>드리프트 감지"]
    UI["프레젠테이션<br/>Web UI, CLI<br/>대시보드"]

    IPAM -->|웹훅/폴링<br/>IP 데이터| AGG
    CMDB -->|웹훅/폴링<br/>자산 데이터| AGG
    DEVICES -->|SSH/NETCONF<br/>장비 상태| SLURPIT
    SLURPIT -->|변환된 데이터<br/>초기 부트스트랩| AGG

    AGG --> SOT
    SOT --> API

    API -->|인텐트 쿼리| EXEC
    API -->|설정 템플릿| EXEC
    API -->|데이터 접근| UI

    OBS -->|상태 드리프트| API
    API -->|인벤토리| OBS

    EXEC -.->|설정 배포| DEVICES
    OBS -.->|상태 모니터링| DEVICES

핵심 통찰: Nautobot은 Infoblox나 ServiceNow를 대체하지 않는다. 데이터를 집계하고, 충돌을 해결하며, 다운스트림 시스템 (실행, 옵저버빌리티, 프레젠테이션)이 소비하는 단일 API 역할을 한다. 이러한 관심사 분리는 각 시스템이 최고 수준을 유지할 수 있게 한다.

6가지 구성 요소가 함께 작동하는 방식#

모델링: 각 데이터 소스는 식별자를 통해 데이터 연결을 허용하는 일부 겹침이 있는 자체 데이터 모델을 가져온다. 책임이 분산되어, 각 데이터 소스가 다른 데이터를 전문으로 한다. 모든 정보가 통합될 때까지 부분 데이터를 허용해야 한다 (예: IP 할당 전에 Nautobot에 장비가 존재할 수 있음).

소비: Nautobot은 다른 장비가 모든 데이터 소스와 통합해야 하는 대신 중앙 포인트로서 데이터를 일관되게 쿼리할 수 있는 REST API와 GraphQL 인터페이스를 제공한다.

시행: Nautobot은 일관성을 위한 전역 유효성 검사를 강제한다. IPAM이 10.1.1.5가 device-dal-01에 할당됐다고 하지만 이 프리픽스가 장비가 속하지 않는 다른 지역을 위해 할당된 경우, 플래그를 세워야 한다. 또한 고아 데이터를 방지한다: 장비가 ServiceNow에 존재하지 않으면 Infoblox에서 IP를 할당할 수 없다 (참조 무결성). 게다가, 소프트 유효성 검사가 경고한다: “장비가 ServiceNow에서 30일 전에 마지막으로 업데이트됐다; 오래됐을 수 있다” (차단 없이), 데이터를 정리하는 기능과 함께.

버전 관리: 모든 변경이 변경 로그 레코드로 추적된다. 객체가 변경되고 IPAM이 IP를 자동 재할당할 때, Nautobot은 “IPAM 웹훅: IP 10.1.1.5가 2024-02-08T14:32:00Z에 device-dal-02의 인터페이스 eth1.1에 할당됨"을 기록하여 장비가 현재 IP를 갖게 된 이유를 이력을 통해 추적할 수 있다. 그러나 이전 시점으로 롤백하는 메커니즘이 없어 롤백 기능이 제한된다 (참고: Nautobot VCS 앱이 더 정교한 기능을 허용하지만 간결성을 위해 여기서는 다루지 않는다).

집계: 이것은 이 솔루션에서 여러 데이터 소스를 상호 연결해야 하므로 핵심 측면이다. Nautobot은 IP 데이터에 Infoblox를 우선시한다 (권위 있는 IPAM이므로). 자산 메타데이터 (보증, 비용 센터)의 경우, ServiceNow가 권위 있으며, Nautobot이 이를 사용해 불일치를 해결한다. 동기화 전략은 다음과 같을 수 있다:

  • ServiceNow → Nautobot: 4시간마다 주기적 동기화 (자산 메타데이터의 약간의 지연 허용)
  • Infoblox → Nautobot: IP 변경을 위한 실시간 웹훅 (IPAM 변경은 긴급, 폴링을 기다릴 수 없음)
  • 네트워크 장비 → Nautobot: Nautobot 온보딩 앱을 사용해 네트워크의 데이터가 Nautobot 데이터 모델에 온보딩됨 (최종 일관성 허용 가능) 게다가 일부 실패가 있는 경우, Nautobot은 다음과 같은 복원력 메커니즘을 제공할 수 있다:
  • Infoblox가 2시간 동안 다운되면, Nautobot은 “오래됨"으로 표시된 캐시된 IP 데이터를 사용해 계속 작동
  • 운영자가 경고 확인: “2시간 전 IP 데이터; IPAM 현재 사용 불가; 새 할당 연기됨”
  • Infoblox가 복구되면, 대기 중인 할당이 원자적으로 처리됨

설계 주도: Nautobot Design Builder 앱을 사용해, Nautobot은 새 VLAN 서비스 요청을 이행하기 위한 고수준 인터페이스를 제공한다. 운영자가 고수준 인텐트를 제공한다: { "vlan_name": "app-payments", "subnet_size": "/24", "location": "building-b", "vendors": ["arista", "cisco"] }. 그러면 설계 템플릿이 이것을 확장한다: Nautobot에 VLAN 객체 생성, building-b IP 범위에서 다음 가용 /24 프리픽스를 Infoblox에 요청해 자동으로 할당, 벤더별 설정 템플릿 자동 생성 (배포 스위치를 위한 Arista EOS 구문, 액세스 스위치를 위한 Cisco IOS-XE 구문), ServiceNow를 쿼리해 800개 캠퍼스 스위치 중 building-b에 물리적으로 위치한 것을 식별 - 결과적으로 실행기가 단일 플레이북을 실행하기 전에 필요한 모든 기술 객체가 생성된다.

4.3.3. 구현 흐름#

초기 데이터 로드

  1. Infoblox 가져오기: Nautobot이 Infoblox API에 연결 → 모든 IP 범위, 예약, DNS 레코드 가져오기
  2. ServiceNow 가져오기: Nautobot이 ServiceNow CMDB에 연결 → 모든 IT 자산, 위치, 관계 가져오기
  3. Slurpit을 통한 브라운필드 네트워크 검색: Slurpit.io가 기존 네트워크 장비에 연결해 현재 설정 상태를 추출:
    • 장비 인벤토리 (모델, 시리얼 번호, 소프트웨어 버전)
    • 인터페이스 설정과 운영 상태
    • IP 주소 지정과 VLAN 할당
    • 라우팅 프로토콜 설정
    • 장비 설정을 Nautobot 호환 데이터 모델로 변환
  4. 발산 감지와 해결: Nautobot 감사 프로세스가 세 소스 (Infoblox, ServiceNow, Slurpit)의 데이터를 상관시킨다:
    • 충돌 예시: 장비 인터페이스가 10.1.1.5/24를 보여주지만, Infoblox는 이 IP가 다른 장비에 할당됐다고 표시
    • 해결 워크플로: Nautobot이 인간 검토를 위해 47개 충돌에 플래그
      • 네트워크 엔지니어가 각각 평가: “장비 상태 신뢰” 또는 “IPAM 신뢰; 장비 수정 필요”
      • 거버넌스 규칙 적용: “액세스 포트는 장비 신뢰, 인프라 IP는 IPAM 신뢰”
    • 배치 해결: 유사한 충돌은 일관된 정책으로 해결
  5. 통합 스키마 채우기: Nautobot이 세 소스를 병합: 유효성 검사되고 충돌 해결된 데이터와 함께 devices[*].{ name, location_id, ipv4_address, serial_number, cost_center }

라이브 운영

  1. 새 VLAN 서비스 요청: 애플리케이션팀이 ServiceNow에 요청을 제출한다. Nautobot이 웹훅을 포착하고, VLAN과 프리픽스 객체를 생성하며, building-b 주소 범위에서 다음 가용 /24를 Infoblox에 쿼리하고, 자동으로 할당하며, 요청자, 승인자, 타임스탬프로 레코드를 찍는다. 실행 블록은 이제 대상 스위치 전체에 서비스를 배포하는 데 필요한 모든 데이터 포인트를 Nautobot에 쿼리할 수 있다.
  2. 새 캠퍼스 스위치 온보딩: 운영자가 ServiceNow에 자산 항목을 생성한다. Nautobot이 웹훅을 포착하고, 위치, 벤더, 역할 메타데이터와 함께 장비 객체를 생성하며, 사이트 관리 범위에서 관리 IP를 Infoblox에 쿼리하고, 장비 역할과 벤더를 기반으로 적절한 설계 템플릿을 할당한다. 스위치는 누구도 CLI를 건드리기 전에 SoT에 등록되고 향후 배포에 적합해진다.
  3. Infoblox 유지보수 윈도우: IPAM이 2시간 동안 오프라인으로 전환된다. Nautobot이 캐시된 데이터를 표시한다 “IP 데이터는 14:30 UTC 기준 유효; 갱신 대기 중”. 운영자는 여전히 장비 인벤토리와 VLAN 정의를 쿼리할 수 있지만, 새 IP 할당은 연기된다. Infoblox가 돌아오면, 대기 중인 할당이 큐에 들어가고 원자적으로 처리된다.

불일치 처리 및 주기적 드리프트 감지

초기 온보딩 후, Nautobot은 세 데이터 소스 모두에서 발산을 지속적으로 모니터링한다:

  1. 지속적인 동기화: 변경이 발생할 때 트리거되는 이벤트 기반 업데이트 외에도, 주기적 동기화가 4-6시간마다 실행된다:

    • Infoblox 동기화: IP 변경을 위한 웹훅 기반 + 주기적 조정
    • ServiceNow 동기화: 자산 메타데이터 업데이트를 위한 주기적 폴링
    • Slurpit 검색: 실제 네트워크 상태를 포착하기 위한 주기적 장비 폴링
  2. Nautobot 감사와 상관: Nautobot의 감사 프로세스가 모든 소스의 데이터를 비교해 불일치를 감지한다:

    • 데이터 소스 충돌: 장비 인터페이스 IP가 Infoblox 할당과 다름
    • Configuration Drift: 장비 상태가 Nautobot 인텐트와 다름 (NTP 서버 변경, VLAN이 트렁크에 추가됨)
    • 오래된 메타데이터: ServiceNow 자산이 90일 전에 마지막으로 업데이트됨 (잠재적 오래됨)
  3. 발산 분류와 수정:

    • 유형 1 - Configuration Drift: 장비가 Nautobot 인텐트와 다름 → 실행을 트리거해 장비 수정
      • 예시: 장비의 NTP 서버 변경됨 → 실행이 설정을 재생성하고 수정 사항 푸시
    • 유형 2 - 인텐트 오래됨: Nautobot에 아직 반영되지 않은 의도적인 변경 → 운영자에게 SoT 업데이트 경보
      • 예시: 운영자가 인시던트 중에 수동으로 VLAN 추가 → 현재 인텐트를 반영하도록 Nautobot 업데이트
    • 유형 3 - 외부 권한 불일치: 권위 있는 소스 간 충돌 (Infoblox 대 장비 현실)
      • 예시: IP 할당 불일치 → 거버넌스 규칙에 따라 인간 결정 필요
  4. 자동 대 수동 수정:

    • 자동 수정: 사전 승인된 변경 (NTP, DNS, syslog 서버)이 실행을 통해 자동으로 수정됨
    • 수동 승인: 중요 변경 (BGP 설정, 라우팅 프로토콜, 보안 정책)은 수정 전 인간 검토 필요
    • 에스컬레이션: 해결 불가능한 충돌 또는 반복적인 드리프트 패턴이 네트워크팀으로 에스컬레이션됨
  5. 감사 추적: 모든 감지된 발산, 해결, 수정 액션이 컴플라이언스와 문제 해결을 위해 기록됨

4.3.4. 접근 방식의 트레이드오프#

이 접근 방식의 장점#

장점설명이점
교체 없는 통합Infoblox와 ServiceNow가 권위 있는 소스로 유지Nautobot이 기존 투자를 대체하는 것이 아닌 조율
대부분의 유스케이스에서 다중 소스 진실5-30초 동기화 지연이 대부분의 작업에서 허용 가능장비 프로비저닝 (4시간 동기화), IP 할당 (30초 지연), 설정 생성 (야간) 모두 잘 작동
도메인 전문성 존중각 팀이 자신의 도메인을 소유Infoblox 팀: IP 전략; ServiceNow 팀: 자산 수명 주기; 네트워크팀: 설계/배포
풍부한 데이터 모델시스템 간 관계 모델링교차 도메인 쿼리 가능: “보증이 만료된 고보안 위치의 장비?”
운영 복원력중단 중에도 캐시된 데이터 사용 가능Infoblox 다운 → 캐시된 IP 데이터; ServiceNow 다운 → 마지막으로 알려진 메타데이터
감사와 컴플라이언스모든 변경이 전체 계보와 함께 추적규정 쿼리: “누가 10.1.1.5에서 10.1.2.5로 IP 변경을 승인했는가, 언제, 왜?”

제한 사항과 제약#

제한 사항영향완화 전략
동기화 지연5-30초 (웹훅)에서 4시간 (폴링) 지연중요한 할당의 경우, Nautobot을 우회하고 Infoblox를 직접 호출; 비동기적으로 동기화
충돌 복잡성겹치는 속성은 명시적인 해결 로직 필요권한 매트릭스를 사용해 충돌을 명시적으로 만들기 (예: ServiceNow가 MAC 주소 소유)
운영 오버헤드각 웹훅/API/동기화 작업이 잠재적 실패 지점통합 상태 모니터링 (웹훅 실패, 타임아웃, 지연); 장애 모드별 런북 유지
데이터 품질 의존성소스 시스템의 쓰레기 입력, 쓰레기 출력소프트 유효성 검사 (블록이 아닌 경고); 의심스러운 데이터에 대한 이상 탐지
오래된 데이터 윈도우중단 중에 운영자가 몇 시간 전의 캐시된 데이터로 작업허용 가능한 오래됨 윈도우 문서화; “지연 > 2시간이면 캐시 사용” 기준으로 운영자 교육
통합 유지보수API 버전 업그레이드에 Nautobot 업데이트 필요추상화 레이어 (통합 어댑터) 사용; 분기별 통합 테스트

유스케이스에 더 잘 맞는 다른 방법과 솔루션이 있다. 필요와 요구사항에 따라 직접 결정을 내려라. 항상 고려해야 할 트레이드오프가 있다.

4.4. 요약#

도입부 이야기의 고아가 된 방화벽 규칙은 설정 실수가 아니었다. 아무도 자신의 일을 하지 않은 것이 아니었다. 규칙이 남아 있었던 것은 VLAN을 서비스와 방화벽 정책에 연결하는 시스템이 없었기 때문이다. VLAN이 제거됐을 때, 그 연결이 존재하지 않았기 때문에 규칙이 정리될 트리거가 없었다. 진실의 원천은 그러한 연결을 명시적으로 만드는 시스템이다.

여섯 가지 기능이 그 시스템을 구축한다. 모델링은 네트워크가 어떻게 보여야 하는지와 어떤 추상화 수준에서 정의한다. 설계 주도는 비즈니스 요청 (“달라스 지사 추가”)을 실행기가 장비를 건드리기 전에 필요한 50개 이상의 기술 객체로 변환한다. 소비는 그 인텐트를 인간, 자동화 워크플로, 다른 시스템에 일관되게 사용 가능하게 한다. 시행은 SoT에 들어오는 데이터가 다운스트림에서 잘못된 네트워크 상태를 생성하기 전에 유효한지 확인한다. 버전 관리는 작성자, 이유, 타임스탬프와 함께 모든 변경을 기록하여 SoT를 감사 가능하고 복구 가능하게 만든다. 집계는 SoT를 이미 데이터의 일부를 소유하고 있는 권위 있는 시스템에 연결한다: 주소를 위한 IPAM, 자산을 위한 CMDB, 연결성을 위한 회선 제공업체.

캠퍼스 구현 예시는 여섯 가지가 함께 작동하는 것을 보여줬다: 연합 허브로서의 Nautobot, 각 도메인에 대한 권위 있는 소스로서의 Infoblox와 ServiceNow, 자동화된 배포에 필요한 모든 것으로 VLAN 서비스 요청을 변환하는 설계 템플릿. 결과는 단순히 네트워크 상태의 데이터베이스가 아니다. 다른 모든 빌딩 블록이 네트워크가 어떻게 되어야 하는지 알기 위해 참고하는 단일 레퍼런스다.

5장은 그 인텐트를 실제 행동으로 전환한다: 실행 블록이 SoT에서 읽고 네트워크에 변경을 푸시하며, SoT의 버전 관리 기능이 가능하게 하는 일관성 보장과 롤백 동작을 수행한다.

참고 자료#

데이터 모델링과 스키마 표준

API와 데이터 소비

데이터 품질과 유효성 검사

  • 데이터 품질 기초 (DAMA DMBOK): 엔터프라이즈 데이터 품질 프레임워크
  • JSON Schema: 선언적 스키마 유효성 검사 표준
  • YANG 제약 (RFC 6020, 섹션 8.2.4): 네트워크 특화 유효성 검사 패턴

버전 관리, 감사, 변경 관리

데이터 통합과 집계

  • 엔터프라이즈 통합 패턴 (Gregor Hohpe & Bobby Woolf): 데이터 통합 아키텍처 패턴
  • 마스터 데이터 관리 (David Loshin): 연합 거버넌스 프레임워크

네트워크 프로그래머빌리티와 자동화

분산 시스템과 확장성

💬 Found something to improve? Send feedback for this chapter