- 계층형 UI가 필요해 보여도 먼저 확인할 것은 데이터가 정말 부모-자식 관계를 가져야 하는지, 아니면 그렇게 보이기만 하면 되는지임
- 실제 트리가 필요 없다면 부모 ID 대신 전체 목록의 절대 정렬 순서와
indent값만으로 화면상의 구조를 표현할 수 있음 - Hiss 게임 에디터는
banana.eat같은 이름을 정렬한 뒤 점(.) 뒤를 들여써 보여주며 네임스페이스처럼 보이는 UI를 만듦 - 이 방식은 사용자가 항목을 위아래로 옮기고 들여쓰기/내어쓰기를 하는 워드프로세서식 편집에 가까워 트리 자료구조 부담을 줄임
- 항목 간 관계를 실제로 조회하거나 유지해야 한다면 들여쓰기나 문자열 기호 해킹 대신 진짜 트리 모델이 필요함
트리가 아니라 트리처럼 보이는 목록
- 애플리케이션에서
Foo,Bar같은 동적 목록을 트리 뷰로 보여주려 하면 보통 각 항목에 부모 항목을 연결하는 구조를 떠올리게 됨 - 관계형 데이터베이스에서는 예를 들어
parent컬럼으로 부모 ID를 저장할 수 있음Foo의parent는nullFoo 1의parent는FooFoo 1.a의parent는Foo 1
- 이런 트리 데이터를 SQL로 가져오려면 재귀 CTE 같은 방식이 필요할 수 있음
- 하지만 많은 목록에서는 실제 관계보다 사람이 보기 좋게 정리된 모양이 더 중요할 수 있음
들여쓰기 값을 데이터로 저장하는 방식
- 실제 부모-자식 관계가 필요 없다면 목록을 다음 필드만으로 저장할 수 있음
idsortindentname
sort는 하위 항목 내부 순서가 아니라 전체 목록의 절대 순서를 나타냄indent는 항목 앞에 넣을 공간의 양을 그대로 나타내므로 화면 렌더링이 단순해짐- 편집 UI도 트리 조작보다 단순해질 수 있음
- 사용자는 항목을 위아래로 이동할 수 있음
- 항목을 들여쓰기하거나 내어쓸 수 있음
- 필요하면 올바른 들여쓰기를 강제하는 간단한 규칙을 추가할 수 있음
- 결과적으로 컴퓨터과학 교과서식 자료구조를 직접 조작하기보다, 워드프로세서에서 목록을 편집하는 경험에 가까워짐
Hiss의 점(.) 기반 가짜 네임스페이스
- 텍스트 어드벤처 게임 에디터 Hiss는
banana,banana.eat,banana.peel같은 이름을 UI에서 계층처럼 보여줌 - HissScript에 실제 네임스페이스 기능을 구현한 것은 아님
- 구현 방식은 단순함
- 객체 이름을 알파벳순으로 정렬함
- 이름에 점(
.)이 있으면 앞부분을 잘라냄 - 남은 부분을 들여써서 출력함
- 예시 코드의 핵심 로직도 같은 흐름임
things.keys를 정렬함- 각 이름에 점이 있으면 들여쓰기 후 점 앞부분을 제거해 출력함
- 점이 없으면 이름을 그대로 출력함
- 이후 주어진 접두사를 가진 “부모” 항목이 존재하는지 확인하는 검사가 몇 줄 더 추가됨
- 임의 깊이의 중첩도 추가할 수 있지만, 실제 필요가 생길 때까지 기다리는 상태임
- 이 네임스페이스처럼 보이는 UI는 게임을 정리하는 사람에게는 중요하지만, 게임 에디터와 플레이어에게는 특별한 의미가 없음
- 점이 들어간 이름도 그냥 이름임
- 네임스페이스처럼 보이는 부분은 이름을 유일하게 유지하는 역할만 함
평면 목록으로 다루는 트리 비슷한 사례
- Dave Long은 “저기술 실제 트리”로 경로와 정보를 평면 목록에 저장하는 방식을 제안함
- 이는
banana.eat예시와 비슷한 통찰임 find출력처럼 다음 형태의 경로 목록을 생각할 수 있음./foo/zonk./foo/bonk./bar/boop/bop./bar/boop/bleep
- 깊이 우선 순회가 필요하면 경로를 사전순 정렬하면 됨
- 너비 우선 순회가 필요하면 경로 구분자를 기준으로 경로를 뒤집고, 깊이를 맞추기 위해 빈 항목을 추가한 뒤 정렬할 수 있음
- 이 예시는 개념을 보여주기 위한 것이며, 실제로는 구분자로 줄을 나눈 뒤 배열로 처리하는 방식이 자연스러움
- 평면 목록은 전반적으로 다루기 좋고, 가능하면 항목을 plain old lists에 넣는 접근을 선호함
바닥 위 스크랩북 비유
- 개인 스크랩북 작업에서는 사진, 메모, 엽서, 티켓 등을 바닥에 늘어놓고 그룹을 만들 수 있음
- 사람에게는 그룹 관계가 분명해 보여도, 바닥 자체에는 그 관계를 강제하는 물리적 장치가 없음
- 이 비유의 핵심은 표현된 관계와 실제 구조적 관계가 다를 수 있다는 점임
- UI 목록도 마찬가지로, 사람에게 계층처럼 보이는 배치가 내부 데이터 모델의 실제 계층을 의미하지 않을 수 있음
실제 트리가 필요한 경우
- 들여쓰기나 문자열 기호 기반 방식은 상황에 맞게 크게 조정해야 하며, 일반적인 프로그래밍 맥락에서는 해킹으로 취급될 가능성이 있음
- 실제로 항목 간 관계를 알아야 한다면 부모 ID, 부모-자식 조인 테이블 등 데이터 모델에 맞는 진짜 트리 구조를 사용해야 함
- 대규모 연구 프로젝트를 분류하는 상황처럼 물리적 파일 캐비닛과 폴더 수준의 조직력이 필요하다면 “바닥 방식”은 적합하지 않음
- 항목 간 관계를 나중에 실제로 알아야 하는 프로젝트에서 들여쓰기나 문자열 안의 기호 개수로 구조를 흉내 내면, 프로젝트 수명과 유지보수 기간 내내 고통스러운 경로가 될 수 있음