페이지가 늘어날수록 공통 영역을 따로 관리해야 일관성이 생깁니다. 이번 글은 레이아웃과 슬롯을 이용해 반복되는 UI를 구조적으로 유지하는 방법을 다룹니다.
이번 글에서 새로 나오는 용어
- 레이아웃: 여러 페이지가 공유하는 껍데기로, 헤더·푸터 같은 공통 영역을 한 번에 배치하는 파일입니다.
- 슬롯(slot): 레이아웃이 비워 두는 자리로,
<slot />위치에 각 페이지의 본문이 꽂힙니다. - 네임드 슬롯:
slot="sidebar"처럼 이름을 붙이는 슬롯으로, 특정 영역에만 콘텐츠를 넣도록 제한합니다. - svelte:fragment: 네임드 슬롯에 여러 요소를 묶어 넣을 때 사용하는 Svelte 전용 태그입니다.
개념
레이아웃은 여러 페이지가 공유하는 껍데기입니다. 루트 레이아웃에서 헤더와 풋터를 배치하고 하위 폴더마다 추가 레이아웃을 둘 수 있습니다. 슬롯(slot)은 레이아웃이 비워 두는 자리입니다. <slot />에 페이지 본문이 꽂히므로 공통 UI와 개별 UI를 자연스럽게 분리할 수 있습니다. 네임드 슬롯(named slot)은 이름이 붙은 슬롯으로 특정 영역에만 콘텐츠를 꽂도록 제한합니다. 이렇게 하면 사이드바나 하단 패널을 깔끔하게 재사용할 수 있습니다.
서버·클라이언트 경계 천천히 보기
+layout.server.ts는 서버에서만 실행되어 데이터(예: 로그인 사용자)를 준비하고,+layout.svelte는 그 데이터를 받아 브라우저에서 렌더링합니다. 헷갈리면 파일 확장자를 먼저 확인하세요.- 슬롯을 비워 둔 레이아웃은 부모-자식으로 중첩됩니다. 상위 레이아웃의
<slot />에 하위 레이아웃 전체가 들어가고, 다시 그 안의<slot />에 실제 페이지가 들어갑니다. 이 흐름을 머릿속에서 천천히 따라가면 어느 부분이 언제 렌더링되는지 명확해집니다. - 네임드 슬롯은 이름이 맞아야만 콘텐츠가 들어갑니다. 오타가 나면 Svelte가 조용히 빈 영역을 그리므로,
slot="sidebar"같은 문자열을 상수처럼 재사용하세요.
코드
루트 레이아웃과 대시보드 껍데기를 함께 살핍니다.
<!-- src/routes/+layout.svelte -->
<script>
export let data;
</script>
<div class="shell">
<AppHeader user={data.user} />
<main>
<slot />
</main>
<AppFooter />
</div>
모든 페이지는 기본 슬롯을 통해 <main> 영역에 그려집니다. 대시보드 섹션처럼 더 많은 영역이 필요하면 네임드 슬롯을 선언합니다.
<!-- src/routes/(dashboard)/+layout.svelte -->
<DashboardShell>
<svelte:fragment slot="sidebar">
<ProjectSidebar />
</svelte:fragment>
<slot />
<svelte:fragment slot="bottom-panel">
<RecentActivity />
</svelte:fragment>
</DashboardShell>
DashboardShell 안에서는 이름이 맞는 슬롯만 채워집니다.
<!-- DashboardShell.svelte -->
<div class="dashboard">
<aside>
<slot name="sidebar" />
</aside>
<section class="content">
<slot />
</section>
<footer>
<slot name="bottom-panel" />
</footer>
</div>
페이지를 바꿔도 헤더와 사이드바, 하단 패널은 그대로 남고 본문만 변합니다. 학생 서비스의 내비게이션, 과제 현황 패널, 알림 바 같은 영역이 자연스럽게 유지됩니다.
왜 중요한가
동아리 관리 패널이나 교내 배포용 앱은 대부분 같은 틀 안에서 페이지를 전환합니다. 레이아웃과 슬롯을 쓰면 새로운 페이지를 추가해도 기존 UI를 깨지 않고 재사용할 수 있습니다. 또한 네임드 슬롯으로 위치를 고정하면 컴포넌트가 서로 상대 위치를 몰라도 되고, 협업 시에도 “어디에 무엇을 꽂는지” 명확히 전달됩니다.
실습
- 따라 하기: 루트 레이아웃을 만들고 헤더·푸터·본문 슬롯을 배치한다.
- 확장하기: 대시보드용 레이아웃을 추가해
sidebar,bottom-panel슬롯을 구성한다. - 디버깅: 슬롯 내용이 보이지 않으면
slot이름과<slot />위치가 맞는지 확인한다. - 완료 기준: 페이지 전환 시 헤더와 사이드바는 유지되고 본문 슬롯만 교체된다.
마무리
레이아웃과 슬롯은 UI 틀을 고정하고 페이지별 차이를 최소한으로 표현하게 도와줍니다. 다음 편에서는 이 틀 위에 전환과 애니메이션을 얹어 흐름을 더 부드럽게 만드는 방법을 살펴봅니다.
💬 댓글
이 글에 대한 의견을 남겨주세요