줄자를 든 반나절에서 시작했다 — 이사 가구배치 앱을 만든 이유
nestly는 이사 전에 내 가구를 새집에 배치해 보는 사이드 프로젝트다. 출발점은 방을 예쁘게 보여 주는 기능보다, 한 번 잰 공간과 가구의 치수를 다시 쓸 수 있게 만드는 것이었다. 이 글에서는 그 문제를 제품 요구로 좁힌 이유와 초기 구상이 실제 구현에서 달라진 부분을 다룬다.
줄자를 든 손
시작은 부모님의 이사였다. 이사 한 달 전, 나는 줄자를 들고 이사 갈 빈집에 들어갔다. 벽과 방을 재고 문이 열리는 반경을 눈으로 가늠했다. 그러고는 휴대폰으로 우리 집 냉장고의 크기를 검색하고 종이에 숫자를 적었다. 가구가 벽 안쪽에 놓일지 계산하는 동안 줄자와 검색창과 종이 사이를 몇 번씩 오갔다.
반나절을 들였지만 측정한 내용을 다음 배치에 다시 쓰기는 어려웠다. 방의 치수와 가구의 치수, 어디에 놓을 수 있다는 판단이 종이 메모와 머릿속에 흩어져 있었다. 다른 방을 검토할 때는 그 숫자부터 다시 찾아야 했다.
평면도와 가구를 데이터로 남기면 이 계산을 줄일 수 있다고 생각했다. 가구에 이름과 치수를 저장하고, 새집의 공간 데이터 위에 같은 가구를 옮겨 보는 방식이다. 측정 자체를 없애지는 못해도 한 번 확인한 치수를 여러 배치 후보에 재사용할 수 있다.

입력 이미지를 설명하기 위한 합성 평면도다. 실제 사용자 집의 도면이나 VLM 인식 결과, 좌표 추출의 정확도를 입증하는 자료는 아니다.
기존 도구와 비교하며 범위를 좁혔다
인테리어 도구가 없는 시장은 아니었다. 아키스케치는 평면도와 상품 카탈로그를 활용한 3D 공간 설계·렌더링을 제공한다. RoomGPT는 방 사진을 바탕으로 다른 인테리어 모습을 생성하는 데 초점을 둔다. 각각 공간을 구성하거나 완성된 모습을 탐색하는 데 쓸 수 있다. (아키스케치 제품 소개, RoomGPT)
내가 우선 해결하려던 질문은 “내가 가진 이 냉장고를 저 벽에 놓을 수 있는가”였다. 이를 계산하려면 가구의 실제 치수와 방의 기준 길이가 필요하다. 보기 좋은 생성 이미지가 나왔다는 사실만으로 그 치수가 검증되지는 않는다. 반대로 3D 편집 도구를 쓴다고 내 가구를 다룰 수 없다고 단정할 이유도 없다. nestly에서는 직접 확인한 치수를 저장하고 다시 배치하는 흐름에 개발 범위를 집중하기로 했다.
첫 대상 사용자는 전월세에 사는 1인 가구로 정했다. 이사할 때 기존 가구를 가져가고, 벽 고정이나 붙박이 시설 때문에 배치에 제약을 받을 수 있는 사용자다. 치수 재사용이 이들에게 유용할 것이라는 가설을 세웠지만, 다른 집단보다 효과가 크다는 사용자 조사 결과를 확보한 것은 아니었다.
그 가설에서 네 가지 우선순위를 정했다.
- 내 가구의 치수 보관: 가지고 있는 가구를 직접 등록하고 다음 집에서도 불러온다.
- 이사 전 배치 검토: 가구가 공간 안에 놓이는지와 필요한 여유 공간을 먼저 확인한다.
- 설치 제약 표시: 붙박이 시설이나 벽 고정처럼 사용자가 따로 확인해야 할 조건을 드러낸다.
- 조작 범위 축소: 복잡한 3D 편집보다 입력과 배치 확인에 필요한 조작부터 제공한다.
초기에는 네 번째 항목을 AI가 배치안을 제시하는 방식으로 풀려고 했다. 이후 구현은 사용자가 가구를 옮기고 회전시키는 2D 편집기 중심으로 바뀌었다. 3D 편집을 제외해도 수동 조작은 필요했고, 사용법을 익히는 부담이 완전히 사라지는 것도 아니었다. 혼자 구현할 범위를 줄이면서도 사용자가 치수와 위치를 고칠 수 있게 남긴 선택이다.
인식·배치·판정의 역할을 나눈다
치수를 재사용하려면 공간 입력, 가구 등록, 배치 후보 작성, 판정이 이어져야 한다. 판정기는 후보의 위치와 크기를 받아 검사한다. 판정 결과만으로 새 배치안을 만드는 것은 별도 문제다.
첫째, 공간을 입력한다. 평면도 이미지에서 방·문·창 등의 정보를 읽기 위해 시각·언어 모델(Vision-Language Model, VLM)을 선택했다. 여기서 zero-shot은 학습하지 않은 모델이라는 뜻이 아니다. 사전 학습된 모델을 가져와 프로젝트 전용 라벨링 데이터나 추가 학습 없이 인식을 시도한다는 뜻이다. 직접 치수를 입력하거나 정형 도면을 쓰는 대안도 있지만, 사진 형태의 입력을 다루는 경로로 VLM을 택했다.
이미지를 읽었다고 실제 길이를 곧바로 알 수 있는 것은 아니다. 치수 표기나 기준 길이로 축척을 정하고 인식한 형상을 확인해야 한다. 문이 빠지거나 벽의 위치를 잘못 읽으면 이후 계산도 그 잘못된 입력을 따른다. 따라서 인식 결과를 수정하고 치수를 확인하는 과정까지 필요하다.
둘째, 가구를 치수 데이터로 등록한다. “우리 집 냉장고”를 검색 결과로만 남기지 않고 배치에 필요한 크기와 함께 저장한다. 가구를 바꾸거나 실제 크기를 다시 확인했을 때는 저장한 정보도 수정해야 한다. 재사용할 대상은 확인 가능한 치수 데이터다.
셋째, 배치 후보를 기하 규칙으로 검사한다. 현재 구현에서는 2D 편집기의 위치·회전 정보와 공간 경계, 문·창, 가구의 점유 영역과 여유 공간을 입력받아 겹침이나 경계 이탈을 계산한다. 같은 입력과 규칙에 같은 결과를 내는 결정론적 계산이다. 초기 구현에서 언어 모델이 생성하던 배치 설명과 이 계산 결과는 구분해서 다뤄야 한다.
반복 가능한 계산이 보장하는 범위
결정론은 현실에서 반드시 들어간다는 보장이 아니다. 방 너비를 실제보다 크게 입력하면 계산상 들어가는 가구도 현장에서는 맞지 않을 수 있다. 현재 판정기에서도 공간 치수의 신뢰도와 배치 등급은 별도로 나온다. 공간이 추정 상태여도 입력된 좌표에서 충돌이 없으면 초록 등급이 나올 수 있으므로 등급만 읽어서는 안 된다.
계산에 포함한 형상에도 한계가 있다. 현재 구현은 2D 점유 영역을 사용하며 직각이 아닌 회전은 이를 둘러싸는 사각형으로 근사한다. 이 때문에 실제로 떨어져 있는 물체도 겹친 것으로 판단할 수 있다. 높이, 운반 중 통과할 복도·계단, 현장 설치 조건까지 모두 검증하는 계산도 아니다. 벽 고정 관련 표시 역시 실제 시공 가능 여부나 임대차 조건을 확정하지 않는다.
초기 구현과 현재 상태도 구분할 필요가 있다. 초기 백엔드에는 언어 모델이 배치 설명을 생성하고 다른 모델 호출로 검토하는 흐름이 있었다. 그 검토는 기하 계산이 아니었으며, 이미지 생성은 임시 결과를 반환하는 대체 구현이었다. 이 코드들은 2026년 7월 24일에 제거됐다. 검수 시점인 9월 22일에는 평면도 인식, 2D 수동 배치, 프런트엔드 기하 판정이 남아 있다. 초기 AI 제안 흐름과 현재 판정기를 하나의 완성된 파이프라인처럼 설명해서는 안 된다.
이번 검수에서는 현재 판정 코드의 복사본으로 관련 기존 테스트 276개와 입력·판정 범위를 확인하는 테스트 8개를 실행했다. 공간 너비만 바꿔도 결과가 달라지고, 기록하지 않은 장애물은 판정에 반영되지 않는 것을 확인했다. 이는 계산 동작을 확인한 결과이며 실제 평면도 인식 정확도나 이사 현장의 적합성을 측정한 결과는 아니다.
첫 학습: 재사용할 데이터와 확인할 조건
이 프로젝트에서 먼저 정한 것은 측정 결과를 다시 쓸 수 있게 하겠다는 목적이었다. 그 목적은 유지됐지만 AI 배치 제안에서 2D 수동 편집으로 구현 방식은 바뀌었다. 문제 정의가 모든 기술 선택을 미리 결정해 주지는 않았다.
남은 설계 기준은 구체적이다. 공간과 가구의 치수를 저장하고, 사용자가 확인·수정할 수 있게 하며, 판정 결과 옆에 입력의 신뢰도와 계산 범위를 드러내는 것이다. 다음 편에서는 이 요구를 서비스 경계와 기술 스택으로 옮기며 무엇을 채택하고 제외했는지 다룬다.