어드민 UI에 페이지 헤더 공통 컴포넌트 도입
목차
어드민 UI 전반에 PageHeader 컴포넌트를 만들어서 붙이는 작업을 했다. 커밋 하나짜리 작업이지만, 팀 입장에서는 꽤 의미 있는 시발점이었다.
왜 이 타이밍에
어드민 페이지가 늘어나면서 슬슬 문제가 보이기 시작했다. 각 페이지마다 타이틀 영역을 제각각 구현해놓은 것이다. 누군가는 <h1> 하나 달랑, 누군가는 설명 텍스트까지, 또 누군가는 상단 액션 버튼까지 거기다 끼워놓은 상태. 디자인 일관성도 없고, 새 페이지 만들 때마다 "위 페이지 참고해서 복붙하면 되죠?" 식으로 흘러가는 패턴이 반복됐다.
이런 상황에서 컴포넌트 하나 만드는 게 "개발자가 알아서 하는 리팩터링" 수준으로 보일 수도 있다. 근데 팀장 입장에서 이건 명확히 공통화 기준을 세우는 작업이라서, 그냥 조용히 올리기보다 코드리뷰 때 배경을 같이 설명했다.
"앞으로 어드민 페이지 추가할 때 PageHeader는 기본으로 쓰는 거예요. 타이틀/설명/액션 버튼은 여기서 통일합니다."
이 한마디가 없으면 컴포넌트 만들어봤자 다음 사람이 또 <h1> 직접 쓴다.
변경된 파일들과 역할
이번에 PageHeader를 적용한 페이지는 총 6개다.
| 파일 | 페이지 역할 |
|---|---|
dashboard/page.tsx |
어드민 메인 진입점 |
posts/page.tsx |
콘텐츠 관리 목록 |
categories/page.tsx |
카테고리 관리 |
ad-units/page.tsx |
광고 단위 관리 |
integrations/page.tsx |
외부 연동 설정 |
audit-log/page.tsx |
운영자 활동 로그 |
성격이 다 다른 페이지들이라서 일부러 이쪽부터 적용했다. 목록형, 설정형, 로그형 등 케이스가 섞여 있으면 PageHeader가 얼마나 유연하게 버텨주는지 바로 확인할 수 있거든. 만약 비슷한 페이지만 골라서 적용했다가 나중에 예외 케이스 터지면 그게 더 골치아프다.
컴포넌트 구조
PageHeader는 단순하게 잡았다. 과하게 추상화하면 나중에 오히려 손대기 불편해진다.
interface PageHeaderProps {
title: string;
description?: string;
actions?: React.ReactNode;
}
export function PageHeader({ title, description, actions }: PageHeaderProps) {
return (
<div className="flex items-start justify-between mb-6">
<div>
<h1 className="text-2xl font-semibold">{title}</h1>
{description && (
<p className="text-sm text-muted-foreground mt-1">{description}</p>
)}
</div>
{actions && <div className="flex gap-2">{actions}</div>}
</div>
);
}
actions를 React.ReactNode로 열어둔 게 포인트다. 버튼 하나일 수도 있고, 드롭다운 + 버튼 조합일 수도 있으니까. 이 부분을 buttonLabel?: string 같은 식으로 닫아버리면 결국 얼마 안 가서 props 추가 요청이 들어온다. 처음부터 슬롯으로 열어두는 게 낫다.
사용 측에서는 이렇게 쓴다.
// audit-log/page.tsx
<PageHeader
title="Audit Log"
description="운영자 활동 내역을 확인합니다."
/>
// ad-units/page.tsx
<PageHeader
title="Ad Units"
actions={<Button size="sm">새 광고 단위 추가</Button>}
/>
이 작업의 진짜 의미
PageHeader 하나 만드는 게 기술적으로 어려운 일은 아니다. 근데 이게 팀에서 작동하려면 두 가지가 필요하다.
- 적용 예시가 충분해야 한다: "어디서 어떻게 쓰는지" 레퍼런스가 없으면 새 페이지 개발할 때 또 망설이게 된다. 그래서 이번에 6개 페이지에 한 번에 적용한 거다. 보면 바로 따라 쓸 수 있도록.
- 컨벤션이 명시되어야 한다: 코드만 있고 말이 없으면 "몰랐어요"가 된다. 리뷰 코멘트든 위키든 어딘가에 "어드민 페이지는 PageHeader 기본 사용"이 적혀 있어야 한다.
공통 컴포넌트는 만드는 것보다 팀 안에서 자리잡히는 게 더 어렵다. 이 작업은 그 첫 번째 스텝이었다.
끝.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.