pubuilder 06. 퍼블리시 로그 요약과 페이지 상태 배지
퍼블리싱 파이프라인 자체는 돌아가고 있었다. 이날은 기능을 더 얹는 대신 사용자가 실행 상태를 이해하는 방식을 다듬었다. 패널 안의 로그를 짧게 추려 보여주고, IA 캔버스의 페이지 노드에 퍼블리싱 상태 배지를 달았다.
에이전트 원본 로그, 비개발자에겐 소음이었다
퍼블리시 패널은 에이전트의 도구 호출과 중간 로그를 모두 그대로 누적해 보여주고 있었다. 개발자는 읽을 수 있어도, 비개발자에게는 길고 기술적인 문자열 나열이라 지금 뭐가 진행 중인지 파악하기 어려웠다.
그래서 로그를 기본적으로 짧게 추려 보여주기로 했다. 원본 에이전트 이벤트 대신 사람이 읽기 쉬운 작업 라벨을 보여주고, 연속된 동일 도구 이벤트는 한 줄과 실행 횟수로 묶었다. 반복되는 log 이벤트는 가장 최근 상태만 따로 표시했다.
이렇게 줄이면서 걸린 건 디버깅 정보였다. 요약본만 남기면 원본 이벤트를 확인할 길이 없어진다. 그래서 "자세히" 토글로 원본 로그 전체를 즉시 전환해 볼 수 있게 뒀다. 기본 화면에는 현재 상황과 주요 단계만 보이고, 원본은 필요할 때 열어보는 구조다. 진행 로그는 정보량보다 계층이 중요했다.
패널을 닫으면 퍼블리싱 중인지 알 길이 없었다
퍼블리싱 상태는 선택한 블록의 작업 패널 안에만 표시되고 있었다. 패널을 닫거나 다른 페이지를 보고 있으면 지금 뭔가 실행 중인지 알 수 없었다.
그래서 IA 캔버스의 페이지 노드에 상태를 올렸다. 해당 페이지의 블록 중 하나라도 퍼블리싱 중이면 노드에 "퍼블리싱 중" 배지와 pulse dot(깜빡이는 점 표시)을 보여준다.
이때 상태를 새로 저장하지 않고 전역 publishJobs에서 파생시켰다. 파생 상태는 별도로 저장하지 않고 기존 상태에서 계산해 얻는 값이다. 상태를 하나 더 두면 동기화 지점과 오류 가능성이 같이 늘어난다. 기존 잡 상태에서 계산하면 그럴 일이 없다. publishJobs의 블록 키를 페이지 경로 접두사로 검사하는 isPagePublishing 함수와 전용 구독 훅을 추가했다.
selector는 페이지별 boolean 하나만 돌려주게 했다
컴포넌트가 전체 publishJobs 객체를 직접 구독하면 다른 페이지의 잡이 바뀔 때도 리렌더될 수 있었다. 그래서 전용 selector(Zustand의 selector는 스토어에서 필요한 값만 골라 구독하는 함수다)가 페이지별 boolean만 반환하도록 분리했다. selector가 원시 값(primitive)을 돌려주면 그 값이 실제로 바뀔 때만 리렌더가 일어난다. 전역 상태를 쓰면서도 관련 없는 변경의 리렌더를 피할 수 있었다.
실행 중·완료·오류 상태, 그리고 같은 페이지에 블록 여러 개가 걸린 조합은 단위 테스트로 검증했다.
패널 안에서는 로그를 짧게 추리고, 캔버스에서는 페이지 단위 상태를 한눈에 보이게 하면서 동시 퍼블리싱의 가시성이 좋아졌다. 요약된 화면과 상세 정보 접근성을 같이 챙겨서 초보 사용자와 디버깅하는 사용자 모두의 흐름을 지켰다.
남은 것도 있다. 로그를 추려 보여주는 변환과 연속 이벤트 집계 로직은 아직 단위 테스트가 없고, 여러 페이지를 동시에 퍼블리싱할 때 배지의 시인성과 성능도 확인이 필요하다. 완료·오류 상태를 페이지 노드에서 짧게 보여줄지, 요약된 로그의 라벨이 실제 사용자에게 충분히 이해되는지도 지켜볼 문제다.