진입점을 분리
REST·GraphQL·Queue·Cron을 같은 애플리케이션 계층에 연결했습니다.
출퇴근 기록에서 시작해 업무·프로젝트·휴가·계약·조직 관리까지 확장한 조직용 제품입니다. 사용자에게는 자연스러운 시간 편집을, 서버에는 일관성 있고 다시 설명할 수 있는 근무·휴가 기록을 남기도록 설계했습니다.
초기의 목표는 출퇴근 세션을 기록하는 것이었지만, 제품은 업무와 프로젝트, 휴가, 계약, 조직·멤버 관리를 함께 다루는 방향으로 커졌습니다. 프론트엔드와 백엔드의 초기 구성부터 사용자·관리자 기능, 테스트, 오류 추적, 배포 파이프라인까지 함께 개선했습니다.
REST·GraphQL·Queue·Cron을 같은 애플리케이션 계층에 연결했습니다.
Session은 발생 사실, WorkReport는 기간별 의미와 산정 결과를 담도록 경계를 세웠습니다.
Prisma·Redis·BullMQ·SES·Web Push를 도메인 규칙 밖으로 밀어냈습니다.
Storybook·Vitest Browser·Playwright·MSW와 Sentry로 상태와 오류를 확인했습니다.
세션 시간을 편집하면 새 범위가 주변 세션의 일부 또는 전부와 겹칠 수 있습니다. 중복을 단순 오류로 막지 않고, 새 시간을 기준으로 주변 세션을 삭제·축소·분할하는 규칙을 만들었습니다.
프론트는 메모리 버퍼에서 결과를 즉시 시뮬레이션하고, 백엔드는 같은 규칙으로 최종 일관성을 다시 보장했습니다. 규칙 중복의 비용을 감수하고 즉각적인 편집 경험과 서버의 독립적 검증을 모두 확보했습니다.
여러 행을 즉시 수정하지 않고, 메모리에서 목표 상태를 만든 뒤 하나의 저장 경계로 반영한다.
월차·연차를 과거 세션에서 매번 다시 계산하면, 이후 기록이 수정됐을 때 같은 산정의 결과도 달라집니다. 산정 시점의 계약 근로시간, 실제 근로, 휴가, 초과근로, 이월 시간과 발생량을 JSON Snapshot으로 고정했습니다.
과거 세션이 바뀌어도 당시 산정 결과를 그대로 읽음
전월 보고서의 이월 시간을 다음 달 계산의 시작점으로 사용
재산정은 기존 결과를 조용히 덮지 않는 명시적 작업
과거 세션이 수정돼도 확정된 Snapshot에는 당시 산정 결과가 남습니다. 원본 수정 내용을 반영하려면 재산정을 별도로 수행해야 합니다.
Session은 언제 어떤 근무 상태가 시작되고 끝났는지를 기록합니다. WorkReport는 특정 기간의 Session에 계약·휴가·정책을 적용해 업무상 의미를 계산합니다. 확정된 결과는 Snapshot으로 남깁니다.
사용자가 다루는 시간, 조직이 계산하는 의미, 확정된 결과의 근거를 서로 다른 생애주기로 설계한 프로젝트입니다.
포트폴리오로 돌아가기