CSS Grid vs Flexbox: 2026년 웹 레이아웃 완벽 가이드
CSS Grid vs Flexbox: 2026년 웹 레이아웃 완벽 가이드
CSS Grid와 Flexbox 언제 써야 할까? 차이점, 활용 사례, 효과적인 조합 방법을 실전 코드 예제로 설명합니다.
핵심 차이점: 1차원 vs 2차원
CSS Flexbox와 CSS Grid는 현대 CSS에 내장된 레이아웃 시스템으로, 초보자들이 가장 많이 범하는 실수는 이 둘을 서로 바꿔 쓰거나 하나만 선택해 다른 것은 피하는 것입니다. 이 둘은 서로 다른 목적을 위해 설계되었으며 서로를 아름답게 보완합니다.
Flexbox는 1차원 레이아웃 시스템입니다. 항목들을 단일 축을 따라 배열합니다 — 행 또는 열로. 한 줄에서 항목들 사이의 공간을 분배하고 서로 정렬하는 데 이상적입니다.
CSS Grid는 2차원 레이아웃 시스템입니다. 행과 열을 동시에 배열합니다. 두 축 모두에 대한 정밀한 제어가 필요한 페이지 수준 레이아웃과 복잡한 2차원 배열을 위해 설계되었습니다.
경험 법칙: 한 방향으로 항목을 배열하는 경우(버튼 행, 카드 목록, 네비게이션 바)에는 Flexbox를, 전체 페이지 구조나 행과 열 모두가 있는 컴포넌트를 정의할 때는 Grid를 사용하세요.
Flexbox: 1차원의 핵심 도구
네비게이션 바
네비게이션 바는 Flexbox의 대표적인 사용 사례입니다. 한 줄의 항목들, 그 사이에 분배된 공간, 모두 수직으로 중앙 정렬:
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 24px;
height: 64px;
background: #0f172a;
}
.navbar-logo {
font-size: 1.25rem;
font-weight: 700;
color: white;
}
.navbar-links {
display: flex;
gap: 32px;
list-style: none;
}
.navbar-cta {
margin-left: auto;
}
<nav class="navbar">
<span class="navbar-logo">ToolBox Hub</span>
<ul class="navbar-links">
<li><a href="/tools">도구</a></li>
<li><a href="/blog">블로그</a></li>
<li><a href="/about">소개</a></li>
</ul>
<button class="navbar-cta">시작하기</button>
</nav>
동일 높이의 카드 행
Flexbox는 콘텐츠 길이에 관계없이 모든 카드가 동일한 높이로 늘어나는 카드 행을 만드는 것을 매우 쉽게 합니다:
.card-row {
display: flex;
gap: 24px;
flex-wrap: wrap; /* 좁은 화면에서 다음 줄로 줄바꿈 */
}
.card {
flex: 1 1 280px; /* 늘어남, 줄어듦, 최소 너비 280px */
display: flex;
flex-direction: column;
padding: 24px;
border-radius: 8px;
border: 1px solid #e2e8f0;
background: white;
}
.card-body {
flex: 1; /* 푸터를 아래로 밀기 */
}
.card-footer {
margin-top: 16px;
padding-top: 16px;
border-top: 1px solid #e2e8f0;
}
flex: 1 1 280px 축약은 다음을 의미합니다: 사용 가능한 공간을 채우도록 늘어나고, 필요하면 줄어들며, 기본 크기는 280px. flex-wrap: wrap과 결합하면 카드는 좁은 화면에서 자동으로 여러 행으로 리플로우됩니다.
완벽한 중앙 정렬
CSS에서 악명 높은 중앙 정렬 문제는 Flexbox로 간단히 해결됩니다:
.center-container {
display: flex;
align-items: center; /* 수직 중앙 */
justify-content: center; /* 수평 중앙 */
min-height: 100vh;
}
CSS Grid: 2차원의 강자
페이지 레이아웃
Grid는 페이지의 거시적 구조를 정의하는 데 빛을 발합니다:
.page-layout {
display: grid;
grid-template-columns: 260px 1fr;
grid-template-rows: 64px 1fr auto;
grid-template-areas:
"sidebar header"
"sidebar main"
"sidebar footer";
min-height: 100vh;
}
.sidebar { grid-area: sidebar; background: #0f172a; }
.header { grid-area: header; border-bottom: 1px solid #e2e8f0; }
.main { grid-area: main; padding: 32px; }
.footer { grid-area: footer; }
<div class="page-layout">
<aside class="sidebar">...</aside>
<header class="header">...</header>
<main class="main">...</main>
<footer class="footer">...</footer>
</div>
명명된 그리드 영역은 레이아웃 의도를 명확하고 읽기 쉽게 만듭니다. 사이드바를 왼쪽에서 오른쪽으로 이동하는 것은 CSS 한 줄 변경으로 가능합니다.
반응형 이미지 갤러리
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
}
.gallery-item {
aspect-ratio: 1;
overflow: hidden;
border-radius: 8px;
}
.gallery-item img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
.gallery-item:hover img {
transform: scale(1.05);
}
repeat(auto-fill, minmax(200px, 1fr))는 CSS에서 가장 강력한 한 줄 중 하나입니다. 각각 최소 200px 너비이고 사용 가능한 공간을 채우도록 확장되는 최대한 많은 열을 만듭니다. 기본 반응성을 위한 미디어 쿼리가 필요 없습니다.
대시보드 그리드
.dashboard {
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-template-rows: auto;
gap: 24px;
padding: 32px;
}
.stat-card {
grid-column: span 3; /* 각 통계는 12열 중 3열 차지 */
}
.chart-large {
grid-column: span 8;
grid-row: span 2;
}
.chart-small {
grid-column: span 4;
}
/* 반응형: 좁은 화면에서 스택 */
@media (max-width: 768px) {
.dashboard {
grid-template-columns: 1fr;
}
.stat-card,
.chart-large,
.chart-small {
grid-column: span 1;
grid-row: span 1;
}
}
Grid와 Flexbox 조합하기
가장 강력한 레이아웃은 두 시스템을 함께 사용합니다. Grid는 거시적 레이아웃(섹션들이 페이지에서 어디에 위치하는지)을 처리하고, Flexbox는 미시적 레이아웃(각 섹션 내부에서 항목들이 어떻게 배열되는지)을 처리합니다.
/* 페이지 구조에 Grid 사용 */
.app {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 64px 1fr;
min-height: 100vh;
}
/* 헤더 내부 항목에 Flexbox 사용 */
.header {
grid-column: 2;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 32px;
border-bottom: 1px solid #e2e8f0;
}
/* 메인 콘텐츠 영역에 Grid 사용 */
.main {
grid-column: 2;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 24px;
padding: 32px;
align-content: start;
}
/* 각 카드 내부 항목에 Flexbox 사용 */
.card {
display: flex;
flex-direction: column;
border: 1px solid #e2e8f0;
border-radius: 12px;
overflow: hidden;
}
2026년 최신 CSS 레이아웃 기능
Subgrid
Subgrid는 이제 광범위하게 지원되며, 부모 그리드에 정렬해야 하는 중첩 그리드 문제를 해결합니다:
.card-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.card {
display: grid;
grid-row: span 3;
grid-template-rows: subgrid; /* 부모 그리드의 행 트랙 사용 */
}
컨테이너 쿼리
컨테이너 쿼리는 컴포넌트가 뷰포트가 아닌 컨테이너 크기에 반응하도록 합니다 — 진정으로 모듈화된 재사용 가능한 레이아웃 구현:
.card-container {
container-type: inline-size;
container-name: card;
}
.card {
display: flex;
flex-direction: column;
}
@container card (min-width: 400px) {
.card {
flex-direction: row; /* 컨테이너가 충분히 넓을 때 가로로 전환 */
}
}
빠른 참조: 언제 무엇을 쓸까?
| 상황 | 사용 |
|---|---|
| 네비게이션 바 | Flexbox |
| 단일 요소 중앙 정렬 | Flexbox |
| 동일 크기 카드 행 | Flexbox (wrap 포함) |
| 페이지 수준 구조 (사이드바 + 메인) | Grid |
| 이미지 갤러리 | Grid |
| 크기가 다른 위젯이 있는 대시보드 | Grid |
| 카드 내부 항목 | Flexbox |
| 복잡한 폼 레이아웃 | Grid |
| 버튼 그룹 | Flexbox |
| 헤더/사이드바/메인/푸터 레이아웃 | Grid |
실용적인 팁
- 페이지 구조에 Flexbox를 사용하지 마세요. 작동하긴 하지만 Grid가 이를 위해 설계되었습니다. Grid는 의도를 명확하게 합니다.
- 간단한 행/열 정렬에 Grid를 사용하지 마세요. 간단한 사용 사례에는 Flexbox의 오버헤드가 더 낮습니다.
- 마진 대신
gap을 사용하세요. Grid와 Flexbox 모두 항목 사이의 일관된 간격을 위한gap을 지원합니다. - 비례 열에는
fr단위를 사용하세요.1fr 2fr은 어떤 화면 크기에서도 작동하는 1:2 비율을 제공합니다. - 브라우저 개발자 도구에서 레이아웃을 검사하세요. Chrome과 Firefox 모두 뛰어난 Grid 및 Flexbox 오버레이 인스펙터를 제공합니다.
Flexbox와 Grid 모두 마스터하는 것은 개발할 수 있는 가장 높은 수익률을 가진 CSS 기술 중 하나입니다. 두 가지를 함께 사용하면 현대 웹 개발에서 마주치는 거의 모든 레이아웃 과제를 해결할 수 있습니다. 핵심은 어떤 도구를 사용해야 할지 아는 것입니다 — 이제 여러분은 그것을 알고 있습니다.