한줄 요약
8개 문서 양식을 2개 테이블로 통합하는 DB 구조를 설계하다가, BOM 재귀 전개와 Access CTE 미지원이라는 벽을 만났습니다. Claude와 함께 풀어낸 과정을 공유합니다.
이런 분들께 도움돼요
Excel + Access 조합으로 사내 DB 시스템을 만들려는 분
DB 설계는 처음인데 테이블을 어떻게 나눠야 할지 막막한 분 #NAME? #NAME?
소개: 시도하고자 했던 것과 그 이유
Excel 양식 14개를 완성했지만, 데이터를 어디에 저장할지가 문제였습니다. 6명이 동시에 접근할 수 있어야 하고, 부서 간 데이터가 연결되어야 하며, 비용 부담 없이 운영할 수 있어야 했습니다.
선택지는 Access DB + Dropbox 공유였습니다. 그런데 막상 설계를 시작하니 첫 번째 질문부터 막혔습니다.
"테이블을 몇 개로 나눠야 하지?"
8개 문서 양식이 있으니 8개 테이블? 부서별로 5개? 아니면 통합해서 2개? 기준이 없으니 판단이 안 됐습니다.
진행 방법: 어떻게 AI와 협업했나요?
도구: Claude, Microsoft Access, Excel (AccessDB설계 시트)
"오, 이거 진짜 되네!" 했던 순간
Claude에게 8개 양식의 컬럼 구조와 업무 흐름을 설명했더니, 분석 편의성 극대화라는 설계 원칙과 함께 2-테이블 통합 구조를 제안했습니다. 핵심 식별자(생산의뢰 번호, 작업지시번호)를 기준으로 여러 부서의 데이터를 하나의 레코드에 통합하는 방식이었습니다.
Claude가 제안한 테이블 구조와 함께 즉시 뽑아준 SQL이 이렇습니다:
-- tbl_생산의뢰: 자재부→생산관리→출고팀→제품출하 통합 (46컬럼)
CREATE TABLE tbl_생산의뢰 (
ID AUTOINCREMENT PRIMARY KEY,
생산의뢰번호 TEXT(30) NOT NULL, -- UK: TDM-YY-MM-NNN 형식
의뢰일 DATETIME,
대표품번 TEXT(30), -- IX: 품번별 조회
의뢰수량 LONG,
진행상태 TEXT(20), -- IX: 작업지시/가공중/완료
발주구분 TEXT(10),
발주금액 CURRENCY,
입고수량 LONG,
표면처리 TEXT(20),
출고수량 LONG,
출고일자 DATETIME, -- IX: 출하확인서 조회
출고담당자 TEXT(20) -- 6명 담당자
);
-- tbl_작업지시: 생산관리→가공팀 통합 (36컬럼)
CREATE TABLE tbl_작업지시 (
ID AUTOINCREMENT PRIMARY KEY,
작업지시번호 TEXT(30) NOT NULL, -- UK
생산의뢰번호 TEXT(30), -- FK → tbl_생산의뢰 (1:N)
가공팀 TEXT(20), -- IX: 팀별 실적 집계
지시수량 LONG,
납품수량 LONG,
완료요청일 DATETIME,
진행완료 DATETIME
);
인덱스 26개, ER 다이어그램, 유용한 쿼리 8종까지 한 세트로 완성해준 것도 인상적이었습니다.
곤란했던 순간 ①: BOM이 들어오면서 구조가 흔들렸습니다
2-테이블 구조로 깔끔하게 정리됐다고 생각했는데, BOM(Bill of Materials) 기능이 추가되면서 관계가 복잡해졌습니다. 완제품 → 반제품 → 원자재로 이어지는 다층 구조를 기존 테이블에 넣을 수도 없고, 별도 테이블로 뺐더니 관계 설정이 까다로웠습니다.
Claude와 함께 결론 낸 것은 tbl_BOM을 추가하되, 부모-자식 관계를 한 테이블 안에서 Self-Join으로 표현하는 방식이었습니다:
-- tbl_BOM: 다층 BOM (부모-자식 관계, Self-Join으로 재귀 전개)
CREATE TABLE tbl_BOM (
BOM_ID AUTOINCREMENT PRIMARY KEY,
부모품번 TEXT(50) NOT NULL, -- IX: 완제품 또는 반제품
부모품목구분 TEXT(20) NOT NULL, -- '완제품' / '반제품'
자식품번 TEXT(50) NOT NULL, -- IX: 반제품 또는 원자재
자식품목구분 TEXT(20) NOT NULL, -- '반제품' / '원자재'
소요량 DOUBLE NOT NULL DEFAULT 1,
단위 TEXT(10) NOT NULL DEFAULT 'EA',
손실율 DOUBLE DEFAULT 0 -- 가공 중 손실률(%)
);
#NAME?
CREATE UNIQUE INDEX IX_BOM_복합 ON tbl_BOM (부모품번, 자식품번);
#NAME?
-- SELECT * FROM tbl_BOM WHERE 부모품번 = 'TDM-A001';
-- → BOM_ID=1: 부모=TDM-A001(완제품), 자식=SF-B002(반제품), 소요량=1
-- → BOM_ID=4: 부모=SF-B002(반제품), 자식=RM-C010(원자재), 소요량=1.2, 손실율=5
-- VBA ExpandBOM() 함수로 재귀 전개하면 Ti Bar 유효소요량 = 1.26EA
곤란했던 순간 ②: Access는 재귀 쿼리(CTE)를 지원하지 않습니다
BOM 전체 전개를 SQL로 구현하려고 했더니 벽에 부딪혔습니다. 일반 DB라면 CTE로 재귀 쿼리를 짜면 되는데, Access는 CTE를 지원하지 않습니다. 이걸 설계가 상당히 진행된 뒤에 알았을 때 당혹스러웠습니다.
Claude가 제안한 해결책은 VBA 재귀 함수였습니다. SQL 한 줄로 해결되길 기대했지만, 결과적으로는 더 유연한 구조가 됐습니다.
여기서도 고유 지식의 중요성을 느꼈습니다. Claude가 Access의 CTE 미지원을 처음부터 먼저 알려주진 않았습니다. DB 기본 개념을 어느 정도 알고 있었기에 문제를 인식하고 대화를 이어갈 수 있었습니다. AI와 협업 설계는 내가 질문할 줄 알아야 제대로 됩니다.
결과와 배운 점
결과물:
최종 DB 구조는 4-테이블로 확장 완성됐습니다:
tbl_생산의뢰: 46컬럼 /tbl_작업지시: 36컬럼tbl_BOM: 13컬럼 (다층 BOM, Self-Join 재귀 전개)tbl_가공팀마스터: 4컬럼, 9레코드 (가공1,2 + 외주3~9)
인덱스 26개, 관계 4개, ER 다이어그램, SQL 스크립트 전체 완성. 다음 단계는 실제 Access 파일 생성 → Dropbox 배포 → 현장 적용이고, 이번 경험을 바탕으로 구매/품질/재고 자동화도 계획 중입니다.
배운 점:
"몇 개 테이블?"보다 "어떤 기준으로 묶을 것인가?"가 핵심입니다. 핵심 식별자를 기준으로 통합하는 아이디어를 이해하고 수용하려면 업무 로직을 본인이 알고 있어야 합니다.
도구의 한계를 미리 파악해야 합니다. 설계 초기에 "Access로 재귀 BOM 전개 시 주의사항이 있어?"라고 먼저 물어봤다면 더 빨리 해결됐을 겁니다.
비개발자도 사내 DB 시스템 설계가 가능합니다. 단, AI와의 파트너십이 핵심입니다. 딸깍 한 번으로 완성되는 마법은 없습니다.