래퍼 하나, 문서 셋
공개 보관함이 할 일 템플릿만 공유하던 시절을 지나, 메모 템플릿과 준비물까지 담게 된 하루. 좋은 래퍼는 확장을 설계가 아니라 나열로 만든다.
래퍼 하나, 문서 셋
Fecit의 커뮤니티에는 공개 보관함(Public Library)이 있습니다. 내가 만든 할 일 템플릿을 공유 글로 감싸 올리면, 다른 사람이 미리 보고 가져갈 수 있는 곳입니다. 오늘은 이 보관함의 문을 넓혔습니다. 할 일 템플릿만 들어가던 자리에 메모 템플릿과 준비물 카탈로그 항목도 들어갈 수 있게요.
오버뷰는 원래부터 래퍼였다
공유 글의 내부 이름은 오버뷰(Overview)입니다. 구조를 다시 들여다보니, 이 설계가 처음부터 래퍼였다는 점이 오늘 작업의 출발점이자 지름길이었습니다.
오버뷰를 만들면 내 템플릿이 그대로 연결되는 게 아닙니다. 공개용 사본을 하나 복제하고, 오버뷰는 그 사본을 가리킵니다. 원본은 내 서랍에 그대로 남아 이후 편집과 무관하게 살아가고, 공유 글을 지우면 사본도 함께 사라집니다. 가져가기는 그 공개 사본을 다시 받는 사람의 것으로 복제하는 일이고요.
이 모양이 좋은 이유는, 확장할 때 드러납니다. 메모 템플릿을 담고 싶으면? 같은 문법을 한 번 더 쓰면 됩니다. 메모에는 이미 길드 기부에서 쓰던 복제 루틴이 있었고, 거기에 “사본의 공개 범위”라는 매개변수 하나를 더하니 오버뷰용 공개 사본이 나왔습니다. 다운로드도, 삭제도, 기존 태스크 경로와 나란히 놓입니다.
문서가 아닌 것을 담을 때
준비물 카탈로그는 이야기가 달랐습니다. 캠핑 장비 같은 준비물 항목은 문서가 아니라 보관함 속 물건이라, 공개 범위라는 개념 자체가 없습니다. 사본을 만들어 보관함 컬렉션에 두면 그 사본이 주인의 보관함 화면에 그대로 나타나 버립니다.
그래서 여기서는 방식을 바꿨습니다. 사본 대신 스냅샷. 항목의 내용을 통째로 오버뷰 문서 안에 담아 버리는 겁니다. 별도의 문서가 없으니 공개 범위를 고민할 일이 없고, 미리보기는 오버뷰 응답에 이미 실려 있으니 추가 조회도 필요 없습니다. 가져가기는 스냅샷을 받는 사람 보관함의 같은 카테고리 맨 뒤에 추가하는 것으로 완성됩니다.
같은 “공유하기” 버튼 뒤에 두 개의 다른 기계장치가 돌게 된 셈인데, 이건 비일관성이 아니라 대상의 성질을 따른 결과입니다. 문서에는 문서의 방식이, 물건에는 물건의 방식이 맞습니다.
이름은 뭉치지 않기
종류를 노출할 때 한 가지 결정을 했습니다. 준비물을 “카탈로그”라는 한 단어로 뭉치지 않고, 재료·도구·장소·인력·증명이라는 세부 카테고리 그대로 보여주기로요. 공유하는 사람의 머릿속에는 “내 캠핑 장비 목록”이 있지 “내 카탈로그”가 있지 않으니까요.
정답은 세 번째 모양에서
종류가 일곱이 되니 탐색 UI가 필요했습니다. 처음엔 목록 위에 필터 칩을 한 줄 놓았습니다. 화면에 띄워 보니 제목 위에 칩이 두 줄로 쌓여 정작 글이 밀립니다. 다음엔 사이드바의 Public Library 항목 아래에 서브 행으로 접어 넣어 봤습니다. 이번엔 커뮤니티 섹션 목록과 종류 목록이 한 기둥에 섞입니다.
세 번째 모양이 자리를 잡았습니다. 종류 전용 사이드바를 하나 더 세우는 것. 템플릿 섹션(할 일·메모)과 보관함 섹션(준비물 다섯)으로 나뉘고, 폭은 드래그로 조절됩니다. 목록 아이템에서는 종류 배지를 뺐습니다. 바가 이미 “지금 무엇을 보고 있는지”를 말해주고 있으니, 아이템은 제목이 전폭을 쓰는 게 맞습니다.
이런 반복은 코드로는 알 수 없는 종류의 일입니다. 세 모양 모두 십 분이면 만들 수 있었고, 실제로 화면에 띄워 손으로 눌러 보고 나서야 어느 것이 맞는지 알 수 있었습니다.
오늘 배운 것
래퍼가 잘 설계되어 있으면, 확장은 새 설계가 아니라 종류를 하나 더 나열하는 일이 됩니다. 오늘의 서버 작업 대부분은 “태스크가 하던 것을 메모도 하게” 옮겨 적는 일이었고, 진짜 설계는 카탈로그처럼 성질이 다른 대상 앞에서만 필요했습니다. 그리고 그 설계조차, 대상의 성질을 존중하면 답이 스스로 좁혀집니다.