임포트, 승인, 갱신, 감사 추적과 안전한 사용자 접근을 포함해 공급업체 가격표와 계약을 관리하는 웹앱을 단계별로 설계·구축하는 계획서입니다.

대부분의 공급업체 가격 및 계약 혼란은 비슷합니다: 가격표는 이메일로 온 스프레드시트에 잠들어 있고, "final_FINAL" PDF는 공유 드라이브에 놓여 있으며, 어떤 조건이 최신인지 아무도 확신하지 못합니다. 결과는 예측 가능합니다—오래된 가격으로 주문이 생성되고, 공급업체와 불필요한 분쟁이 발생하며, 갱신이 놓쳐집니다.
좋은 웹앱은 공급업체 가격표와 계약의 진실 소스를 중앙화하고 변경사항을 끝까지 추적 가능하게 만들어야 합니다. 이를 통해 다음을 줄여야 합니다:
가격과 조건을 매주 다루는 사람들을 중심으로 시스템을 설계하세요:
초기에는 몇 가지 측정 가능한 목표를 선택하세요:
첫 릴리즈는 중앙화된 공급업체 레코드, 검증을 포함한 가격표 임포트, 주요 날짜가 있는 계약 저장, 기본 승인, 검색 및 감사 추적을 목표로 하세요.
이후에는 더 깊은 ERP 통합, 조항 라이브러리, 자동 송장 매칭, 다중 엔터티 지원, 고급 리포팅 대시보드를 추가할 수 있습니다.
화면이나 테이블을 스케치하기 전에, 공급업체가 가격표를 보내는 순간부터 누군가 그에 따라 주문을 하기까지 실제로 무슨 일이 일어나는지 매핑하세요. 이렇게 하면 단순한 "문서 보관소"를 만드는 실수를 피하고 통제된 가격 시스템을 구축할 수 있습니다.
조달, 재무, 법무와 함께 실제 사례를 단계별로 살펴보고 핸드오프와 아티팩트를 캡처하세요:
간단한 스윔레인 다이어그램(공급업체 → 구매/조달 → 법무 → 재무 → 운영)로도 충분한 경우가 많습니다.
비즈니스 결과를 바꾸는 의사결정을 나열하고 명확한 소유자를 지정하세요:
또한 승인 기준이 임계값에 따라 달라지는 곳(예: \u003e5% 인상 시 재무 승인 필요)을 기록해 두어 나중에 규칙으로 인코딩할 수 있게 하세요.
앱이 첫날 답해야 할 정확한 질문을 적으세요:
이 출력들이 데이터 필드, 검색, 리포트를 구동하게 하세요—그 반대가 되지 않도록.
조달 데이터는 지저분합니다. 일반적인 예외를 명시적으로 문서화하세요:
이 목록을 임포트 및 승인에 대한 수용 기준으로 삼아 시스템이 현실을 지원하도록 하세요.
공급업체 가격표와 계약을 위한 좋은 아키텍처는 유행을 쫓는 것이 아니라 조정 오버헤드를 줄이면서 성장 여지를 남기는 것입니다.
대부분의 팀(1–6명의 엔지니어)에겐 모듈형 모놀리스가 출발점으로 적절합니다: 명확히 분리된 모듈과 경계를 가진 하나의 배포 가능한 앱. 빠른 개발, 단순한 디버깅, 적은 운영 복잡성을 가져옵니다.
명확한 이유(예: 독립적 확장이 필요한 대량 임포트 워크로드, 여러 팀의 병행 작업, 엄격한 분리 요구)가 있을 때만 서비스로 분리하세요. 일반적 경로는: 모듈형 모놀리스 → 임포트/처리와 문서 워크로드를 백그라운드 워커로 추출 → 필요 시 고트래픽 도메인을 서비스로 분할하는 것입니다.
첫 프로토타입(화면, 워크플로, 역할 기반 접근)을 빨리 가속하려면 Koder.ai 같은 바이브-코딩 플랫폼을 이용해 구조화된 스펙으로 React + Go + PostgreSQL 기본을 생성한 뒤 임포트, 승인, 감사 추적에 빠르게 반복해 볼 수 있습니다. 조달팀의 경우, 과도하게 구축하기 전에 실제 사용자로 워크플로를 검증하는 것이 중요합니다.
앱을 몇 가지 안정된 도메인 중심으로 설계하세요:
각 모듈은 자체 규칙과 데이터 접근을 책임지게 하세요. 모놀리스라 하더라도 코드의 경계를 강제하세요(패키지, 명명, 모듈 간 명확한 API).
통합은 데이터 흐름을 바꾸므로 명확한 확장 포인트를 예약해 두세요:
측정 가능한 기대치를 미리 정의하세요:
깨끗한 데이터 모델은 조달 앱 신뢰성의 핵심입니다. 사용자가 “3월 3일에 유효했던 가격은 무엇인가?” 또는 “어떤 계약이 그 구매를 규정했는가?”라고 물으면 데이터베이스가 명확히 대답해야 합니다.
작은 집합의 명확한 레코드로 시작하세요:
구매자가 실제로 작업하는 방식을 반영하도록 관계를 모델링하세요:
다중 배송지나 사업부를 지원하면 Scope 개념(회사, 사이트, 지역 등)을 추가해 계약과 가격표에 첨부할 수 있게 고려하세요.
라이브 레코드를 제자리에서 수정하지 마세요. 대신:
이렇게 하면 언제 무엇이 승인되었고 무엇이 변경되었는지 재구성하기 쉬워집니다.
참조 데이터는 전용 테이블에 보관해 자유 텍스트 난맥을 피하세요:
중복을 방지하기 위해 식별자를 강제하세요:
가격표는 기계 처리를 염두에 두고 만들어지지 않은 스프레드시트로 도착하는 경우가 많습니다. 매끄러운 임포트 흐름은 “앱을 쓰겠다”와 “계속 엑셀을 이메일로 주겠다”의 차이를 만듭니다. 목표: 업로드는 관대하게, 저장되는 데이터는 엄격하게.
첫날부터 CSV와 XLSX를 지원하세요. CSV는 ERP와 BI 도구에서의 내보내기에 좋고, XLSX는 실제 공급업체가 보내는 형식입니다.
데이터 모델을 반영한 다운로드 가능한 템플릿을 제공하세요(오해를 줄이기 위해). 포함 항목:
템플릿은 버전 관리(예: Template v1, v2)를 해서 기존 프로세스를 깨뜨리지 않고 진화시킬 수 있게 하세요.
매핑 규칙을 명시적으로 정의하고 업로드 UI에서 보여주세요.
일반적인 접근법:
커스텀 열을 허용하면 그것들은 메타데이터로 취급해 핵심 가격 스키마를 어지럽히지 않도록 별도 저장하세요.
모든 것이 커밋되기 전에 검증을 실행하세요:
행 수준 검증(이 행이 잘못되었음)과 파일 수준 검증(이 업로드가 기존 레코드와 충돌함)을 모두 수행하세요.
좋은 임포트 경험은 업로드 → 미리보기 → 수정 → 확인의 흐름을 가집니다.
미리보기 화면에서:
"한 행의 오류로 전체 파일을 실패시키지 마세요." 대신 사용자가 선택하도록 하세요: 유효한 행만 임포트 또는 모든 오류가 수정될 때까지 차단.
감사성과 재처리를 위해 다음을 저장하세요:
이렇게 하면 분쟁 시 "우리가 언제 무엇을 임포트했는가"를 방어할 수 있고, 검증 규칙이 바뀔 때 재처리가 가능합니다.
계약 레코드는 단순한 파일 캐비닛 이상이어야 합니다. 갱신, 승인, 리포팅을 구동할 만큼 구조화된 데이터가 필요하면서도 서명된 문서를 쉽게 찾을 수 있어야 합니다.
매주 조달팀이 묻는 질문에 답할 수 있는 필드를 우선하세요:
엣지 케이스를 위한 자유 텍스트 노트는 두되, 필터/그룹/알림에 쓸 항목은 정규화하세요.
문서를 계약에 연결된 1급 엔티티로 취급하세요:
각 파일에 대해 문서 유형, 유효일, 버전, 업로더, 기밀 등급 같은 메타데이터를 저장하세요. 보존 요구사항이 있으면 "보존 기간" 및 "법적 보류(legal hold)" 필드를 추가해 삭제를 방지하고 감사에 대응하세요.
수정은 히스토리를 덮어써서는 안 됩니다. 날짜가 있는 변경으로 모델링하세요(종료일 연장, 상업적 조건 조정, 범위 추가/제거 등).
가능하면 주요 조항을 구조화된 데이터로 캡처해 알림과 리포팅에 활용하세요—예: 계약해지 허용 여부(Y/N), 물가연동 공식, 서비스 크레딧, 책임한도, 독점성 등.
중앙에서 구매하지만 여러 사이트에서 운영한다면 하나의 계약을 다수의 사이트/사업부에 연결하고(사이트별 오버라이드 허용) 계약 당사자를 명확히 보존하세요. 또한 하나의 계약이 모회사와 자회사를 포괄할 수 있게 하되, 준법을 위해 “계약 당사자”를 명확히 하세요.
승인은 가격표와 계약을 방어 가능한 상태로 만드는 곳입니다. 명확한 워크플로는 "누가 이것을 승인했는가?"라는 논쟁을 줄이고 공급업체 제출에서 사용 가능한, 컴플라이언트한 데이터로 가는 반복 가능한 경로를 만듭니다.
가격표와 계약 레코드 모두에 대해 간단하고 눈에 보이는 수명주기를 사용하세요:
Draft → Review → Approved → Active → Expired/Terminated
앱 내에서 책임을 정의하세요(구전 지식에 맡기지 마세요):
자동으로 추가 승인 단계를 트리거하는 정책 기반 체크를 추가하세요:
모든 승인 또는 거부는 다음을 캡처해야 합니다:
승인이 지연되지 않도록 서비스 수준 기대치를 설정하세요:
거버넌스는 사후 강제가 아니라 워크플로에 내장될 때 가장 잘 작동합니다.
조달 앱은 사람들이 "현재 가격은 무엇인가?", "이 품목을 규정하는 계약은 무엇인가?", "지난 분기 이후 무엇이 변경되었나?" 같은 단순한 질문에 얼마나 빨리 답하느냐에 따라 성공 여부가 갈립니다. UI를 데이터베이스 테이블이 아니라 이러한 워크플로 중심으로 설계하세요.
상단 내비게이션에 두 가지 주요 진입점을 제공하세요:
결과 페이지에서는 실제 작업과 맞는 계약 필터를 제공하세요: 유효일, 계약 상태(초안/활성/만료), 사업부, 통화, "승인 대기 중" 등. 필터는 칩 형태로 보여 쉽게 제거할 수 있게 하세요.
공급업체 프로필은 허브가 되어야 합니다: 활성 계약, 최신 가격표, 진행 중인 분쟁/노트, "최근 활동" 패널 포함.
계약 뷰는 “우리는 무엇을 어떤 조건으로 언제까지 구매할 수 있는가?”에 답해야 합니다. 주요 조건(인코텀즈, 결제 조건), 첨부 문서, 수정 타임라인을 포함하세요.
가격표 비교는 사용자가 많은 시간을 소비하는 곳입니다. 현재 vs 이전을 나란히 보여주고:
리포트는 장식적이기보다 실행 가능해야 합니다: “60일 내 만료”, “가장 큰 가격 인상”, “여러 활성 가격을 가진 품목” 등. 재무용 CSV와 공유/승인용 PDF를 원클릭으로 제공하되, UI의 필터가 그대로 적용되게 하세요.
명확한 레이블("유효 시작일" 대신 "Effective date" 같은 내부 용어를 피해 한국어로 명확히), 까다로운 필드에 대한 인라인 도움말(단위, 통화), 빈 상태 메시지("가격표를 임포트하여 변경 추적을 시작하세요")를 사용하세요. /help의 짧은 온보딩 체크리스트는 교육 시간을 줄여줍니다.
보안은 나중에 덧붙이는 것보다 워크플로에 설계하는 것이 더 쉽습니다. 조달 앱의 목표는 간단합니다: 사용자들은 자신이 책임진 것만 보고 변경하며, 모든 중요한 변경은 추적 가능해야 합니다.
작고 명확한 역할 모델을 시작하고 이를 액션 단위로 매핑하세요:
권한은 모든 엔드포인트에서 서버 측으로 강제 적용되어야 합니다(UI 권한만으론 부족).
초기에 무엇이 추가 보호가 필요한지 결정하세요:
핵심 엔티티(계약, 조항, 가격 항목, 승인)에 대해 불변 감사 로그를 캡처하세요: 누가, 무엇을 변경했는지(이전/이후), 언제, 출처(UI/임포트/API). 임포트 파일명과 행 번호도 기록해 문제 추적과 수정이 가능하게 하세요.
주요 로그인 방법 하나를 선택하세요:
민감한 작업(예: 가격 내보내기)에는 짧은 토큰 수명, 보안 쿠키, 비활성 타임아웃, 재인증 요구를 적용하세요.
실용적 통제를 목표로 하세요: 최소 권한, 중앙 로깅, 정기 백업, 복구 훈련. 감사 로그는 비즈니스 기록으로 취급해 삭제를 제한하고 보존 정책을 정의하세요.
가격은 거의 절대 "하나의 숫자"가 아닙니다. 구매자, AP, 공급업체 모두 "오늘 이 품목의 가격은 무엇인가?"에 대해 같은 답을 얻어야 합니다.
가격을 시작일과 선택적 종료일을 가진 시간 경계 레코드로 저장하세요. 미래 일자를 허용하고(예: 다음 분기 인상), "오픈엔디드"는 보통 "대체될 때까지 유효"로 정의하세요.
중첩은 의도적으로 처리하세요:
실용적 규칙: 특정 시점에서 공급업체-품목-통화-단위 당 하나의 기본 가격만 허용; 나머지는 명시적 오버라이드로 표시.
여러 후보가 존재할 때 순서를 정의하세요(예 예시):
공급업체 선호도가 있으면 동일 품목에 여러 공급업체가 있을 때 쓰이는 공급업체 우선순위 필드를 명시적으로 추가하세요.
어떤 방식을 저장할지 선택하세요:
많은 팀은 둘 다 사용합니다: 공급업체 가격은 원화(원래 통화)로 저장하고 보고용으로 "기준 시점 변환값"을 함께 저장합니다.
단위 정규화(각품, 케이스, kg 등)를 정의하고 변환 계수를 버전 관리하세요. 반올림 규칙(통화 소수점, 최소 가격 증분)을 일관되게 적용하고, 반올림이 언제 일어나는지(단위 변환 후, 환율 변환 후, 최종 행 합계 후)를 명확히 하세요.
갱신은 계약 가치를 지키는 곳입니다: 통지 기간 누락, 무심코 발생하는 자동 갱신, 막판 협상은 불리한 조건으로 이어질 수 있습니다. 앱은 갱신을 관리되는 프로세스로 처리해야 합니다: 명확한 날짜, 책임자, 작업 큐.
갱신을 계약(또는 선택적으로 특정 수정)에 연결된 마일스톤 집합으로 모델링하세요:
이 마일스톤을 중심으로 리마인더를 만들고, 실용적 기본값은 통지 기한을 기준으로 90/60/30일 전의 캔디드와 당일 알림입니다.
초기에는 두 채널로 시작하세요:
선택적으로 계약별 또는 사용자별로 ICS 캘린더 파일 내보내기(Outlook/Google Calendar 구독 가능)를 지원하세요.
알림은 실행 가능해야 합니다: 계약명, 공급업체, 정확한 데드라인, 레코드로의 딥링크를 포함하세요.
알림 대상:
에스컬레이션 규칙 추가: 기본 담당자가 X일 내 확인하지 않으면 백업 또는 관리자에게 알림. "확인(acknowledged)" 타임스탬프를 추적해 알림이 단순 배경 소음이 되지 않게 하세요.
대시보드는 단순하고 필터 가능하며 역할 인지형이어야 합니다:
각 위젯은 필터된 목록 보기와 내보내기로 연결되어 대시보드가 단순한 리포트가 아니라 실행의 출발점이 되게 하세요.
공급업체 가격표와 계약을 위한 MVP는 한 가지를 증명해야 합니다: 팀이 안전하게 가격을 올리고, 올바른 계약을 빠르게 찾고, 승인과 감사 기록을 신뢰할 수 있어야 합니다.
많은 기능을 부분적으로 구현하기보다 얇고 엔드투엔드 워크플로 하나를 증명하세요:
작게 빠르게 움직이는 팀이라면 Koder.ai로 초기 제품 골격(React 프론트엔드, Go 백엔드, PostgreSQL)을 빠르게 띄우고 조달/법무 이해관계자와 워크플로를 검증한 뒤 소스코드를 익스포트해 확장하는 전략도 고려하세요.
실수가 비용이 큰 부분에 테스트를 집중하세요:
생산 유사 데이터를 갖춘 스테이징을 사용하세요(데이터 마스킹/익명화). 체크리스트: 백업 활성화, 마이그레이션 스크립트 리허설, 롤백 계획(버전 관리된 DB 마이그레이션 + 배포 되돌리기).
임포트 실패, 느린 검색 쿼리, 승인 병목 현상에 대한 모니터링을 추가하세요.
조달 및 재무와 2–4주 피드백 루프를 운영하세요: 임포트에서 발생한 상위 오류, 계약에 누락된 필드, 느린 화면. 다음 우선순위는 ERP 통합, 공급업체 포털 업로드, 절감액 및 컴플라이언스에 대한 분석 등이 될 수 있습니다.
권장 내부 참고: /pricing 및 /blog.
다음 두 가지를 중앙에서 관리하는 것부터 시작하세요: 가격표 버전과 계약 버전.
MVP에 포함할 항목:
대부분의 소규모 팀(1–6명 개발자)에겐 **모듈형 모놀리스(modular monolith)**가 적합합니다: 모듈로 분리된 하나의 배포 단위(공급업체, 가격표, 계약, 승인, 리포팅 등).
대용량 임포트나 문서 처리, 알림 같은 무거운 작업은 백그라운드 워커로 분리한 뒤에 마이크로서비스로 나누는 것을 고려하세요.
최소한으로 모델링해야 할 항목들:
주요 관계:
기록을 덮어쓰지 마세요. 버전 관리를 사용하세요:
그 다음 “현재”는 쿼리로 결정됩니다: 사용자가 선택한 날짜에 유효한 최신 승인된 버전을 조회하세요.
목표는 “업로드는 관대하게, 저장된 데이터는 엄격하게”입니다:
감사성과 재처리를 위해 원본 파일 + 매핑 + 검증 결과를 저장하세요.
일반적인 검증 규칙:
프로모션/오버라이드 등으로 중첩을 허용한다면 사유와 승인 요구를 추가하세요.
가격표와 계약 모두에 대해 명확하고 일관된 승인 워크플로를 적용하세요:
사용자가 하나의 패턴을 배우면 혼란이 줄어듭니다.
간단한 역할 모델을 서버 측에서 엄격히 적용하세요:
필요 시 범위 기반 권한(사업부/지역/공급업체별)을 추가하고, 계약 PDF/은행 정보 등 민감 데이터는 더 강한 접근제어를 적용하세요.
갱신을 관리된 프로세스로 다루세요—중요 날짜, 책임자, 작업 큐를 명시적으로 관리합니다:
실행 가능한 대시보드 예:
각 위젯은 필터된 목록 보기와 내보내기로 연결되어야 합니다.