실무용 라인 아이템 양식을 위한 부모-자식 데이터 모델
견적, 주문, 비용 청구, 체크리스트 등에서 부모-자식 데이터 모델을 사용해 편집 가능한 라인 아이템 양식을 단순하고 안정적으로 설계하는 방법을 알아보세요.

하나의 레코드로는 부족한 이유
견적, 주문, 비용 청구 요청 또는 체크리스트는 거의 한 가지 항목만을 설명하지 않습니다. 대부분의 양식은 상단에 하나의 주요 레코드가 있고 그 아래에 여러 작은 항목들이 있습니다. 모든 것을 하나의 레코드에 억지로 넣으면 양식이 읽기 어렵고, 편집하기 어렵고, 쉽게 깨집니다.
긴 텍스트 필드는 처음에는 더 간단해 보일 수 있지만 거의 즉시 문제를 일으킵니다. 사용자는 한 항목만 깔끔하게 추가하거나, 한 행만 고치거나, 오래된 정보를 자신 있게 제거할 수 없습니다. 검증도 약해지는데, 시스템이 명확한 개별 항목 대신 하나의 텍스트 블록만 보기 때문입니다.
판매 견적을 생각해 보세요. 한 고객의 요청에 제품 다섯 개가 포함될 수 있고 각 항목은 수량, 단가, 할인, 메모가 필요합니다. 비용 청구도 마찬가지입니다. 하나의 제출은 한 직원에 속하지만 각 비용은 자체 날짜, 카테고리, 금액, 영수증 상태를 가집니다.
이때 부모-자식 모델이 도움이 됩니다. 부모 레코드는 요청자, 날짜, 부서, 승인 상태 등 전체 양식에 공통되는 세부사항을 저장합니다. 자식 레코드는 라인 아이템을 저장합니다. 각 행은 메인 레코드를 손상시키지 않고 개별적으로 추가·편집·삭제할 수 있습니다.
이 분리는 사용자가 양식을 더 쉽게 사용하고 팀이 신뢰하기 쉽게 만듭니다. 한 행에 금액이 틀렸거나 필드가 빠졌다면 그 행만 수정하면 됩니다. 나머지 레코드는 그대로 유지됩니다.
편집 가능한 체크리스트에도 같은 패턴이 적용됩니다. 체크리스트는 소유자와 기한을 가질 수 있고, 각 작업은 라벨, 담당자, 메모, 완료 상태를 가집니다. 공통 세부사항은 한곳에, 항목 세부사항은 각자의 위치에 남아 있습니다.
부모와 자식 레코드는 어떻게 작동하나
라인 아이템 양식은 하나의 메인 레코드와 여러 관련 항목 레코드로 분리할 때 관리가 가장 쉽습니다.
부모 레코드는 한 번만 나타나야 할 정보를 담습니다. 견적에서는 고객, 견적일, 영업 담당자, 현재 상태가 이에 해당할 수 있습니다. 비용 청구 요청에서는 직원 이름, 부서, 제출일, 승인 단계 등이 될 수 있습니다.
각 자식 레코드는 그 부모에 연결된 편집 가능한 하나의 항목을 저장합니다. 견적에서는 하나의 자식이 제품 또는 서비스 한 줄을 나타낼 수 있습니다. 체크리스트에서는 하나의 자식이 작업이 됩니다. 비용 청구 양식에서는 보통 각 자식이 날짜, 카테고리, 금액, 영수증 메모 같은 필드를 가진 하나의 비용입니다.
가장 단순한 생각은 이렇습니다:
- 부모: 전체 양식에 대한 공통 세부사항
- 자식: 한 행, 한 항목, 한 동작
- 링크: 자식이 자신의 부모를 가리키는 필드
이 구조가 중요한 이유는 합계와 요약이 수동으로 부모에 입력된 값이 아니라 자식 행에서 나와야 하기 때문입니다. 누군가 항목을 추가·삭제·편집하면 합계는 실제 데이터에서 업데이트되어야 합니다. 이는 오류를 줄이고 승인 과정을 더 신뢰할 수 있게 만듭니다.
또한 검증을 더 정밀하게 할 수 있습니다. 수량을 요구하거나 음수 금액을 거부하거나 한 행의 누락된 날짜를 표시하되 양식 전체를 중단시키지 않을 수 있습니다.
일상 업무에서의 일반적 사용 사례
한 레코드 아래에 여러 편집 가능한 행이 필요한 곳이면 어디서든 이 패턴을 볼 수 있습니다.
견적이 명확한 예입니다. 영업 담당자가 하나의 견적을 만들고 각 제품이나 서비스마다 한 줄을 추가합니다. 각 행은 항목명, 수량, 단가, 할인, 세금, 메모 등이 필요할 수 있고 부모는 고객, 날짜, 승인 상태를 유지합니다.
주문도 같은 아이디어를 사용하지만 행은 종종 더 많은 운영 세부사항을 담습니다. 하나의 주문은 여러 제품을 포함할 수 있고 각 행은 재고 상태, 창고 메모, 배송 세부사항, 이행 날짜 등을 필요로 할 수 있습니다. 라인 아이템이 주문 후에 실제 작업을 이끕니다.
비용 청구 워크플로우도 흔한 사례입니다. 한 건의 요청은 한 직원과 한 보고 기간에 속하지만 여러 비용을 포함할 수 있습니다. 각 비용 행은 보통 날짜, 금액, 카테고리, 공급업체, 영수증 참조가 필요합니다. 관리자는 전체 요청을 단순히 예/아니오로 처리하기보다 행별로 검토하는 경우가 많습니다.
체크리스트도 같은 모델에 맞습니다. 부모 레코드는 온보딩 계획, 현장 검사, 주간 검토 등이 될 수 있고 각 자식 행은 완료 상태, 메모, 담당자, 마감일을 가진 작업이 됩니다.
간단한 테스트가 있습니다: 양식에 하나의 헤더와 사람들이 추가·편집·삭제해야 하는 여러 행이 있나요? 그렇다면 부모-자식 구조가 보통 더 깔끔한 선택입니다.
빌드 전에 구조를 계획하세요
좋은 양식은 보통 한 가지 질문에서 시작합니다: 전체 레코드에 속하는 값과 각 행에서 반복되는 값은 무엇인가?
먼저 그것을 결정하면 이후 많은 문제가 사라집니다. 중복 필드, 엉성한 합계, 관리하기 힘든 행을 피할 수 있습니다.
부모 레코드에는 문서 전체를 설명하는 필드만 두세요. 견적이라면 고객 이름, 견적일, 통화, 영업 담당자, 전체 승인 상태가 될 수 있습니다. 비용 청구라면 직원 이름, 부서, 제출일, 최종 결정 등이 될 수 있습니다.
자식 레코드에는 각 행에 속하는 필드를 두세요. 항목 이름, 수량, 단가, 비용 날짜, 카테고리, 영수증 유형, 작업 라벨, 행 메모 등이 이에 해당합니다. 값이 각 행마다 달라질 수 있다면 보통 자식에 있어야 합니다.
유용한 테스트 하나는 이겁니다: 한 행을 삭제하면 그 값도 사라져야 하나? 그렇다면 그 필드는 자식 레코드에 속할 가능성이 큽니다.
각 행에는 고유 ID가 있어야 합니다. 첫째, 둘째 같은 위치에만 의존하지 마세요. 행 ID는 특정 비용을 편집하거나 삭제된 항목을 복원하거나 변경 사항을 추적할 때 훨씬 쉽고 안전합니다.
빌드 전에 사람들이 행을 어떻게 다룰지 결정하세요. 새 행을 추가할 수 있나? 복제, 제거, 재정렬, 긴 목록에서 필터링할 수 있나? 또한 합계와 상태는 언제 업데이트되어야 하는지도 결정하세요. 어떤 팀은 행이 바뀌자마자 합계를 갱신하기를 원하고, 다른 팀은 레코드 저장이나 제출 시에만 업데이트하길 선호합니다. 어느 방식이든 규칙은 일관되어야 합니다.
상태 규칙도 중요합니다. 한 비용이 반려되면 전체 요청이 초안으로 돌아가나요, 보류 상태로 남나요, 아니면 부분 승인 상태로 전환되나요? 사용자가 양식을 신뢰하기 시작한 후에 이런 질문에 답하는 것보다 미리 정해두는 것이 훨씬 쉽습니다.
사용자가 편집하기 쉽도록 만드세요
라인 아이템 양식은 사용자가 부모 세부사항과 항목 행을 함께 볼 수 있을 때 가장 잘 작동합니다. 상단에 메인 레코드를 두고 그 아래에 편집 가능한 테이블을 바로 보여주세요. 견적을 작성하는 사람은 제품을 추가하기 전에 고객, 날짜, 상태를 확인할 수 있어야 합니다.
이 단순한 레이아웃은 사람들이 편집하려는 내용을 확인하기 위해 화면을 오가야 하는 일을 줄여 실수를 줄입니다.
전체 작업을 한 화면에 유지하세요
새 행 추가는 빠르게 느껴져야 합니다. 테이블 위나 아래에 명확한 항목 추가 버튼을 두는 것으로 충분한 경우가 많습니다. 클릭하면 별도 페이지로 전환하지 말고 빈 행이나 작은 인라인 폼을 여세요.
이것은 긴 양식에서 특히 중요합니다. 입력할 비용이 열 개라면 클릭 하나하나가 속도를 늦추고 실수 확률을 높입니다.
가장 유용한 행 동작은 보통 단순한 것들입니다: 추가, 복제, 삭제, 때로는 이동. 복제는 호텔 숙박처럼 여러 행이 비슷할 때 특히 유용합니다.
오류는 발생한 위치에 보여주세요
긴 양식은 부분 작업을 자동으로 저장하거나 최소한 초안으로 저장할 수 있어야 합니다. 탭이 닫혀서 20분 치 행 입력을 잃어버리는 것은 양식을 신뢰하기 어렵게 만드는 빠른 방법입니다.
검증도 똑같이 명확해야 합니다. 한 행에 금액이 없거나 수량이 잘못된 경우 그 정확한 행과 필드에 오류를 표시하세요. 사람들에게 모호한 경고를 찾아서 양식 전체를 뒤지게 하지 마세요.
일곱 개의 비용 행이 정상이고 한 개의 행만 영수증 번호가 없다면 그 행만 표시하고 나머지 요청은 그대로 두어 사람이 제자리에서 문제를 고치게 하세요.
예: 여러 비용이 있는 비용 청구 요청
비용 청구 요청은 이 모델이 왜 잘 작동하는지 정확히 보여줍니다. 하나의 요청이 부모 레코드 역할을 하고 각 비용이 자식 행이 됩니다.
부모는 청구 전체에 적용되는 세부사항을 담습니다: 직원 이름, 청구 기간, 관리자, 전체 상태. 상태는 Draft에서 Submitted로, 그다음 Partially Approved 또는 Approved로 이동할 수 있습니다.
각 비용 행은 그 항목에만 적용되는 세부사항을 저장합니다. 한 행은 택시비의 가맹점, 구매일, 금액, 카테고리, 영수증 정보를 담고 또 다른 행은 호텔 청구서에 대한 동일한 필드를 가질 수 있습니다.
간단한 요청 예시는 세 개의 행이 있을 수 있습니다:
- City Taxi, 5월 3일, $28, 여행, 영수증 첨부
- Grand Hotel, 5월 4일, $180, 숙박, 영수증 첨부
- Corner Cafe, 5월 4일, $14, 식대, 영수증 없음
이 구조가 중요한 이유는 관리자들이 비용 행을 하나씩 검토하는 경우가 많기 때문입니다. 택시와 호텔은 승인되고 식대는 "영수증 없음" 또는 "일일 한도 초과" 같은 짧은 이유로 반려될 수 있습니다.
한 행의 반려가 전체 요청을 망쳐서는 안 됩니다. 직원은 승인된 항목에 대해 환급을 받아야 하고 반려된 행은 이유와 함께 그대로 보여야 합니다. 이렇게 하면 프로세스가 이해하기 쉬워지고 이후 감사하기도 쉬워집니다.
합계는 부모에 사람이 수기로 입력한 숫자가 아니라 자식 행에서 나와야 합니다. 많은 팀은 두 개의 합계를 유지합니다: 포함된 모든 행을 기준으로 한 제출 합계와 승인된 항목만을 기준으로 한 승인 합계. 이렇게 하면 지급액이 원래 요청보다 적은 이유가 명확해집니다.
합계, 승인 및 상태 변경
라인 아이템 양식은 숫자와 상태가 적절한 시점에 업데이트될 때 신뢰할 수 있게 느껴집니다.
사용자가 수량, 가격 또는 비용 금액을 변경하면 합계는 그 변경을 기준으로 재계산되어야 합니다. 최종 제출 때까지 기다리면 할인, 세금, 승인 한도 등이 관련될 때 혼란이 생기기 쉽습니다. 대부분의 경우 부모 합계는 계산된 값이어야 하며 편집 가능하게 두지 않는 편이 낫습니다.
승인 규칙도 동일한 수준의 명확성이 필요합니다. 레코드가 완전히 승인된 후에 행을 잠글지 여부를 결정하세요. 승인된 행이 계속 편집 가능하면 관리자가 실제로 서명한 내용과 데이터가 달라질 수 있습니다.
때로는 승인 과정이 전체가 아니라 행 단위로 일어납니다. 비용 청구가 좋은 예입니다. 여행은 승인되고 식대는 일부 반려되며 다른 비용은 추가 설명을 위해 반려될 수 있습니다. 이 경우 각 자식 행은 자체 상태를 가져야 하고 부모는 전체 상태를 유지해야 합니다.
간단한 전체 상태 집합은 보통 충분합니다:
- Draft
- Pending review
- Partially approved
- Approved
- Rejected
이 분리는 양식을 더 정직하게 만듭니다. 부모는 요청이 전체적으로 어디에 있는지 알려주고 자식 행은 각 항목에 무슨 일이 있었는지 설명합니다.
또한 금액, 상태, 승인자, 합계 같은 중요한 필드의 간단한 변경 기록을 유지하는 것이 도움이 됩니다. 시작 단계에서 완전한 감사 시스템이 꼭 필요하지는 않지만 주요 변경을 설명할 수 있을 정도의 기록은 필요합니다.
삭제된 행에도 규칙이 필요합니다. 검토 전에 하드 삭제가 괜찮을 수 있습니다. 검토가 시작된 후에는 과거 합계와 승인 결정을 일관되게 유지하기 위해 보관하는 편이 안전합니다.
신뢰를 약화시키는 실수들
화면상으로는 깔끔해 보이지만 내부적으로 엉성한 데이터를 저장하면 신뢰는 빠르게 떨어집니다.
가장 흔한 실수 중 하나는 부모 필드와 항목 필드를 하나의 평면 표에 섞어 버리는 것입니다. 견적, 주문, 비용 청구 요청은 요청자, 날짜, 승인 상태 같은 전체에 속하는 세부사항을 가지며 행들은 항목명, 금액, 수량, 영수증 날짜 같은 자체 세부사항을 가집니다. 이들이 섞이면 편집이 혼란스러워지고 보고서 사용이 어려워지며 중복 데이터가 빠르게 퍼집니다.
또 다른 흔한 문제는 합계를 사람이 수동으로 입력하게 두는 것입니다. 누군가 세 개의 비용 행을 입력하고 총액을 별도로 입력하면 숫자가 일치하지 않을 수 있습니다. 몇 번 이런 일이 생기면 검토자는 양식을 신뢰하지 않게 됩니다.
큰 자유 텍스트 박스도 비슷한 문제를 일으킵니다. 사용자에게 모든 항목을 하나의 필드에 붙여 넣게 하는 것이 빠르게 보일 수 있지만 비정형 텍스트는 검증, 정렬, 필터, 승인하기 어렵습니다. 구조화된 행은 더 많은 계획이 필요하지만 이후 관리가 훨씬 쉽습니다.
행 수준의 검사도 종종 놓칩니다. 빈 행, 잘못된 날짜, 중복 항목, 음수 금액, 반쯤 완성된 항목은 양식이 진행되기 전에 잡아야 합니다. 대부분의 실제 오류는 헤더가 아니라 자식 행 내부에서 발생합니다.
삭제도 약한 지점입니다. 사용자가 확인 없이 한 번의 클릭으로 행을 제거할 수 있다면 중요한 데이터가 실수로 사라질 수 있습니다. 누가 변경했는지 기록이 없을 때는 더 심각합니다.
더 안전한 접근은 단순합니다: 행 삭제를 확인하고 계산된 필드는 잠그고 사용자가 한 주요 변경 사항을 기록하세요.
출시 전 점검
반복되는 행이 있는 양식을 게시하기 전에 실제 사용자가 하듯 테스트하세요.
기본부터 시작하세요. 사용자가 행을 추가, 편집, 복제, 제거하는 동안 다른 데이터가 사라지지 않는지 확인하세요. 양식이 열 행일 때, 그다음엔 쉰 행, 백 행일 때도 동작이 잘 되는지 확인하세요. 오류는 페이지 상단에만 뜨는 것이 아니라 정확히 문제가 있는 행에 표시되어야 합니다.
변경 후 상황도 테스트하세요. 수량 업데이트, 행 삭제, 항목 복제, 상태 변경을 수행한 뒤 각 동작 후 부모 레코드가 올바른 합계, 개수, 요약 상태를 표시하는지 확인하세요.
또한 약점을 드러내는 엣지 케이스도 테스트하세요: 모든 행이 제거된 경우, 여러 유효 행 중 하나가 잘못된 경우, 중복 항목, 0 금액, 긴 메모, 제출 후 편집 등입니다.
일상적인 사용에서 명확성을 유지하고 지저분한 상황에서도 예측 가능하게 동작하면 양식은 출시 준비가 된 것입니다.
노코드 앱에서 구축하기
노코드 앱에서 구축한다면 비용 청구나 견적처럼 사람들이 이미 이해하고 있는 한 워크플로로 시작하세요. 먼저 데이터 구조를 만들고 부모 레코드와 자식 행을 연결하는 규칙을 추가한 다음 레이아웃을 다듬으세요.
실제 샘플 데이터를 사용하는 것이 완벽한 테스트 데이터보다 훨씬 도움이 됩니다. 중복, 누락된 메모, 수정된 금액, 불완전한 행을 입력해 보세요. 그런 사례들이 양식이 혼란스러워지는 지점과 신뢰가 떨어지는 지점을 보여줍니다.
AppMaster는 부모-자식 구조가 별도 데이터 모델, 관련 양식, 비즈니스 로직으로 자연스럽게 매핑되기 때문에 이런 빌드에 적합합니다. 프로세스가 커지면 같은 핵심 모델을 다시 구축하지 않고도 백엔드, 웹 앱, 네이티브 모바일 앱으로 확장할 수 있습니다.
주요 목표는 사용하는 도구와 상관없이 동일합니다: 부모 레코드는 깔끔하게 유지하고 각 행은 개별적으로 편집 가능하게 하며 합계와 상태는 실제 데이터에서 나오게 하세요. 이 부분을 제대로 하면 라인 아이템 양식은 훨씬 사용하기 쉽고 신뢰하기 쉬워집니다.
자주 묻는 질문
하나의 레코드는 보통 전체 문서에 공통되는 세부사항과 반복되는 항목 세부사항을 섞어 버립니다. 부모-자식 모델은 헤더를 깔끔하게 유지하고 각 행을 전체 양식을 망가뜨리지 않고 추가, 편집, 검증, 삭제할 수 있게 합니다.
문서 전체를 설명하는 값은 부모에 두세요(예: 요청자, 고객, 날짜, 부서, 전체 상태). 행마다 달라질 수 있는 값은 자식에 두세요(예: 수량, 금액, 카테고리, 메모, 기한).
헤더 하나와 그 아래 편집 가능한 여러 행이 있는 경우 부모-자식 구조를 사용하세요. 견적, 주문, 비용 청구, 체크리스트가 대표적인 예로, 각 행은 자체 필드와 동작이 필요합니다.
예. 각 자식 행에 위치 기반이 아니라 고유 ID를 부여하세요. 이렇게 하면 특정 비용을 편집하거나 삭제된 항목을 복원하거나 변경 사항을 추적할 때 훨씬 안전합니다.
보통 그렇습니다. 더 안전한 기본값은 자식 행에서 합계를 계산하고 부모의 합계는 읽기 전용으로 유지하는 것입니다. 이렇게 하면 불일치가 줄고 승인 과정에서 신뢰가 올라갑니다.
오류는 정확히 문제가 발생한 그 행과 필드에 표시하세요. 한 항목이 잘못되었을 때 전체 양식이 없어지지 않고 제자리에 해당 행만 수정할 수 있어야 합니다.
항목을 하나씩 승인하는 경우가 있다면, 각 자식 행에 자체 상태를 두고 부모는 전체 상태를 유지하세요. 비용 청구처럼 항목별로 승인·반려가 다른 경우 이 방식이 잘 맞습니다.
검토 전에만 완전 삭제가 괜찮을 수 있습니다. 검토가 시작된 이후에는 과거 합계와 승인 결정을 보존하기 위해 보관(아카이브)하는 편이 안전합니다.
가능하면 부모 상세와 편집 가능한 행을 한 화면에 두세요. 항목 추가, 복제, 삭제 버튼을 찾기 쉽게 배치하고 긴 양식에는 초안 저장이나 부분 저장 기능을 제공하면 사용성이 좋아집니다.
부모와 자식용으로 별도 데이터 모델을 만든 다음, 링크, 합계, 상태를 연결하는 규칙을 추가하세요. AppMaster는 관련 데이터 모델, 비즈니스 로직을 한 곳에서 다루고 동일한 워크플로우를 백엔드·웹·모바일 앱으로 확장할 수 있어 적합합니다.


