MUI를 사용하는 유저의 경우, 반응형 웹을 구현하는 방식에는 미디어 쿼리(Media Query)를 JavaScript에서 활용하는 방법과 CSS만을 사용하는 방법이 있습니다. 특히 React 환경에서 useMediaQuery와 같은 훅을 사용하는 방식과 CSS-only 방식을 비교하여 그 차이점을 분석합니다.
1. 렌더링 시점과 사용자 경험
| 분류 | 미디어 쿼리 (예: useMediaQuery) | CSS-only 방식 (예: MUI sx prop) |
| 코드 예시 | const isMobile = useMediaQuery(theme.breakpoints.down('sm')); return isMobile ? <MobileView /> : <DesktopView />; | <Box sx={{ display: { xs: 'block', sm: 'none' } }}>모바일</Box> <Box sx={{ display: { xs: 'none', sm: 'block' } }}>데스크탑</Box> |
| 서버/클라이언트 렌더링 | 서버: 기본값(주로 데스크탑) 렌더링 클라이언트: 실제 화면 크기 감지 후 재렌더링 | 서버 및 클라이언트: 동일한 HTML 생성 (모든 뷰포트의 마크업 포함) |
| 작동 원리 | 클라이언트 측 JavaScript에서 화면 크기를 감지하고, 조건에 따라 컴포넌트를 조건부로 마운트/언마운트함. | 브라우저의 CSS가 화면 크기에 맞춰 마크업을 단순히 표시(display: block)하거나 숨김(display: none) 처리함. |
| 결과 | 깜빡거림(Flickering) 발생 가능성 (서버에서 데스크탑이 보였다가 클라이언트에서 모바일로 바뀌는 순간) | 깜빡거림 없음 |
useMediaQuery 방식은 초기 렌더링 시 서버에서 보낸 기본 뷰와 클라이언트에서 화면 크기에 맞춰 다시 그린 뷰가 달라 사용자에게 순간적인 화면 깜빡임으로 느껴질 수 있습니다.
2. 성능 및 효율성
| 방식 | JavaScript 사용 | 컴포넌트 Re-render | 번들 크기 |
| useMediaQuery | 필요 (화면 크기 감지 로직) | 발생 (조건에 따라 컴포넌트 트리를 다시 그림) | 더 큼 (JavaScript 로직 및 두 컴포넌트 버전) |
| CSS-only | 불필요 | 없음 | 더 작음 (조건부 로직이 CSS에 내장) |
useMediaQuery는 JavaScript를 실행하여 화면 크기를 감지하고, 조건에 따라 컴포넌트 전체를 다시 렌더링하므로 성능 오버헤드가 발생합니다. 반면 CSS-only 방식은 브라우저에 부하가 적은 CSS 속성(display)만을 변경하여 효율적입니다.
3. SEO (검색엔진 최적화) 및 접근성
| 방식 | SEO (검색엔진 최적화) | JavaScript 의존성 |
| useMediaQuery | 초기 HTML에 한 가지 버전의 콘텐츠만 포함되어, 검색엔진이 나머지 콘텐츠를 확인하지 못할 위험이 있습니다. | JavaScript가 필수적이므로, JavaScript 비활성화 환경에서 콘텐츠 접근에 문제가 생길 수 있습니다. |
| CSS-only | 모든 버전의 콘텐츠가 초기 HTML에 포함되므로, 검색엔진이 모든 콘텐츠를 인덱싱 가능하여 SEO에 유리합니다. | JavaScript 없이도 CSS만으로 동작합니다. |
CSS-only 방식은 숨겨진 마크업이라도 HTML 소스에 존재하기 때문에, 검색엔진이나 접근성 도구가 전체 콘텐츠를 읽는 데 용이합니다.
4. 사용 케이스 요약
| useMediaQuery를 사용해야 할 때 | CSS-only를 사용해야 할 때 |
| 화면 크기에 따라 복잡한 조건부 로직이나 동적인 계산이 필요할 때 | 단순히 레이아웃을 전환하거나 마크업 요소를 표시/숨김할 때 |
| 화면 크기에 따라 다른 이벤트 핸들러를 적용해야 할 때 | 화면 깜빡거림을 방지하여 부드러운 사용자 경험이 중요할 때 |
| 컴포넌트의 로직 자체가 뷰포트에 종속되어 컴포넌트 자체를 분리해야 할 때 | 성능 최적화와 SEO가 중요할 때 |
결론
AI 모델 선택 컴포넌트와 같이 모바일과 데스크탑 간의 단순한 레이아웃 전환 또는 요소 표시/숨김이 필요한 경우에는 CSS-only 방식이 깜빡거림 방지, 성능 최적화, SEO 측면에서 훨씬 더 적합합니다. useMediaQuery는 데이터 구조나 복잡한 로직이 화면 크기에 따라 완전히 달라져야 하는 경우에 사용하는 것이 좋습니다.
'CSS' 카테고리의 다른 글
| 😡 "다른 건 다 필요 없어!" CSS !important (0) | 2025.10.17 |
|---|---|
| [CSS] filter를 통한 이미지 음영 넣기 (0) | 2024.03.11 |
| [CSS] position이란? (0) | 2024.01.31 |