master-project
CHAPTER 22 / 50
읽기 약 2분
FUNCTION
다크 모드 + 반응형 완성
핵심 개념
next-themes + 시스템 동기화 + breakpoint 일관성 + 모바일 375px·태블릿 768px·데스크톱 1440px 최종 점검.
본문
next-themes 적용
// src/app/layout.tsx
<html lang="ko" suppressHydrationWarning>
<body>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
{children}
</ThemeProvider>
</body>
</html>ThemeToggle (3개 옵션)
// src/components/theme-toggle.tsx
'use client'
import { useTheme } from 'next-themes'
import { Sun, Moon, Monitor } from 'lucide-react'
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'
export function ThemeToggle() {
const { setTheme, theme } = useTheme()
return (
<DropdownMenu>
<DropdownMenuTrigger>
{theme === 'dark' ? <Moon className="h-5 w-5" /> : <Sun className="h-5 w-5" />}
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem onClick={() => setTheme('light')}><Sun className="h-4 w-4 mr-2" /> 라이트</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme('dark')}><Moon className="h-4 w-4 mr-2" /> 다크</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme('system')}><Monitor className="h-4 w-4 mr-2" /> 시스템</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
}다크모드 디자인 점검
[모든 컴포넌트 점검]
✓ 카드 배경: bg-card (CSS 변수)
✓ 보더: border-border
✓ 텍스트: text-foreground / text-muted-foreground
✓ 버튼: bg-primary text-primary-foreground
✓ 차트 색상: hsl(var(--primary))
✓ 이미지: 다크모드 시 대비 (필터)
[안티패턴]
❌ bg-white → bg-card
❌ text-gray-500 → text-muted-foreground
❌ border-gray-200 → border-border반응형 Breakpoints
sm: 640px /* 모바일 가로 */
md: 768px /* 태블릿 */
lg: 1024px /* 데스크톱 */
xl: 1280px
2xl: 1536px
/* Mobile-first */
.text-base md:text-lg lg:text-xl
.grid-cols-1 md:grid-cols-2 lg:grid-cols-4
.hidden md:block체크리스트 — 모바일 (375px)
✓ 헤더 햄버거 → 사이드바 Sheet
✓ 카드 1열
✓ 폰트 14px 기본
✓ 버튼 터치 영역 44x44px 이상
✓ 모달 화면 가득 (full-screen)
✓ 텍스트 truncate (긴 제목)
✓ 가로 스크롤 0 (overflow-x-hidden)체크리스트 — 태블릿 (768px)
✓ 사이드바 표시 (240px)
✓ 카드 2열
✓ 모달 중앙 (max-w-md)체크리스트 — 데스크톱 (1440px)
✓ 컨텐츠 max-w 1280px (가운데 정렬)
✓ 카드 3-4열
✓ 폰트 16px 본문
✓ 사이드 광고 영역 (1440px+)테스트 도구
# Chrome DevTools
F12 → Toggle device toolbar
- iPhone 13 Pro: 390x844
- iPad: 768x1024
- Desktop: 1440x900
# 실기기 테스트
- ngrok · Vercel preview URL
- Safari·Chrome·Firefox·Edge 4종미디어 쿼리 vs Tailwind
// ✅ Tailwind (권장)
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
// ❌ CSS 직접 (구식)
<div style={{ display: 'grid' }} className="responsive-grid">
<style>{`
.responsive-grid { grid-template-columns: 1fr; }
@media (min-width: 768px) { .responsive-grid { grid-template-columns: repeat(2, 1fr); } }
`}</style>다크모드 SSR Flicker 방지
// suppressHydrationWarning 필수
<html lang="ko" suppressHydrationWarning>
<body>
<ThemeProvider disableTransitionOnChange>...</ThemeProvider>
</body>
</html>다음 챕터
CH.23 "에러/로딩/빈 상태 UI".
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 마스터 프로젝트의 다크모드·반응형 부분을 분석해서 실전 적용 + 개선 우선순위 3가지를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
다크모드·반응형 관련 모범 사례·안티패턴 5개를 비교 분석해서 실전 적용를 위한 추천 방안을 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 다크모드·반응형 최적화 가능 위치와 리스크를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 1인 개발자 시장의 다크모드·반응형 트렌드와 차별화 포인트를 정리해줘.
⭐ 이것만 기억하세요
다크 모드 + 반응형 완성은 이 3가지만 확실히 잡으세요
1.next-themes + system 동기화 = 표준
2.Mobile-first + breakpoint sm/md/lg 일관 적용
3.다음 챕터에서 에러·로딩·빈 상태
공유하기
진행도 22 / 50