Private deployment · Case study only

Operations product system

Issue
Management
System

이슈를 저장하고 찾는 도구를 넘어, 현재 상태를 이해하고 일정 위험을 발견하며 권한에 맞게 다음 행동을 결정하고 실패에서 복구하는 하나의 운영 시스템으로 확장했습니다.

RoleProduct design · Full-stack implementation · Operations
FocusVisibility · Scheduling · Governance · Reliability
AvailabilityPrivate system — no public demo

정보는 있었지만
판단할 구조가 부족했습니다.

업무 상태, 담당자, 일정, 활동 이력이 서로 다른 관점에 흩어지면 같은 데이터를 보고도 팀마다 다른 현재를 이해하게 됩니다.

목표는 새 화면을 하나 더 만드는 것이 아니라, 조회·분석·변경·알림이 같은 업무 문맥을 공유하도록 연결하는 것이었습니다.

하나의 업무 흐름,
네 개의 제품 층

Observe

현재와 변화를 함께 파악

개인 대시보드, 저장 관점, 활동 이력과 이전 기간 비교를 통해 현재값이 만들어진 문맥까지 읽게 했습니다.

Understand

일정의 영향을 해석

계층, 의존성, 지연과 충돌을 상세 패널과 시간축에 함께 보여줘 날짜가 어떤 위험으로 이어지는지 설명했습니다.

Act

권한 안에서 안전하게 변경

역할 정책, 승인 흐름, 기능 공개 단계를 분리하고 화면과 서버가 같은 권한 기준을 반복 확인하게 했습니다.

Recover

자동화와 AI도 되돌아갈 수 있게

반복 작업은 자동화하되 결과를 검증하고, 실패하면 원본 데이터와 기존 업무 흐름을 유지하도록 설계했습니다.

업무 이벤트가
판단 신호가 되기까지

외부 이슈 서비스의 이벤트와 전체 스냅샷을 같은 정규화 계층으로 통과시킨 뒤, 현재 상태·변경 이력·관계를 분리해 저장합니다. 화면과 자동화는 원본 응답이 아니라 이 검증된 읽기 모델을 사용합니다.

합성 흐름외부 입력 → 검증 경계 → 데이터 계층 → 제품 기능
01 · ingest이벤트 / 전체 스냅샷웹훅은 변화 1건을, 동기화 작업은 페이지 단위 데이터를 전달합니다.
02 · guardverifyAndDedupe()출처, 형식, 중복 이벤트와 처리 범위를 서버에서 확인합니다.
03 · transformnormalizeRecord()서로 다른 응답을 검색·일정·이력에서 공유할 공통 형태로 바꿉니다.
04 · persist현재값 · 이력 · 관계최신 조회와 시간 변화, 선행·종속 연결을 서로 다른 책임으로 보존합니다.
05 · derivecomputeSignals()필터, 일정 위험, 활동량과 근거 묶음을 요청 시점에 계산합니다.
06 · serve화면 · 알림 · 내보내기세션 권한을 다시 확인한 결과만 사용자 행동으로 연결합니다.

Example 01 · Search

합성 이슈 A를 찾는 경우

  1. 사용자가 상태·담당 범위·기간 조건을 조합합니다.
  2. 서버가 허용된 프로젝트 범위와 조건을 함께 적용합니다.
  3. 현재값 저장소에서 후보를 찾고 관계·이력 요약을 결합합니다.
  4. 같은 조건을 저장 관점이나 공유 가능한 필터 상태로 재사용합니다.

Example 02 · Schedule

선행 작업의 마감일이 바뀐 경우

  1. 변경 이벤트를 현재값과 변경 이력에 함께 반영합니다.
  2. 관계 저장소에서 영향을 받는 후속 작업을 탐색합니다.
  3. 지연·마감 미지정·최근 날짜 변경을 결정 규칙으로 계산합니다.
  4. 간트와 위험 목록에 근거가 되는 관계와 날짜를 함께 표시합니다.

Example 03 · Automation

이벤트가 자동화 조건과 맞는 경우

  1. 중복 이벤트는 제거하고 단건 최신 상태를 다시 확인합니다.
  2. 기본 데이터 반영과 부가 알림을 분리해 처리합니다.
  3. 알림 규칙과 사용자 역할을 만족할 때만 다음 동작을 만듭니다.
  4. 부가 처리 실패는 기록하되 기본 조회 상태는 유지합니다.

Example 04 · AI assist

일정 브리프를 요청한 경우

  1. 서버가 허용 범위의 위험 이슈와 통계만 근거 묶음으로 구성합니다.
  2. AI에는 원본 DB 접근 대신 제한된 근거 묶음을 전달합니다.
  3. 응답 구조와 근거 참조를 검증한 결과만 화면에 표시합니다.
  4. 요약은 제안으로 남고 변경·공유·내보내기는 사용자가 결정합니다.

같은 데이터를
두 가지 판단 화면으로

데이터베이스와 간트는 별도 도구가 아닙니다. 같은 권한 범위와 최신 스냅샷을 사용하되, 하나는 찾기와 비교에, 다른 하나는 날짜·계층·의존성 해석에 맞게 읽기 모델을 바꿉니다. 화면을 오가거나 브라우저 기록을 이동해도 사용자의 판단 문맥을 복원합니다.

Database view검색 가능한 현재 상태
실제 데이터 식별 정보를 합성값과 불투명 마스크로 대체한 데이터베이스 화면 예시
비식별 예시 화면실제 제품 구조를 기준으로 프로젝트명·이슈·담당자·날짜·URL을 합성값 또는 불투명 마스크로 대체했습니다.

View 01 · Database

필터를 결과가 아니라
반복 가능한 업무 관점으로 저장합니다.

상태·담당 범위·저자·마일스톤·라벨·기간을 조합해 현재 이슈를 찾고, 표시 열과 다중 정렬까지 개인 관점으로 보존합니다. 부모·자식과 선행 관계, 작업 순서는 같은 목록에서 이어서 점검합니다.

  • 다중 조건 조회프로젝트 권한 범위를 먼저 고정한 뒤 필터·검색·페이지 조건을 서버에서 적용합니다.
  • 저장 관점과 공유이름을 붙인 관점, 빠른 호출 슬롯, URL 상태로 같은 판단 기준을 다시 엽니다.
  • 관계와 작업 순서현재값에 계층·의존 관계를 결합하되 원본 레코드와 사용자 정렬 설정의 책임은 분리합니다.
  • 안전한 내보내기브라우저가 선택한 대상을 서버가 권한 범위 안에서 다시 조회해 결과를 만듭니다.
필터 상태→세션·범위 검증→현재 스냅샷 조회→관계·이력 결합→표·저장 관점
합성 예시

“진행 중이며 이번 기간에 마감되는 담당 범위”를 열면, 서버가 허용 프로젝트를 고정하고 현재값을 조회한 뒤 관계와 최근 변경 요약을 붙입니다. 사용자는 이 조건을 개인 관점으로 저장하거나 링크로 공유할 수 있습니다.

Gantt view관계가 보이는 시간축
실제 데이터 식별 정보를 합성값과 불투명 마스크로 대체한 간트 차트 화면 예시
비식별 예시 화면실제 제품 구조를 기준으로 식별값은 대체하고, 계층·상태 색·의존선·시간축의 작동 관계만 보존했습니다.

View 02 · Gantt

날짜를 나열하지 않고
변경의 영향을 계산합니다.

데이터베이스에서 좁힌 이슈를 일간·주간·월간 시간축에 놓고 부모·자식 순서와 선행·종속 연결을 함께 그립니다. 마감 지연, 마일스톤 초과, 작업 대기 같은 상태는 같은 우선순위 규칙으로 목록과 막대에 표시합니다.

  • 계층과 의존성부모 아래 자식을 같은 순서로 맞추고 선행 작업의 종료점에서 후속 작업까지 연결합니다.
  • 일정 위험 신호Finish-to-Start 충돌, 마감 지연, 마감 미지정을 날짜와 관계의 조합으로 판정합니다.
  • 직접 일정 조정일간 막대를 이동·리사이즈하면 화면에 즉시 반영하고, 서버 저장은 짧은 배치로 묶습니다.
  • 실패 경계권한·인증 실패는 반복하지 않고, 네트워크 같은 일시 오류만 제한적으로 재시도합니다.
필터 결과→날짜·관계 정규화→타임라인 계산→화면 즉시 반영→배치 저장·재시도
합성 예시

후속 작업의 시작일이 선행 작업의 종료일보다 빠르면 연결선과 막대를 위험 상태로 표시합니다. 사용자가 날짜를 옮기면 개인 화면은 즉시 갱신되고, 권한이 확인된 변경만 저장 큐를 거쳐 외부 이슈 서비스에 반영됩니다.

저장 책임을 나누고
API 경계를 좁혔습니다.

Current

현재 상태 저장소

검색과 대시보드가 읽는 최신 스냅샷입니다. 전체 갱신은 별도 대기 데이터셋을 완성한 뒤 교체해 갱신 중에도 직전 데이터를 읽을 수 있게 합니다.

History

변경 이력 저장소

담당자·상태·마감일처럼 시간에 따른 변화만 축적합니다. 활동 분석과 날짜 변화의 근거가 되며 현재값을 복제하는 용도로 쓰지 않습니다.

Graph

관계 저장소

부모·자식·선행·종속 연결을 별도 관리합니다. 일정 계산은 이 연결을 따라가되 순환과 누락을 방어하는 검증을 먼저 거칩니다.

Control

운영 제어 저장소

세션, 역할 권한, 저장 관점과 기능 공개 상태를 업무 데이터와 분리해 관리합니다. 화면에서 숨긴 것만으로 권한이 부여되지는 않습니다.

외부 조회 API

페이지 단위 전체·부분 동기화, 메타데이터와 활동 조회에 사용합니다. 요청 범위와 재시도를 제한하고, 호출 한도에서는 간격을 늘려 회복합니다.

paged fetch · bounded retry · normalization
이벤트 수신

변경을 빠르게 반영하되 서명·중복·대상 범위를 확인합니다. 기본 서비스가 전환되는 동안에도 이벤트를 보존해 유실을 줄입니다.

verify · dedupe · durable handoff
내부 제품 API

브라우저가 보낸 식별자를 신뢰하지 않고 세션·역할·프로젝트 허용 범위를 요청마다 다시 검사합니다.

session · capability · scope
내보내기 연동

브라우저는 선택 대상만 전달하고, 서버가 권한 범위 안에서 다시 조회한 데이터로 결과를 만듭니다. 외부 인증 정보와 업무 데이터는 분리합니다.

descriptor · re-query · short-lived handoff

구현 이후의 실패까지
제품 범위로 다뤘습니다.

기능이 정상일 때의 경로만 설계하면 운영 시스템은 오래 버티지 못합니다. 최근 개선은 사용자의 탐색 상태, 외부 서비스의 호출 한도, 프로세스 장애와 AI 응답 실패를 각각 다른 경계에서 작게 멈추고 복구하는 데 집중했습니다.

Interface

상태를 잃지 않는 탐색

직접 주소, 뒤로·앞으로 이동과 짧은 화면 복귀에서 선택한 맥락을 되살립니다. 복원할 권한이 없으면 안전한 화면으로 안내합니다.

Access

기능마다 다시 확인하는 권한

역할, 기능 공개 상태와 사용자 범위를 서버 요청마다 확인합니다. 설정 일부가 없어도 기본 가입과 탐색은 유지합니다.

Sync

호출 한도를 견디는 동기화

선택값과 데이터 변화가 있을 때만 묶어서 갱신합니다. 일시 오류는 제한적으로 재시도하고 행별 실패를 성공 결과와 분리합니다.

Runtime

준비된 버전만 공개

역할별 실행을 나눠 독립적으로 회복하고, 새 웹 버전은 준비 상태를 확인한 뒤 전환합니다. 문제가 생기면 직전 버전으로 돌아갑니다.

AI guard

결정 대신 검증 가능한 제안

키워드와 의미 검색을 단계적으로 사용하고 모델에는 제한된 근거만 전달합니다. 시간 초과나 형식 오류에는 기존 결과를 보존합니다.

Environment

운영과 검증의 물리적 경계

실행 이름, 포트, 데이터와 로그 위치를 분리해 같은 코드의 두 환경이 서로의 상태를 덮어쓰지 않게 했습니다.

만들어진 변화

공통 문맥

조회 화면과 알림, 분석 결과가 같은 상태 기준을 공유해 다시 설명해야 하는 간극을 줄였습니다.

더 이른 위험 발견

마감일을 넘긴 뒤가 아니라 의존성과 변화 흐름에서 일정 위험을 먼저 확인할 수 있게 했습니다.

통제 가능한 자동화

반복 작업을 줄이면서 승인, 실행, 공유의 최종 결정권은 사용자에게 유지했습니다.

이어지는 사용자 문맥

화면 이동과 복귀 뒤에도 선택과 데이터 상태를 보존해 반복 탐색과 불필요한 재요청을 줄였습니다.

작게 실패하는 운영

새 기능이 실패해도 기본 업무가 유지되도록 검증, 격리, 대체 경로와 되돌리기를 제품의 일부로 설계했습니다.