WIKI원룸 평면도
개인 제품·2026.09 ~ · 웹 배포·기획·개발 단독

원룸 평면도

도면 없는 원룸에 내 가구가 들어가고, 들어가서 살 수 있는지 따져 주는 2D 도구.

TypeScriptViteSVGWeb WorkerVitest

써 보기 · interior.saegim.studio

원룸 평면도는?

도면이 없는 원룸에 내 가구가 들어가는지, 들어가서 실제로 살 수 있는지를 따져 주는 2D 웹 도구다. 구조 템플릿을 고르고, 벽을 끌거나 숫자를 넣어 내 방에 맞춘 뒤 가구를 놓는다. 가구를 놓으면 옷장 문이 열리는지, 책상 앞에 의자 뺄 자리가 있는지, 현관에서 침대까지 60cm 통로로 걸어갈 수 있는지를 판정기가 알아서 잰다.

궁극 기능은 자동 배치다. 가진 가구 목록을 넣으면 판정을 통과하는 배치안 셋을 근거와 함께 낸다.

Vite 7 + TypeScript, 프레임워크와 런타임 의존성 없이 DOM과 SVG로 그린다. 아직 AI는 붙어 있지 않다. 일부러 그 순서로 가고 있다.

왜 만들었나

원룸을 알아보던 중에 나온 생각이다. 아파트는 평형 도면이 공개돼 있고, 오늘의집 3D 인테리어·Floorplanner·Planner 5D 같은 도구는 치수를 이미 아는 사람을 전제로 한다. 계약 전 원룸·빌라 세입자는 도면도 실측도 없다. 집을 보러 간 짧은 시간 안에 "내 침대와 옷장이 여기 들어가나"를 판단해야 한다.

그래서 처음부터 두 가지를 정했다.

  • 벽을 그리게 하지 않는다. 오픈형·분리형·1.5룸·복층·투룸 같은 구조 템플릿(21종)을 고르고, 벽을 눌러 숫자를 넣거나 벽 가운데 손잡이를 끈다. 모르는 벽은 추정으로 남기고 "재야 할 곳" 목록을 낸다.
  • 2D가 먼저, 3D는 그 뒤. "들어가나"와 "지나갈 수 있나"는 위에서 내려다보는 그림이 가장 잘 답한다.

나중에 시장을 다시 봤다(2026-10-02). 오늘의집 3D 인테리어는 아파트 도면을 대량으로 갖고 있어서, 아파트에서는 "방을 입력하는" 가장 큰 고생을 이미 풀어 두었다. 1인칭 걷기나 문 열림 간격 검사처럼 차별점이라고 여긴 기능도 RoomSketch3D 같은 기존 제품에 이미 있었다. 그래서 정면으로 겨루지 않고 자리를 좁혔다. 도면 없는 원룸·빌라·오피스텔, 그리고 꾸미기가 아니라 검사다.

순서: 인벤토리, 판정기, 자동 배치, 그다음 AI

1. 내 가구 목록
놓인 가구와 아직 안 놓은 가구를 한 목록으로. 종류와 앞면 방향을 가진다
2. 판정기
앞 공간, 문 열림, 문 앞, 창 앞, 현관에서 60cm 통로
3. 자동 배치
판정을 통과한 자리만 후보로. 배치안 셋과 근거
4. AI
취향을 점수로 옮기기, 배치안 설명, 사진에서 도면 초안. 아직 안 함

"들어가나"는 계산이 판정한다. 언어 모델에 맡기지 않는다. 공간 계산이 한 번 틀리면 도구 전체를 못 믿게 된다. 옷장 문이 걸리는지는 사분원 하나와 네모 하나의 교차로 정확히 답이 나오는 문제라, 확률로 답하는 모델에게 넘길 이유가 없다. AI 몫은 계산이 못 하는 쪽으로 따로 떼어 두었다. "창가에 책상이 있었으면" 같은 말을 점수 조건으로 바꾸는 것, 배치안을 사람 말로 설명하는 것, 방 사진에서 도면 초안을 뜨는 것이다.

21
구조 템플릿
0
런타임 의존성
319
시험 (2026-10-06)
60cm
통로 최소 폭

구조

geometry
평면도 계산 전부. 문 사분원, 가구 방향, 벽 자석. DOM 없음
rules · reach · grid
판정기 checkPlan 한 곳. 통로는 5cm 격자 + 거리 변환 + BFS
layout · autoLayout
후보 거르기 → 점수 → 판정기로 확인. 빔 서치로 배치안 셋
store · view
도면 경고, 걸린 곳 목록, 카드 문장이 같은 판정 결과 하나를 본다

계산은 전부 화면과 떨어진 순수 모듈이다. React를 들이지 않은 것도 그래서다. 처음에 단일 HTML 파일로 만든 시안을 옮길 때, 옛 파일을 legacy/에 그대로 두고 옛 코드와 계산이 같은지 대조하는 시험을 걸어 놓고 옮겼다. 템플릿 21종은 옛 데이터와 글자 하나까지 같아야 통과한다.

구조 템플릿 고르고 벽 치수만 맞추기
내 가구 목록 (놓인 것 / 안 놓은 것 / 안 들어감)
앞 공간·문 열림·문 앞·창 앞·통로 판정
걸린 곳을 도면 위에 그리고 문장으로 설명
가구 하나 자리 찾기, 여러 가구 자동 배치
배치 근거와 아쉬운 점, 취향 세 줄
가구 고정, 파일로 저장·열기

판정기

가구 종류마다 앞 공간이 있다. 책상은 앞 70cm, 옷장은 여닫이 문짝 때문에 앞 55cm, 침대는 좌우 중 한쪽 50cm. 값은 계획서와 화면 설계 두 문서가 서로 다르게 잡은 것 중 작은 쪽으로 정했다. 경고가 너무 많으면 사람이 경고를 안 읽는다.

판정에는 두 단계가 있다. 오류는 실제로 안 들어가는 것(벽 밖, 겹침, 문짝에 걸림, 통로 끊김)이고 경고는 불편한 것이다. 창 앞에 키 큰 가구를 두는 것은 처음에 오류였다가 경고로 내렸다. 창이 가려지는 건 불편이지 못 사는 게 아니다.

통로는 5cm 눈금 위 점으로 잰다

현관에서 모든 문·가구 앞까지 60cm 폭으로 걸어갈 수 있는지를 본다. 바닥을 5cm 격자로 나누고, 장애물에서 각 점까지의 거리를 구한 뒤(유클리드 거리 변환), 통로 반 폭 30cm 이상 떨어진 점만 이어서 BFS로 닿는 곳을 센다.

처음 계획은 칸의 가운데를 점으로 쓰는 것이었는데, 그러면 55cm 복도와 60cm 복도의 최대 거리가 둘 다 30으로 나와서 둘을 구별하지 못한다. 칸 가운데가 아니라 5cm 눈금 위 점을 쓰면 벽과 가구 변 위에 막힌 점이 정확히 놓여서 55는 25, 60은 30이 나온다. 그래서 55cm 복도는 막히고 60cm 복도와 70cm 문은 지나간다. 못 닿으면 좁은 곳으로라도 이어지는지 한 번 더 찾아서 "통로 좁음 45/60"처럼 가장 좁은 곳의 폭을 말한다.

판정은 원룸에서 0.5ms 안팎, 34평 아파트 템플릿에서 2ms 안팎이다.

Decision #01트인 원룸은 한 공간으로 본다

거실과 주방이 벽 없이 이어진 원룸에서 가구 앞 공간이 "0cm"라는 오경고가 났다. 앞 공간이 공간 경계를 넘는 순간 막혔다고 본 것이다. 뚫린 곳으로 이어진 이웃 공간까지 한 공간으로 보게 바꿨다. 문과 슬라이딩 문은 닫혀 있을 수 있으니 벽으로 남긴다.

자동 배치

가구 하나의 자리는 5cm 눈금마다 네 방향으로 후보를 만들고, 누적합 표로 수만 개를 먼저 거른 뒤 점수로 줄을 세운다. 여러 가구는 그 위에 빔 서치를 얹는다. 큰 가구부터 놓아 가며 갈래를 여덟 개씩 남기고, 이전 안과 비슷한 안에는 벌점을 줘서 서로 다른 배치안 셋을 낸다. 같은 씨앗이면 결과가 같다.

Decision #02후보는 판정기를 통과해야 내놓는다

빠른 거르기는 근사일 뿐이다. 최종 후보는 그 가구를 실제로 놓은 문서로 판정기를 한 번 더 돌려서, 놓기 전에 없던 오류가 하나도 생기지 않을 때만 받는다. 판정을 배치 쪽에서 새로 짜지 않는다. 자동 배치가 내놓은 안을 적용하면 새 오류가 0이어야 한다는 것을 시험이 막고 있다.

Decision #03걷는 거리 벌점을 버리고 우회 비율로

처음엔 현관에서 가구 앞까지 걷는 거리에 cm당 벌점을 매겼다. 그랬더니 분리형 원룸에서 책상이 방 창 밑 좋은 자리를 버리고 현관 쪽 공간으로 끌려 나왔다. 거리 벌점은 모든 가구를 현관 쪽으로 당긴다.

그래서 거리 자체는 점수에서 뺐다. 대신 곧장 갈 때보다 얼마나 돌아가야 하는지의 비율만 보고, 1.2배를 넘은 만큼만 깎는다. 막힌 것이 없으면 방 안쪽 깊은 자리도 비율이 1이라 당기는 힘이 없다. "곧장"도 가로·세로 거리로 잰다. 격자 BFS가 가로세로로만 걷기 때문에, 직선 거리와 견주면 아무것도 안 막힌 대각선이 1.41배 돌아가는 것처럼 보인다.

왜 그 자리인지 말한다

배치 근거는 판정을 새로 하지 않는다. 점수를 매길 때 항목마다 이미 문장이 붙어 있어서("등이 벽에 붙음", "창 옆 책상") 그 문장을 그대로 보인다. 벌점 항목은 "아쉬운 점"으로 따로 뗐다. 섞으면 "문 앞을 지남"이 그 자리를 고른 이유처럼 읽힌다. 점수 숫자는 보이지 않는다. 계산이 놓은 가구를 사람이 끌거나 돌리면 그 자리가 아니므로 근거도 사라진다.

취향은 세 줄이다. 책상을 창 옆에 둘지 창을 마주 보게 둘지, 침대를 벽에 붙일지 가운데 둘지, 가구를 많이 넣을지 넓게 쓸지. 점수 표는 한 곳에 두고 취향은 가중치만 바꾼다.

계산이 원룸 가구 넷에 0.3초, 34평에서 1초 남짓 걸려서 자동 배치는 Web Worker에서 돈다. 워커가 죽거나 10초 안에 답이 없으면 화면에서 다시 계산한다.

Decision #04안 놓은 가구를 누르면 고르게 하지 않고 바로 놓는다

목록에서 안 놓은 가구를 누르면 후보 넷을 보여 주고 고르게 하는 대신, 가장 점수가 높은 자리에 바로 놓는다. 다른 자리는 카드의 "다른 자리 보기"로 본다. 한 번 후보 고르기로 되돌려졌다가 다시 확인받은 결정이라 계획서와 화면 설계 양쪽에 박아 두었다.

걸린 것

  • 사람이 그려 둔 방을 잃으면 끝이다. 저장 형식이 v3까지 올라오는 동안 키는 그대로 두고 이관 단계를 더했다. 못 읽는 저장본은 덮어쓰기 전에 백업 키로 옮긴다. 옛 저장본의 가구에는 앞면 방향이 없어서 추정으로 채우는데, 틀릴 수 있으니 경고로 표시하고 확인을 받는다.
  • 에어컨은 두 가지로 나눴다. 벽걸이는 문·창처럼 벽을 따라 움직이지만 통로나 앞 공간이 구멍으로 보지 않게 벽은 막아 둔다. 천장형은 바닥을 차지하지 않으니 가구 목록에 넣지 않았다. 겹침·통로·목록 규칙 전부에서 빼야 하는 물건이라서다.
  • 자동 배치 버튼이 화면에서 숨어 있었다. 핵심 기능이 안 보였다. 도면 위 도구 막대로 옮겨 늘 보이게 했다.
  • 배포본을 써 보니 가구 없이 자동 배치를 누르면 안내만 뜨고 다음 행동으로 안 이어지고, 폰에서는 입력란과 평면도가 떨어져 함께 안 보인다. 아직 못 고쳤다.

지금 상태와 남은 것

interior.saegim.studio에 배포돼 있다. 내 가구 목록, 판정기, 자리 찾기, 자동 배치까지 계획한 아홉 단계는 끝났다(2026-10-01). 가구 고정이 그 뒤에 붙었다.

정직하게 적으면 이렇다.

  • 화면은 아직 사용자 검증 전이다. 계산은 시험으로 막혀 있지만, 쓰는 사람이 편한지는 모른다.
  • 점수 가중치가 사람 취향과 맞는지 모른다. "들어가나"는 계산으로 보증하지만 "어디가 좋은가"는 가설이다. 지금은 취향 세 줄과 배치안 셋으로 덮고 있을 뿐이다.
  • 진행 중: 메인 화면을 새 시안에 맞춰 다시 짜고 있다(세 칸 배치, 카드, 글꼴). 아직 반영 전이다.
  • 미결: 문 열리는 반대쪽 앞 띠를 강제할지, 소파와 TV를 짝으로 묶을지, 의자를 책상에 딸린 가구로 볼지.

다음은 확인이다. 내 집을 오늘의집과 이 도구에서 각각 만들어 걸린 시간과 막힌 곳을 비교하고, 도면 없는 집에 사는 지인 몇 명에게 써 보게 한다. AI 연결, 3D 1인칭 걷기, 수익 모델은 그 결과를 보고 고른다.