이슈 #1: 반응형 브레이크포인트 일관성 관리
1. 이슈 상황
| 항목 |
내용 |
| 발생 환경 |
페이지 전체 반응형 작업 중 |
| 증상 |
각 컴포넌트마다 다른 브레이크포인트 사용, 특정 화면 크기에서 레이아웃 깨짐 |
| 영향 범위 |
메인, Voting, My Wallet, Profile 등 전체 페이지 |
문제 코드 예시:
// 컴포넌트마다 다른 브레이크포인트 하드코딩
const MainSection = styled.div`
@media (max-width: 768px) { ... } // 여기는 768px
`;
const VotingCard = styled.div`
@media (max-width: 750px) { ... } // 여기는 750px
`;
const WalletLayout = styled.div`
@media (max-width: 800px) { ... } // 여기는 800px
`;
// 일관성 없는 브레이크포인트로 레이아웃 전환 시점 불일치
2. 해결 방안 후보
| 방안 |
장점 |
단점 |
| A. 중앙 theme 파일에서 관리 |
일관된 브레이크포인트, 한 곳에서 수정 |
초기 설정 필요 |
| B. CSS 변수 사용 |
네이티브 CSS 활용 |
styled-components와 혼용 어려움 |
| C. 각 컴포넌트에서 상수화 |
구현 간단 |
여전히 분산 관리 |
3. 선택한 해결법
선택: A안 (중앙 theme 파일에서 관리)
// utils/theme.ts
export const breakpoints = {
mobile: '480px',
tablet: '768px',
desktop: '1024px',
wide: '1280px',
} as const;
export const media = {
mobile: `@media (max-width: ${breakpoints.mobile})`,
tablet: `@media (max-width: ${breakpoints.tablet})`,
desktop: `@media (max-width: ${breakpoints.desktop})`,
wide: `@media (max-width: ${breakpoints.wide})`,
} as const;
// 컴포넌트에서 사용
import { media } from '@/utils/theme';
const MainSection = styled.div`
display: grid;
grid-template-columns: repeat(3, 1fr);
${media.tablet} {
grid-template-columns: repeat(2, 1fr);
}
${media.mobile} {
grid-template-columns: 1fr;
}
`;
const VotingCard = styled.div`
padding: 24px;
${media.tablet} {
padding: 16px;
}
${media.mobile} {
padding: 12px;
}
`;
4. 선택 이유
| 관점 |
이유 |
| 일관성 |
모든 컴포넌트가 동일한 브레이크포인트 사용 |
| 유지보수 |
브레이크포인트 변경 시 한 곳만 수정 |
| 가독성 |
media.tablet 같은 시맨틱한 네이밍으로 의도 명확 |
| 타입 안전성 |
as const 로 자동완성 및 오타 방지 |
이슈 #2: 모바일 Drawer 메뉴 스크롤 잠금
1. 이슈 상황
| 항목 |
내용 |
| 발생 환경 |
Header Drawer 모바일 메뉴 열린 상태 |
| 증상 |
Drawer 열린 상태에서 배경 스크롤 가능, 메뉴 뒤로 콘텐츠 이동 |
| 영향 범위 |
모바일 전체 네비게이션 UX |
문제 코드 예시:
// Drawer만 열고 body 스크롤 제어 없음
function HeaderDrawer({ isOpen, onClose }) {
return (
<>
{isOpen && <Overlay onClick={onClose} />}
<DrawerContainer $isOpen={isOpen}>
<NavLinks />
</DrawerContainer>
</>
);
}
// Drawer 열린 상태에서도 배경 스크롤 됨
2. 해결 방안 후보
| 방안 |
장점 |
단점 |
| A. body overflow hidden |
간단하고 확실한 스크롤 방지 |
스크롤 위치 점프 이슈 |
| B. position fixed + 스크롤 위치 저장 |
스크롤 위치 유지 |
구현 복잡 |
| C. overscroll-behavior CSS |
CSS만으로 해결 |
일부 브라우저 미지원 |