완료 일시: 2026-05-03 요약: Jenkins 스타일 노드 중앙 관리 구조 리팩토링 — plan×2, loop×2 루프 이력: | plan | code_review | 판정 | |------|-------------|------| | plan_0.log | code_review_0.log | FAIL | | plan_1.log | code_review_1.log | PASS | 최종 리뷰 요약: - proto/iop/runtime.proto에 RegisterRequest, RegisterResponse, NodeConfigPayload, AdapterConfig, NodeRuntimeConfig 추가 - packages/config: NodeConfig를 transport+logging+metrics로 단순화, EdgeConfig에 Nodes []NodeDefinition 추가, TransportConf에 Token 추가 - configs/node.yaml: edge_addr+token+logging+metrics만 남김 / configs/edge.yaml: nodes 섹션 추가 - apps/edge/internal/node/store.go 신규: NodeStore(token/ID 기반 조회), LoadFromConfig(token·alias 중복 검사) - apps/edge/internal/node/registry.go: NodeEntry에서 Adapters 제거, Alias 추가 - apps/edge/internal/transport/server.go: CapabilityRequest 핸드셰이크 → RegisterRequest/Response 핸드셰이크, buildConfigPayload(오류 반환형), stringsToAny, 중복 접속 차단 - apps/edge/internal/bootstrap/module.go: NodeStore provider 추가, OnStart에서 config 기반 시드 - apps/node/internal/transport/session.go: Handler에서 OnCapabilityRequest 제거, SetHandler(mutex) 추가 - apps/node/internal/transport/parser.go: CapabilityRequest 제거, RegisterResponse 추가 - apps/node/internal/transport/client.go: DialEdge → RegisterResult 반환형으로 전면 재작성 - apps/node/internal/node/node.go: New()에서 *config.NodeConfig → nodeID string, OnCapabilityRequest 삭제 - apps/node/internal/adapters/factory.go 신규: BuildFromPayload(proto payload → Registry 동적 초기화) - apps/node/internal/bootstrap/module.go: OnStart 내부 순차 초기화(dial→config수신→adapter빌드→node생성→handler설정), storeDSN, OnStop에서 store.Close() - 테스트: edge/node integration test 갱신, factory_test, store_test, server_test(CLIArgsRoundtrip) 신규 잔여 Nit: 없음