Python에서 트리뷰를 사용한 계층 데이터 표시 및 관리 방법에 대해 기초부터 응용까지 설명합니다. 트리뷰는 계층 데이터를 시각적으로 표시하기 위한 유력한 수단이며, 데이터 구조를 직관적으로 이해하기 쉽게 만듭니다. 본 기사에서는 Python에서의 트리뷰 구현 방법, 커스터마이징 방법, 구체적인 응용 예시, 그리고 이해를 돕기 위한 연습 문제를 소개합니다.
트리뷰의 기본 개념과 용도
트리뷰는 계층 데이터를 시각적으로 표시하기 위한 사용자 인터페이스 컴포넌트입니다. 디렉토리 구조, 조직도, 카테고리로 분류된 데이터 등 계층적인 데이터를 직관적으로 표시하는 데 적합합니다. 트리뷰를 사용하면 사용자가 데이터의 부모-자식 관계나 구조를 한눈에 이해할 수 있으며, 조작도 용이해집니다.
트리뷰의 구조
트리뷰는 노드(node)라는 요소로 구성됩니다. 각 노드는 부모 노드와 자식 노드를 가질 수 있으며, 이를 통해 트리 구조가 형성됩니다. 노드는 확장(expand)과 축소(collapse)가 가능하며, 필요에 따라 세부 정보를 표시할 수 있습니다.
트리뷰의 용도
트리뷰는 다음과 같은 상황에서 널리 사용됩니다:
파일 시스템의 탐색
운영 체제나 파일 관리자에서의 디렉토리 구조 표시.
데이터의 계층 표시
데이터베이스의 테이블 관계나 XML/JSON 데이터 구조 표시.
애플리케이션 내 탐색
IDE나 콘텐츠 관리 시스템에서의 프로젝트 구조나 메뉴 표시.
Python에서의 트리뷰 구현 방법
Python에서 트리뷰를 구현하기 위해서는 적절한 GUI 라이브러리를 사용하는 것이 필요합니다. 대표적인 라이브러리로 Tkinter가 있으며, 간단하면서도 강력한 트리뷰 컴포넌트를 제공합니다. 본 절에서는 Tkinter를 사용한 트리뷰의 기본 구현 절차를 소개합니다.
환경 준비
먼저 Python 환경에 Tkinter 라이브러리를 설치합니다. Tkinter는 표준 라이브러리의 일부로, 보통 추가 설치는 필요하지 않습니다.
기본적인 트리뷰 생성
다음으로, Tkinter를 사용하여 기본적인 트리뷰를 생성합니다. 아래 코드 예시는 간단한 트리뷰 생성 절차를 보여줍니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("트리뷰 예시")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 루트 노드 추가
root_node = tree.insert("", "end", text="Root Node")
# 자식 노드 추가
child_node1 = tree.insert(root_node, "end", text="Child Node 1")
child_node2 = tree.insert(root_node, "end", text="Child Node 2")
# 서브 자식 노드 추가
tree.insert(child_node1, "end", text="Sub Child Node 1")
tree.insert(child_node2, "end", text="Sub Child Node 2")
# 메인 루프 시작
root.mainloop()
코드 설명
위 코드는 다음 절차로 트리뷰를 생성합니다:
- Tkinter의 메인 윈도우를 생성.
ttk.Treeview
위젯을 생성하여 메인 윈도우에 배치.insert
메서드를 사용하여 루트 노드 및 자식 노드를 추가.root.mainloop()
으로 애플리케이션의 메인 루프를 시작하여 윈도우를 표시.
이 기본 구현을 바탕으로, 다음 섹션에서는 데이터 추가, 삭제, 그리고 커스터마이징 방법에 대해 자세히 다룹니다.
Tkinter를 이용한 트리뷰 생성
Tkinter는 Python의 표준 라이브러리로, 간단한 GUI 애플리케이션을 쉽게 만들 수 있습니다. 이 절에서는 Tkinter를 사용하여 트리뷰를 만들고, 기본적인 작업을 수행하는 방법을 설명합니다.
트리뷰의 기본 구조
Tkinter의 ttk.Treeview
위젯을 사용하여 트리뷰를 생성합니다. 아래에 기본적인 트리뷰 구조를 보여주는 코드 예시를 소개합니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("Tkinter 트리뷰 예시")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root, columns=("size", "modified"), show="headings")
tree.pack(expand=True, fill='both')
# 헤더 설정
tree.heading("size", text="Size")
tree.heading("modified", text="Modified")
# 샘플 데이터 추가
tree.insert("", "end", text="Folder 1", values=("2 KB", "01/01/2024"))
tree.insert("", "end", text="Folder 2", values=("4 KB", "01/02/2024"))
# 자식 노드 추가
folder1 = tree.insert("", "end", text="Folder 1")
tree.insert(folder1, "end", text="File 1", values=("1 KB", "01/01/2024"))
tree.insert(folder1, "end", text="File 2", values=("1 KB", "01/01/2024"))
# 메인 루프 시작
root.mainloop()
코드 설명
위 코드는 다음 절차로 트리뷰를 생성합니다:
- 메인 윈도우 생성: Tkinter의 메인 윈도우를 만들고 제목을 설정합니다.
- 트리뷰 위젯 생성:
ttk.Treeview
위젯을 만들고, 열을 정의합니다.show="headings"
로 헤더를 표시합니다. - 헤더 설정: 각 열의 헤더를 설정하여 열 이름과 표시 이름을 지정합니다.
- 샘플 데이터 추가:
insert
메서드를 사용하여 트리뷰에 데이터를 추가합니다. 폴더와 파일의 크기 및 최종 수정 날짜를 표시하도록 합니다. - 자식 노드 추가: 폴더 안에 파일을 추가하여 계층 구조를 만듭니다.
- 메인 루프 시작:
root.mainloop()
로 애플리케이션의 메인 루프를 시작하고 윈도우를 표시합니다.
이 기본적인 트리뷰 생성 방법을 바탕으로, 다음 절에서는 데이터 추가 및 삭제 방법에 대해 자세히 설명합니다.
데이터 추가 및 삭제 구현
트리뷰에 데이터를 추가하거나 삭제하는 작업은 데이터 관리와 업데이트에서 중요한 부분입니다. 이 절에서는 Tkinter를 사용하여 트리뷰에 데이터를 동적으로 추가하고 삭제하는 방법을 설명합니다.
데이터 추가
트리뷰에 새 데이터를 추가하려면 insert
메서드를 사용합니다. 다음은 새 노드를 추가하는 방법의 예입니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("트리뷰 데이터 추가")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 루트 노드 추가
root_node = tree.insert("", "end", text="Root Node")
# 데이터 추가용 함수
def add_data():
tree.insert(root_node, "end", text="New Child Node")
# 버튼 생성
add_button = tk.Button(root, text="데이터 추가", command=add_data)
add_button.pack()
# 메인 루프 시작
root.mainloop()
코드 설명
- 트리뷰 위젯 생성: 트리뷰 위젯을 생성하고 메인 윈도우에 배치합니다.
- 루트 노드 추가:
insert
메서드를 사용하여 루트 노드를 추가합니다. - 데이터 추가용 함수 정의:
add_data
함수를 정의하고, 이 함수 내에서insert
메서드를 사용하여 새 자식 노드를 추가합니다. - 버튼 생성:
Button
위젯을 만들고,command
옵션에add_data
함수를 지정하여 버튼 클릭 시 새 데이터를 추가할 수 있게 합니다.
데이터 삭제
트리뷰에서 데이터를 삭제하려면 delete
메서드를 사용합니다. 다음은 노드를 삭제하는 방법의 예입니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("트리뷰 데이터 삭제")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 루트 노드 추가
root_node = tree.insert("", "end", text="Root Node")
child_node = tree.insert(root_node, "end", text="Child Node")
# 데이터 삭제용 함수
def delete_data():
selected_item = tree.selection()[0]
tree.delete(selected_item)
# 버튼 생성
delete_button = tk.Button(root, text="데이터 삭제", command=delete_data)
delete_button.pack()
# 메인 루프 시작
root.mainloop()
코드 설명
- 트리뷰 위젯 생성: 트리뷰 위젯을 생성하고 메인 윈도우에 배치합니다.
- 루트 노드와 자식 노드 추가:
insert
메서드를 사용하여 루트 노드 및 자식 노드를 추가합니다. - 데이터 삭제용 함수 정의:
delete_data
함수를 정의하고, 이 함수 내에서selection
메서드를 사용하여 선택된 노드를 얻고,delete
메서드를 사용하여 삭제합니다. - 버튼 생성:
Button
위젯을 생성하고,command
옵션에delete_data
함수를 지정하여 버튼 클릭 시 선택된 데이터를 삭제할 수 있게 합니다.
이를 통해 트리뷰에서 데이터를 동적으로 추가하고 삭제할 수 있습니다. 다음 절에서는 트리뷰의 커스터마이징 방법에 대해 자세히 설명합니다.
트리뷰 커스터마이징 방법
트리뷰의 커스터마이징을 통해 외관이나 기능을 사용자 요구에 맞게 조정할 수 있습니다. 이 절에서는 트리뷰의 외관이나 동작을 커스터마이징하는 방법에 대해 설명합니다.
열 추가 및 커스터마이징
트리뷰에 열을 추가하고 커스터마이징하는 방법을 살펴봅시다. 다음 예시에서는 열을 추가하고, 각 열에 헤더를 설정하는 방법을 보여줍니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("트리뷰 커스터마이징")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root, columns=("size", "modified"), show="headings")
tree.pack(expand=True, fill='both')
# 열 설정
tree.heading("size", text="Size")
tree.heading("modified", text="Modified")
# 열의 너비 설정
tree.column("size", width=100)
tree.column("modified", width=150)
# 샘플 데이터 추가
tree.insert("", "end", values=("2 KB", "01/01/2024"))
tree.insert("", "end", values=("4 KB", "01/02/2024"))
# 메인 루프 시작
root.mainloop()
코드 설명
- 열 추가:
columns
인수로 열을 정의하고,show="headings"
로 헤더를 표시합니다. - 헤더 설정:
heading
메서드를 사용하여 각 열의 헤더를 설정합니다. - 열 너비 설정:
column
메서드를 사용하여 각 열의 너비를 지정합니다.
노드 커스터마이징
노드의 외관을 커스터마이징할 수도 있습니다. 아래 예시에서는 노드에 아이콘을 추가하는 방법을 보여줍니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("트리뷰 노드 커스터마이징")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 아이콘 읽기
folder_icon = tk.PhotoImage(file="folder.png")
file_icon = tk.PhotoImage(file="file.png")
# 루트 노드 추가
root_node = tree.insert("", "end", text="Root Node", image=folder_icon)
# 자식 노드 추가
tree.insert(root_node, "end", text="Child Node 1", image=file_icon)
tree.insert(root_node, "end", text="Child Node 2", image=file_icon)
# 메인 루프 시작
root.mainloop()
코드 설명
- 아이콘 읽기:
PhotoImage
를 사용하여 아이콘 이미지를 읽습니다. - 노드 추가 시 아이콘 설정:
insert
메서드의image
인수에 아이콘을 지정하여 노드에 아이콘을 표시합니다.
이벤트 핸들링 추가
트리뷰에 이벤트 핸들링을 추가하면 사용자가 노드를 클릭할 때의 동작을 커스터마이징할 수 있습니다. 아래 예시에서는 노드가 선택될 때 메시지를 표시하는 방법을 보여줍니다.
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
# 메인 윈도우 생성
root = tk.Tk()
root.title("트리뷰 이벤트 핸들링")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 노드 추가
root_node = tree.insert("", "end", text="Root Node")
tree.insert(root_node, "end", text="Child Node 1")
tree.insert(root_node, "end", text="Child Node 2")
# 이벤트 핸들러 정의
def on_node_select(event):
selected_item = tree.selection()[0]
node_text = tree.item(selected_item, "text")
messagebox.showinfo("노드 선택", f"선택된 노드: {node_text}")
# 이벤트 바인딩
tree.bind("<>", on_node_select)
# 메인 루프 시작
root.mainloop()
코드 설명
- 이벤트 핸들러 정의:
on_node_select
함수를 정의하고, 선택된 노드의 정보를 표시합니다. - 이벤트 바인딩:
bind
메서드를 사용하여 트리뷰의 선택 이벤트에 핸들러를 바인딩합니다.
이를 통해 트리뷰의 외관과 동작을 커스터마이징하여 더 사용자 친화적인 인터페이스를 만들 수 있습니다. 다음 절에서는 트리뷰의 실제 응용 예시를 소개합니다.
트리뷰 응용 예시
트리뷰는 많은 실제 애플리케이션에서 사용됩니다. 여기에서는 Python을 사용한 구체적인 응용 예시를 소개하고, 트리뷰의 실용적인 사용 방법을 설명합니다.
파일 탐색기 만들기
트리뷰는 파일 시스템 탐색에 적합합니다. 아래 예시에서는 간단한 파일 탐색기를 만들고 디렉토리와 파일의 계층 구조를 표시합니다.
import tkinter as tk
from tkinter import ttk
import os
# 메인 윈도우 생성
root = tk.Tk()
root.title("파일 탐색기")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 루트 디렉토리 설정
root_dir = os.path.expanduser("~")
# 디렉토리 읽기 함수
def load_directory(parent, path):
for entry in os.listdir(path):
abs_path = os.path.join(path, entry)
node = tree.insert(parent, "end", text=entry, open=False)
if os.path.isdir(abs_path):
load_directory(node, abs_path)
# 루트 디렉토리 노드 생성
root_node = tree.insert("", "end", text=root_dir, open=True)
load_directory(root_node, root_dir)
# 메인 루프 시작
root.mainloop()
코드 설명
- 루트 디렉토리 설정:
os.path.expanduser("~")
를 사용하여 사용자의 홈 디렉토리를 가져옵니다. - 디렉토리 읽기 함수:
load_directory
함수를 정의하고, 지정된 경로의 디렉토리 내용을 트리뷰에 추가합니다. - 루트 노드 생성:
root_node
를 생성하고 루트 디렉토리를 트리뷰에 추가합니다. - 서브디렉토리 읽기: 재귀적으로 서브디렉토리를 읽고, 계층 구조를 트리뷰에 표시합니다.
조직도 표시
트리뷰는 기업이나 단체의 조직도를 표시하는 데도 적합합니다. 아래 예시에서는 간단한 조직도를 표시합니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("조직도")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 조직도 데이터
organization = {
"CEO": ["CTO", "CFO", "COO"],
"CTO": ["Dev Manager", "QA Manager"],
"CFO": ["Accountant"],
"COO": ["Operations Manager"],
"Dev Manager": ["Developer 1", "Developer 2"],
"QA Manager": ["QA Tester"],
"Operations Manager": ["Logistics"],
}
# 조직도 읽기 함수
def load_organization(parent, position):
node = tree.insert(parent, "end", text=position)
if position in organization:
for sub_position in organization[position]:
load_organization(node, sub_position)
# 루트 포지션 추가
root_position = "CEO"
load_organization("", root_position)
# 메인 루프 시작
root.mainloop()
코드 설명
- 조직도 데이터: 딕셔너리 형식으로 조직도 데이터를 정의합니다. 키는 직위명, 값은 해당 직위의 부하 리스트입니다.
- 조직도 읽기 함수:
load_organization
함수를 정의하고, 지정된 직위와 그 부하들을 트리뷰에 추가합니다. - 루트 포지션 추가:
root_position
으로 CEO를 설정하고, 조직도를 트리뷰에 표시합니다.
프로젝트 관리용 트리뷰
트리뷰를 사용하면 프로젝트의 작업과 하위 작업을 계층적으로 표시할 수 있습니다. 아래 예시에서는 프로젝트의 작업 관리를 합니다.
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("프로젝트 관리")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 프로젝트 데이터
project = {
"Project A": ["Task 1", "Task 2"],
"Task 1": ["Subtask 1.1", "Subtask 1.2"],
"Task 2": ["Subtask 2.1"],
}
# 프로젝트 데이터 읽기 함수
def load_project(parent, task):
node = tree.insert(parent, "end", text=task)
if task in project:
for sub_task in project[task]:
load_project(node, sub_task)
# 루트 작업 추가
root_task = "Project A"
load_project("", root_task)
# 메인 루프 시작
root.mainloop()
코드 설명
- 프로젝트 데이터: 딕셔너리 형식으로 프로젝트와 작업 데이터를 정의합니다.
- 프로젝트 데이터 읽기 함수:
load_project
함수를 정의하고, 지정된 작업과 그 하위 작업들을 트리뷰에 추가합니다. - 루트 작업 추가:
root_task
으로 프로젝트명을 설정하고, 프로젝트의 작업을 트리뷰에 표시합니다.
이러한 응용 예시를 통해 트리뷰의 실용적인 사용 방법을 이해하고, 다양한 프로젝트에서 계층 데이터를 효과적으로 관리하고 표시할 수 있게 될 것입니다. 다음 절에서는 학습한 내용을 복습할 수 있는 연습 문제와 그 해답을 제공합니다.
연습 문제와 해답 예시
여기에서는 트리뷰의 이해를 돕기 위한 연습 문제를 몇 가지 제공합니다. 이 문제를 풀면서 트리뷰의 기본 작업과 커스터마이징 방법을 실습할 수 있습니다.
연습 문제 1: 기본적인 트리뷰 만들기
Tkinter를 사용하여 다음과 같은 계층 구조를 가진 트리뷰를 만드세요.
- Root
- Branch 1
- Leaf 1.1
- Leaf 1.2
- Branch 2
- Leaf 2.1
- Leaf 2.2
해답 예시
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("기본적인 트리뷰")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 노드 추가
root_node = tree.insert("", "end", text="Root")
branch1 = tree.insert(root_node, "end", text="Branch 1")
tree.insert(branch1, "end", text="Leaf 1.1")
tree.insert(branch1, "end", text="Leaf 1.2")
branch2 = tree.insert(root_node, "end", text="Branch 2")
tree.insert(branch2, "end", text="Leaf 2.1")
tree.insert(branch2, "end", text="Leaf 2.2")
# 메인 루프 시작
root.mainloop()
연습 문제 2: 데이터 추가 및 삭제
위의 트리뷰에 데이터를 동적으로 추가 및 삭제하는 버튼을 추가하세요. 버튼을 클릭하면 새 노드가 추가되고, 선택된 노드를 삭제하는 기능을 구현하세요.
해답 예시
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("데이터 추가 및 삭제")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 노드 추가
root_node = tree.insert("", "end", text="Root")
branch1 = tree.insert(root_node, "end", text="Branch 1")
tree.insert(branch1, "end", text="Leaf 1.1")
tree.insert(branch1, "end", text="Leaf 1.2")
branch2 = tree.insert(root_node, "end", text="Branch 2")
tree.insert(branch2, "end", text="Leaf 2.1")
tree.insert(branch2, "end", text="Leaf 2.2")
# 데이터 추가용 함수
def add_data():
tree.insert(root_node, "end", text="New Branch")
# 데이터 삭제용 함수
def delete_data():
selected_item = tree.selection()[0]
tree.delete(selected_item)
# 버튼 생성
add_button = tk.Button(root, text="데이터 추가", command=add_data)
add_button.pack()
delete_button = tk.Button(root, text="데이터 삭제", command=delete_data)
delete_button.pack()
# 메인 루프 시작
root.mainloop()
연습 문제 3: 커스터마이즈된 트리뷰
다음으로 트리뷰에 열을 추가하고, 각 열에 헤더를 설정하세요. 다음 열을 가진 트리뷰를 만드세요.
- 노드 이름 (Node Name)
- 크기 (Size)
- 최종 수정일 (Last Modified)
해답 예시
import tkinter as tk
from tkinter import ttk
# 메인 윈도우 생성
root = tk.Tk()
root.title("커스터마이즈된 트리뷰")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root, columns=("size", "modified"), show="headings")
tree.pack(expand=True, fill='both')
# 열 설정
tree.heading("size", text="Size")
tree.heading("modified", text="Last Modified")
tree.column("size", width=100)
tree.column("modified", width=150)
# 노드 추가
tree.insert("", "end", text="Root", values=("2 KB", "01/01/2024"))
tree.insert("", "end", text="Branch 1", values=("4 KB", "01/02/2024"))
tree.insert("", "end", text="Branch 2", values=("3 KB", "01/03/2024"))
# 메인 루프 시작
root.mainloop()
연습 문제 4: 이벤트 핸들링 추가
트리뷰에서 노드가 선택될 때 선택된 노드의 이름을 표시하는 이벤트 핸들링을 추가하세요.
해답 예시
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
# 메인 윈도우 생성
root = tk.Tk()
root.title("이벤트 핸들링 추가")
# 트리뷰 위젯 생성
tree = ttk.Treeview(root)
tree.pack(expand=True, fill='both')
# 노드 추가
root_node = tree.insert("", "end", text="Root")
branch1 = tree.insert(root_node, "end", text="Branch 1")
tree.insert(branch1, "end", text="Leaf 1.1")
tree.insert(branch1, "end", text="Leaf 1.2")
branch2 = tree.insert(root_node, "end", text="Branch 2")
tree.insert(branch2, "end", text="Leaf 2.1")
tree.insert(branch2, "end", text="Leaf 2.2")
# 이벤트 핸들러 정의
def on_node_select(event):
selected_item = tree.selection()[0]
node_text = tree.item(selected_item, "text")
messagebox.showinfo("노드 선택", f"선택된 노드: {node_text}")
# 이벤트 바인딩
tree.bind("<>", on_node_select)
# 메인 루프 시작
root.mainloop()
이러한 연습 문제를 풀면서 트리뷰의 구현, 커스터마이징, 그리고 조작 방법에 대한 이해를 깊이 있게 할 수 있습니다. 다음 절에서는 이 기사의 내용을 정리합니다.
정리
본 기사에서는 Python에서 트리뷰를 사용한 계층 데이터 표시 및 관리 방법에 대해 설명했습니다. 먼저 트리뷰의 기본 개념과 용도를 이해하고, 그 다음 Python의 Tkinter 라이브러리를 사용한 트리뷰의 기본적인 구현 방법을 배웠습니다. 또한 데이터 추가 및 삭제, 트리뷰의 커스터마이징 방법에 대해서도 설명했습니다. 실제 응용 예시로 파일 탐색기, 조직도 표시, 프로젝트 관리 등을 소개하고, 연습 문제를 통해 이해도를 높였습니다. 이 지식을 활용하여 다양한 프로젝트에서 계층 데이터를 효과적으로 관리하고 표시할 수 있게 될 것입니다.