디지털 시대에 접어들면서 다양한 디바이스에서 웹 사이트에 접근하는 사용자가 늘어나고 있습니다. 데스크톱, 태블릿, 모바일 등 화면 크기와 해상도가 다양한 디바이스에서 일관된 사용자 경험(UX)을 제공하기 위해서는 반응형 웹(Responsive Web) 디자인이 필수적입니다.
React는 컴포넌트 기반의 구조와 풍부한 생태계를 통해 반응형 웹 개발에 최적화된 프론트엔드 라이브러리입니다. 이 글에서는 React를 사용하여 반응형 웹을 구현하는 방법을 단계별로 자세히 알아보겠습니다.
styled-components
, Material-UI
, Bootstrap
등 반응형 디자인을 지원하는 라이브러리를 활용합니다.styled-components
의 createGlobalStyle
을 사용하여 기본 스타일을 설정합니다.import { createGlobalStyle } from 'styled-components';
const GlobalStyle = createGlobalStyle`
body {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Arial', sans-serif;
}
`;
export default GlobalStyle;
`App.js`에서 `GlobalStyle`을 적용합니다.
import React from 'react';
import GlobalStyle from './GlobalStyle';
import Header from './components/Header';
import Content from './components/Content';
import Footer from './components/Footer';
function App() {
return (
<>
<GlobalStyle />
<Header />
<Content />
<Footer />
</>
);
}
export default App;
import React from 'react';
import styled from 'styled-components';
const HeaderContainer = styled.header`
background-color: #4CAF50;
padding: 10px;
@media (max-width: 768px) {
padding: 5px;
}
`;
const Nav = styled.nav`
display: flex;
justify-content: space-between;
align-items: center;
`;
const Logo = styled.h1`
color: white;
margin: 0;
@media (max-width: 768px) {
font-size: 1.2em;
}
`;
const Menu = styled.ul`
list-style: none;
display: flex;
margin: 0;
li {
margin: 0 15px;
color: white;
}
@media (max-width: 768px) {
display: none;
}
`;
function Header() {
return (
<HeaderContainer>
<Nav>
<Logo>MyLogo</Logo>
<Menu>
<li>Home</li>
<li>About</li>
<li>Contact</li>
</Menu>
</Nav>
</HeaderContainer>
);
}
export default Header;
import React from 'react';
import styled from 'styled-components';
const ContentContainer = styled.main`
padding: 20px;
`;
const Grid = styled.div`
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
@media (max-width: 1024px) {
grid-template-columns: repeat(2, 1fr);
}
@media (max-width: 600px) {
grid-template-columns: 1fr;
}
`;
const Card = styled.div`
background-color: #f4f4f4;
padding: 20px;
`;
function Content() {
return (
<ContentContainer>
<Grid>
{[...Array(8)].map((_, index) => (
<Card key={index}>
<h3>Card {index + 1}</h3>
<p>This is a sample card.</p>
</Card>
))}
</Grid>
</ContentContainer>
);
}
export default Content;
import React from 'react';
import styled from 'styled-components';
const FooterContainer = styled.footer`
background-color: #222;
padding: 10px;
color: white;
text-align: center;
`;
function Footer() {
return (
<FooterContainer>
<p>© 2023 MyWebsite</p>
</FooterContainer>
);
}
export default Footer;
styled-components
에서는 일반 CSS와 동일하게 미디어 쿼리를 사용할 수 있습니다.
const Component = styled.div`
/* 기본 스타일 */
@media (max-width: 768px) {
/* 화면 크기가 768px 이하일 때 적용될 스타일 */
}
`;
플렉스박스를 사용하여 요소를 유연하게 배치할 수 있습니다.
const FlexContainer = styled.div`
display: flex;
flex-direction: row;
flex-wrap: wrap;
`;
그리드를 사용하면 복잡한 레이아웃도 쉽게 구현할 수 있습니다.
const GridContainer = styled.div`
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
`;
이미지의 크기를 화면에 맞게 조절하여 레이아웃이 깨지지 않도록 합니다.
const ResponsiveImage = styled.img`
width: 100%;
height: auto;
`;
이미지 최적화
적응형 이미지 사용: srcset 속성을 사용하여 화면 크기에 맞는 이미지를 로드합니다.
이미지 압축: 이미지 파일의 크기를 줄여 로딩 시간을 단축합니다.
코드 스플리팅(Code Splitting)
React.lazy와 Suspense를 사용하여 필요한 컴포넌트만 로드합니다.
import React, { Suspense } from 'react';
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
);
}