2026년 10월 27일 · @martin
나무를 깎다 보면 결국 숫자 이야기로 돌아오게 된다. 이 글은 CNC로 우리 집 문패를 깎은 이야기에서 출발해, 그 경험이 공방용 견적 SaaS인 AILign으로 이어진 과정을 정리한 기록이다.
낮에는 다락방에서 CodeIgniter 4로 SaaS를 만들고, 손이 근질거리면 공방으로 내려가 나무를 만진다. 26년 동안 PHP 코드를 깎아 온 손이 요즘은 엔드밀로 나무도 깎는다. 두 가지 일이 전혀 다른 것 같지만, 해 보면 묘하게 닮았다. 설계하고, 경로를 짜고, 실행하고, 결과를 보고 다시 고친다.
미단재(渼旦齋) 문패를 CNC로 깎기까지
우리 집 이름은 미단재다. 내 호 관미에서 '미(渼, 물결)', 아내의 호 현단에서 '단(旦, 아침)'을 따고 서재를 뜻하는 '재(齋)'를 붙였다. 원래 문패는 나무에 인두로 글씨를 지져 손으로 만든 것이었다.
이걸 CNC로 다시 깎기로 하면서 일은 사실상 '디지털 서체 작업'이 됐다.
- 인두로 지진 원래 문패 사진에서 글씨 획만 추출해 모티프로 삼았다.
- 전서체를 시도하다가 Big5 인코딩 예서체 폰트로 방향을 틀었다. 폰트에 '渼' 글리프가 없어서, '江'에서 물 수(氵) 변만 떼어내 '美'와 합성했다.
- 갈필, 거친 붓, 먹 농도까지 여러 번 질감을 바꿔 보고, '旦'은 다른 글자보다 0.82배로 줄여 균형을 맞췄다.
- 마지막으로 나무 배경과 질감을 걷어내고 CNC용 파일을 뽑았다. 속은 꽉 찬 검정, 가장자리는 붓 느낌 그대로인 실루엣이다.
최종 산출물은 50×23cm 실측 벡터 SVG(potrace로 변환), 300DPI 흰 배경 PNG, 투명 PNG 세 가지였다. 검정 영역이 음각·포켓 가공 영역이고, 양각으로 깎으려면 CAM에서 반전만 하면 된다.
이 작업에서 배운 건 하나다. CNC 목공의 절반은 기계 앞이 아니라 모니터 앞에서 일어난다. 그리고 그 시간은 작품 가격 어디에도 잘 드러나지 않는다.
"이거 얼마예요?"라는 질문
작품을 보여 주면 꼭 돌아오는 질문이 있다. "이런 거 하나 깎으려면 얼마예요?" 막상 답하려고 하면 막힌다. CNC 작업 한 건의 원가를 쪼개 보면 생각보다 항목이 많다.
|
구성 요소 |
무엇으로 정해지나 |
|---|---|
|
재료비 |
목재 종류(원목·집성목·MDF·자작합판) × 단가 × 사용량, 재단 손실률 포함 |
|
가공비 |
경로 길이·절삭 깊이·패스 수로 정해지는 가동 시간 × 시간당 단가 |
|
공구·소모품 |
엔드밀 마모, 샌딩 소모품 |
|
후가공 |
샌딩, 오일·도장 마감, 조립 |
|
디자인·데이터 작업 |
도면, 서체, 툴패스 준비 시간 |
|
마진·부가세 |
원가 합계 위에 얹는 몫 |
문제는 대부분의 공방이 이걸 감으로 계산한다는 점이다. 일부는 직접 만든 엑셀을 쓰지만 소수다. 감으로 내는 견적에서 빠지기 쉬운 건 늘 비슷하다. 재단 손실, 공구 마모, 그리고 문패 작업처럼 모니터 앞에서 보낸 시간이다. 바쁘게 일했는데 남는 게 없다면 대개 여기서 새고 있다.
견적 계산기가 아니라 견적서부터
그래서 만들기로 한 것이 AILign이다. 처음 머릿속에 있던 건 재료와 가공시간을 넣으면 가격이 뚝딱 나오는 '견적 계산기'였다. 그런데 시장을 들여다보니 순서가 달랐다.
감으로 견적을 내 온 사람은 지금 방식이 불편하다고 느끼지 않는다. 그런 사람에게 처음부터 단가표를 입력하라고 하면 그 자리에서 떠난다. 반면 견적을 내는 사람이라면 누구나 고객에게 '견적서'는 보내야 한다.
그래서 포지셔닝을 바꿨다. AILign의 첫 얼굴은 공방 견적서 발행 도구다.
- 자유 입력으로 견적서를 작성하고 PDF와 공유 링크로 보낸다.
- 고객이 열어 봤는지, 수락했는지 거절했는지 추적한다.
- 목표는 가입부터 첫 견적서 발행까지 10분 이내.
계산 엔진은 버리지 않았다. 쓰다 보면 "재료비는 자동으로 계산되면 좋겠다"는 요구가 자연스럽게 생긴다. 그때 하나씩 얹는 로드맵으로 돌렸다.
AILign은 이렇게 생겼다
AILign은 내 CI4 웹에이전시 보일러플레이트인 AICreo 위에, 기능 단위를 플러그인으로 얹는 플랫폼이다. 서버에는 한 벌만 설치하고(1카피 호스팅), 가입한 공방이 필요한 플러그인만 골라 구매·활성화한다. 라이선스 키도 도메인 바인딩도 필요 없다.

과금은 플러그인 성격에 맞춰 세 가지를 모두 쓴다. 견적서(Quote)는 입문 상품이라 일회성 구매, 단가 계산(Pricing)은 프리셋이 계속 업데이트되니 구독, AI 도면 견적(AiQuote)은 Claude API 호출 비용이 붙으니 크레딧이다.
개발자 입장에서 지키기로 한 규칙도 몇 가지 있다.
- 플러그인은
app/Plugins/{Name}/아래에서 완결되고, 서로 직접 호출하지 않는다. 통신은 CI4 Events로만 한다. - 플러그인 테이블은 전부
user_id스코프를 강제한다. 필터 누락은 보안 결함으로 취급한다. - 플러그인 라우트는 모두 EntitlementFilter 하나를 통과한다.
- 크레딧 차감은 DB 트랜잭션과 멱등 키로 묶는다.
- 구독이 끝나도 데이터는 잠그지 않고 읽기 전용으로 둔다. 공방의 견적 기록은 공방의 자산이니까.
이 규칙들은 클로드 코드용 CLAUDE.md에 그대로 적어 두고, TDD와 PHPStan 게이트를 거쳐 단계별로 쌓아 가고 있다.
작업자가 만든 견적 도구
AILign의 첫 고객은 나 자신이다. 내 공방 작업에 먼저 써 보면서(dogfooding) 문패 같은 작업이 실제로 얼마짜리였는지 기록해 볼 생각이다. "CNC를 직접 돌리는 사람이 만든 견적 도구"라는 말이 마케팅 문구가 아니라 사실이 되도록.
그다음은 목공·CNC 커뮤니티에서 베타 테스터 10곳을 모아 견적서 플러그인을 무료로 열어 드리려 한다. 그분들의 실제 견적 데이터가 쌓여야 단가 프리셋도, 가공시간 추정 엔진도 의미가 생긴다.
나무는 깎은 만큼 모양이 나오고, 견적은 기록한 만큼 정확해진다. 감으로 내던 견적을 조금씩 코드로 옮기는 일, 그게 지금 공방과 다락방을 오가며 하고 있는 일이다. 베타에 관심 있는 공방이 있다면 댓글로 알려 주시면 좋겠다.

댓글 0개