화면 구조의 기준
프로젝트 전반에 걸쳐 공통 레이아웃(header, sidebar, footer)을 한 곳에서 정의해 두면, 새로운 페이지를 만들 때 매번 똑같은 마크업을 반복할 필요가 없습니다.
UI 재사용성 & 유지보수
헤더나 푸터처럼 모든 화면에 반복해서 들어가는 컴포넌트를 Layout에서 관리하면, 수정이 필요할 때 Layout만 고치면 전체 페이지에 반영됩니다.
확장성 대비
프로젝트가 커지면, ‘관리자용 레이아웃’·‘사용자용 레이아웃’ 등으로 분기할 수 있어 유연하게 대처할 수 있습니다.
Footer에 Pico.css 적용 (CDN 예시)
public/index.html 헤드 태그에 간단히 추가:Usage from CDN#
Alternatively, you can use jsDelivr CDN to linkpico.min.css.<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
components/layout/Layout.tsx 에 공통 헤더·사이드바·푸터가 감싸진 기본 틀을 만들고,
App.tsx 에서 형태로 페이지(UI)들을 이 Layout 안에 렌더링하였다.
children 컴포넌트 타입 비교
- ReactNode
모든 렌더링 가능한 값의 총집합. string, number, ReactElement, Fragment, boolean 등 거의 모든 걸 포함합니다.- ReactElement
React.createElement(type, props, children) 로 생성된 객체. 타입이 명확한 “실제 컴포넌트 인스턴스”를 가리킵니다.- JSX.Element
TSX/JSX 문법으로 생성된 ReactElement 의 타입 별칭(alias). 즉, 같은 표현식의 결과 타입입니다.
<ThemeProvider> 내부에서 바로 렌더링만 해 주면 됩니다.styled-components theme구성

그걸 위해서 테마를 만들고
// src/style/theme.ts
export type ThemeName = 'light' | 'dark'
export interface Theme {
name: ThemeName
color: {
primary: string
background: string
secondary: string
third: string
}
}
export const light: Theme = {
name: 'light',
color: {
primary: 'brown',
background: 'lightgray',
secondary: 'blue',
third: 'green',
},
}
export const dark: Theme = {
name: 'dark',
color: {
primary: 'coral',
background: 'midnightblue',
secondary: 'darkblue',
third: 'darkgreen',
},
}
export function getTheme(name: ThemeName): Theme {
return name === 'light' ? light : dark
}
이걸 통해 테마 스워처(context API)를 만들어 적용하였다.