오프온 · 전사 업무 관리 시스템

기간  — 현재

루쿠쿠의 사내 제품으로, 설계부터 구현과 운영까지 맡았습니다.

근태부터 CRM까지 슬랙 안에서 다루고,
AI 에이전트의 MCP 창구도 맡는 시스템

Next.js 16React 19TypeScriptPrismaPostgreSQLVercelMCPOAuth 2.1

  • 슬랙 명령으로 출퇴근⁠·⁠휴식 기록, 정정 요청과 승인
  • 자정을 넘긴 근무, 휴일 제외, 연차 부여와 이월 자동 계산
  • 표⁠·⁠칸반⁠·⁠캘린더⁠·⁠간트로 보는 업무와 담당자별 상태
  • 넘긴 업무의 다음 확인일에 담당자에게 묻는 알림
  • 회의실 예약과 회의 10분 전 알림
  • 슬랙 대화 약 39만 줄을 근거로 찾는 에이전트용 검색

다시 옮겨 적던 요청

문제
슬랙과 메일로 온 요청을 PM과 개발자가 업무 도구에 다시 옮겨 적었습니다. 확인이 필요한 요청은 대부분 메일이었고, 절반은 알림 메일이었습니다.
해결
요청을 원문⁠·⁠첨부와 함께 업무로 바꾸거나 기존 업무에 잇는 수신함을 만들었습니다. 같은 스레드는 이미 만든 업무에 붙고, 자동 발신 메일은 빠집니다. 규칙을 처음 적용했을 때 대기 메일 59건이 사람 손 없이 정리됐습니다. 사람이 다른 스레드에서 두 번 이상 버린 주소는 다음부터 걸러집니다.

에이전트에게 권한을 어디까지 줄 것인가

문제
에이전트마다 DB와 슬랙 권한을 따로 주면 관리가 흩어집니다. 요청자를 헤더 값으로 받으면 위조할 수도 있었습니다.
해결
오프온이 OAuth 2.1 인가 서버를 겸하고, 신원은 토큰 안에서만 받습니다. 로그인은 기존 슬랙 로그인을 쓰고, 쓰기는 요청한 사람의 권한 안에서만 됩니다. 직원은 설치나 API 키 없이 로그인 한 번으로 도구 21개를 씁니다.

동시에 들어온 연차 요청

문제
에이전트가 슬랙에서 연차를 대신 처리하면서 같은 요청이 겹칠 수 있었습니다. 같은 휴가를 동시에 두 번 취소하면 둘 다 성공해 연차 사용량이 1에서 −1이 됐습니다.
해결
연차가 하루 남았을 때 같은 날 신청 두 건이 모두 통과하는 것도 재현했습니다. 겹친 요청은 하나만 처리하고 나머지는 충돌로 거절하게 고쳤습니다. 실제 PostgreSQL에 붙여 API 경로를 지나는 검사 9건을 더했습니다. 같은 재현에서 두 번째 요청은 409로 거절됐습니다.

화면에서 찾을 수 없던 기능

문제
업무 배정 규칙을 서버에만 넣어, 사용자는 화면에서 기능을 찾지 못하고 오류만 봤습니다.
해결
규칙을 화면에도 반영했습니다. 찾을 수 없는 기능은 없는 기능으로 본다는 원칙을 남겼습니다. 제보받은 날 고쳤습니다.