피부과 관리자·운영 시스템
피부과 관리자에 세분화 권한, 상담 DB 콜 통계, 인사·자산·재고·매출 관리 기능을 만든 작업
- 권한을 메뉴별 보기·쓰기·삭제로 나누고, 재택근무자와 상담원의 조회 범위를 서버에서 제한했습니다.
- 다른 개발자가 만든 상담 DB 위에 콜 차수, 콜 통계, 일일 업무 보고, 목표 화면을 더했습니다.
- 인사·자산·비용·재고·매출·계정 정보 관리를 새 모듈로 만들고, 민감정보는 암호화와 열람 기록으로 다뤘습니다.
문제
관리자 권한은 메뉴를 켜고 끄는 수준이었다. 같은 메뉴 안에서 보기, 쓰기, 삭제를 나눌 수 없었다. 재택근무자와 상담원에게 보여 줄 상담 DB 범위도 계정별로 나눠야 했다.
상담 DB(iCRM)는 다른 개발자가 만든 목록 중심 모듈이었다. 콜 차수 기록, 콜 단위 통계, 일일 업무 보고, 목표 관리 화면은 없었다.
인사, 장비, 비용, 재고, 매출, 계정 정보, 체험단을 다루는 메뉴는 관리자에 없었다.
통계 화면마다 '예약'을 판정하는 방식이 달랐다. 한 화면은 상태 키워드를 보고, 다른 화면은 예약 필드를 봤다. 서버가 UTC로 돌아 한국시간 새벽에 들어온 건은 날짜가 전날로 찍혔다.
해결
권한. 권한을 메뉴마다 보기·쓰기·삭제로 나눴다. 공용 권한 헬퍼를 만들어 게시판, 팝업, 쿠폰, 상담 DB, 상품, 상담신청, 직원 스케줄 화면의 버튼을 권한에 따라 숨겼다. 계정의 로그인과 비밀번호·권한·IP 변경은 감사 로그에 남는다.
조회 범위 제한. 재택근무 권한 계정은 상담 DB를 당일과 전일만 조회한다. 서버가 조회 시작일을 잘라내므로 화면을 거치지 않아도 적용된다. 상담원 권한 계정은 자기에게 배정된 DB만 목록·상세·통계에서 본다. 상태, 상담 내용, 리콜, 예약 필드만 고칠 수 있고 삭제·등록·엑셀 업로드는 403으로 막았다. 배정 관리자는 여러 건을 골라 상담원에게 배정하거나 회수하며, 그 기록은 배정 로그에 남는다.
상담 DB 확장. 기존 모듈에 콜 차수(최대 7차)별 일자·담당자·상태, 재콜일, 처리상태를 더했다. 국내 콜 통계는 리콜일자 기준으로 차수마다 한 콜씩 센다. 콜 업무 보고는 아웃콜·인콜, 유입경로 대분류, 상태 대분류로 일일 보고를 만들고 복사할 수 있게 했다. 담당자 일 목표 캘린더, 팀 월 목표, 예약 대시보드, 글로벌 예약 현황, 제휴 수량 관리 화면을 만들었다. 항목에 대분류·소분류를 두어 보고와 통계를 묶는 기준으로 썼다. 통계 표는 화면에 보이는 그대로 엑셀로 내려받는다.
판정 규칙 통일. 예약·내원·노쇼·취소 판정을 파일 하나로 모았다. 상담 DB 통계, 국내 콜 통계, 예약 대시보드, 콜 업무 보고, 목표 화면이 같은 규칙을 쓴다. 두 통계 화면에는 유입일 기준인지 리콜일자 기준인지 배너로 밝혔다. 서버 날짜 계산은 공용 KST 유틸로 바꿨다.
운영 모듈. 관리자에 '운영 관리'와 '인력 관리' 구역을 새로 만들었다.
- 인력 관리: 직원 스케줄(연차, 지각 차감, 분 단위 오버타임, 퇴사 처리)과 인사 정보. 주소, 이메일, 비상연락처, 계좌, 연봉은 AES-256-GCM으로 암호화해 저장하고 목록에는 값의 유무만 내려준다. 열람하려면 확인자 이름을 입력해야 하며, 조회·수정·열람은 모두 접근 로그에 남는다.
- 자산·비용: 장비 대장, A/S 이력, 리스 잔여금액 자동 계산, 업체 결제, 마케팅·매체 광고비, 광고비 ROI 탭. 권한은 메뉴별로 나눴다.
- 재고: 간호·피부·화장품 재고, 당일 입력, 엑셀 양식을 따른 일자별 히스토리, 안전재고 미달 품목 발주 관리.
- 매출: 매출 대장, 매출 통계, 월 목표 캘린더.
- 계정 정보: 비밀번호를 AES-256-GCM으로 암호화해 저장하고, 변경한 지 180일이 지난 항목을 경고한다.
- 고객·체험단: 리뷰·초상권 현황과 월 목표, 체험단 진행 관리(엑셀 업로드).
로그 화면은 서버 사이드 페이지네이션으로 바꿨다.
사용자 사이트. 다른 개발자가 만든 카카오·네이버 로그인에서 카카오 사용자 정보 API를 직접 호출하도록 보완했다. 호출이 실패하면 기존 프로필 값을 쓴다. 페이지별 JSON-LD와 GEO 메타데이터를 넣었다. 대만 중국어, 태국어, 인도네시아어, 베트남어를 추가했다. 방문 기록과 상담 신청을 방문자 ID로 이어 UTM별 전환율을 보는 분석 화면을 만들었다.
| 정한 것 | 대신 버린 것 | 이유 |
|---|---|---|
| 권한 모델메뉴마다 보기·쓰기·삭제를 '메뉴키:action' 문자열로 저장하고, 접미사 없는 기존 값은 전체 권한으로 인식 | 메뉴 단위 on/off | 계정별로 보기·쓰기·삭제를 나눠 달라는 요구가 있었다. 기존 형식도 그대로 읽게 해 하위호환을 유지했다. |
| 재택근무자 조회 범위서버가 조회 시작일을 전일로 잘라냄 | 화면에서만 날짜 범위를 제한 | 화면이 과거 날짜를 보내도 서버에서 잘라내므로 우회할 수 없다. |
| 예약·내원 판정판정 규칙 파일 하나를 모든 통계 화면이 공유 | 화면마다 상태 키워드 매칭이나 예약 필드 체크로 따로 판정 | 같은 '예약'이 화면마다 다르게 판정됐고, 상태 키워드로 취소를 세는 방식은 과대집계를 냈다. |
| 예약 대시보드 예약률기간 안에 콜을 시도한 DB 대비 예약 비율 | 기간 안에 인입된 DB 대비 예약 비율 | 그날 콜을 돌린 만큼 예약이 잡혔는지 보는 운영 방식을 반영했다. |
| 인사 정보 중 연락처·생년월일마스킹 표시와 열람 로그 | 다른 민감 필드처럼 암호화 저장 | 직원 스케줄 관리와 함께 쓰는 직원 테이블의 필드다. |
| 서버 날짜 계산공용 KST 유틸로 날짜를 계산 | 서버 기본 시간대(UTC) 기준 날짜 | 한국시간 자정~오전 9시 유입 건이 전날로 기록되고, 재택 제한의 '전일' 기준도 어긋났다. |
결과
- 11
- 새로 만든 NestJS 모듈
- 65
- 상담 DB(iCRM) 관련 커밋
- 200
- 관리자·백엔드 커밋 (보안 작업 제외)
- 2026년 1월부터 8월까지 NestJS 모듈 11개를 새로 만들었다. 모두 현재 코드에 등록되어 있다.
- 상담 DB 통계, 국내 콜 통계, 예약 대시보드, 콜 업무 보고, 목표 화면이 같은 예약·내원 판정 규칙을 쓴다.
- 재택근무자와 상담원의 조회 범위는 화면이 아니라 서버에서 제한된다.
- 퇴사 뒤인 2026년 9월부터는 다른 개발자가 자산·비용과 체험단 화면을 이어서 고쳤다. 그 부분은 이 페이지에 넣지 않았다.
- 같은 서비스의 보안 점검과 배포 정비는 별도 페이지(운영 중인 병원 서비스 보안·장애 대응)에 정리했다.
계약상 병원 실명, 도메인, 화면 캡처는 공개하지 않는다.
이 프로젝트가 궁금하시면 편하게 물어보세요.
연락하기