이 글에서 정리하는 내용
Tailwind CSS Grid를 카드 목록, 대시보드, 사이드바 레이아웃처럼 실제 화면에서 어떻게 선택하고 조합할지 정리합니다. 기준은 Tailwind CSS v4 문법에 두고, 클래스 암기보다 레이아웃을 판단하는 순서에 초점을 맞춥니다.
- Tailwind Grid를 처음 쓸 때 헷갈리는 지점
- 카드 목록에서는 열 개수보다 반복 구조를 먼저 본다
- Flex가 아니라 Grid를 선택하는 기준
- 실무에서 자주 쓰는 Grid 클래스 조합
- 반응형 Grid를 잡을 때 먼저 정할 것
- Grid 레이아웃을 수정할 때 확인할 체크포인트
- 정리
Tailwind Grid를 처음 쓸 때 헷갈리는 지점

Tailwind CSS에서 Grid를 처음 쓰면 가장 먼저 보이는 클래스는 보통 grid, grid-cols-3, gap-4입니다. 이 조합만으로도 카드 3열 레이아웃은 빠르게 만들 수 있습니다. 문제는 실제 작업에서 레이아웃이 항상 3열로만 끝나지 않는다는 점입니다.
상품 카드가 4개일 수도 있고, 공지 카드 하나만 넓게 보여줘야 할 수도 있습니다. 모바일에서는 1열이어야 하는데 태블릿에서는 2열, 데스크톱에서는 3열이나 4열로 바뀌어야 합니다. 이때 Grid를 단순히 “몇 칸으로 나눌까”로만 보면 수정할 때마다 클래스가 덧붙고, 어느 시점부터 레이아웃 의도가 잘 보이지 않게 됩니다.
Grid를 잡을 때는 먼저 화면을 봐야 합니다. 같은 형태의 카드가 반복되는지, 행과 열의 간격이 모두 필요한지, 특정 아이템만 넓어져야 하는지, 모바일에서 어떤 순서로 쌓여야 하는지를 먼저 정해야 합니다. 그다음에 grid-cols-*, gap-*, col-span-* 같은 클래스를 붙이는 순서가 자연스럽습니다.
가장 단순한 카드 목록 구조
<section class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"> <article class="rounded-xl border border-gray-200 bg-white p-4"> <h3 class="text-base font-semibold">상품 카드</h3> <p class="mt-2 text-sm text-gray-600">상품 설명 영역</p> </article> <article class="rounded-xl border border-gray-200 bg-white p-4"> <h3 class="text-base font-semibold">상품 카드</h3> <p class="mt-2 text-sm text-gray-600">상품 설명 영역</p> </article> <article class="rounded-xl border border-gray-200 bg-white p-4"> <h3 class="text-base font-semibold">상품 카드</h3> <p class="mt-2 text-sm text-gray-600">상품 설명 영역</p> </article>
</section> 이 예시에서 중요한 부분은 :grid-cols-3보다 grid-cols-1입니다. Tailwind의 반응형 클래스는 모바일 기본값을 먼저 두고, 화면이 넓어질 때 조건을 추가하는 방식으로 읽는 것이 좋습니다. 작은 화면에서 1열로 안정적으로 쌓인 뒤, 이상에서 2열, 이상에서 3열로 바뀌는 구조입니다.
카드 목록에서는 열 개수보다 반복 구조를 먼저 본다
카드 목록을 만들 때 바로 grid-cols-3부터 붙이면 화면은 빨리 완성됩니다. 하지만 카드가 실제 데이터로 늘어나는 구조라면 열 개수보다 먼저 볼 부분이 있습니다. 카드가 모두 같은 성격인지, 카드마다 높이가 달라도 괜찮은지, 마지막 줄에 남는 카드가 어색하지 않은지입니다.
쇼핑몰 상품 목록이나 블로그 글 목록처럼 같은 형태가 반복되는 UI는 Grid와 잘 맞습니다. 각 카드를 같은 폭의 열에 넣고, 줄이 바뀌어도 간격을 일정하게 유지하기 좋기 때문입니다. 이때 grid-cols-<number>는 지정한 숫자만큼 같은 너비의 열을 만드는 역할을 합니다. 예를 들어 grid-cols-3은 3개의 동일한 column track을 만드는 식으로 이해하면 됩니다.
카드 목록에서 먼저 정할 기준
- 모바일에서 카드가 1열로 쌓여도 정보가 답답하지 않은가
- 태블릿에서 2열로 바꿨을 때 카드 너비가 너무 좁지 않은가
- 데스크톱에서 3열 또는 4열까지 늘릴 이유가 있는가
- 카드 높이가 달라도 버튼이나 가격 영역이 어색하지 않은가
카드 높이가 제각각인 문제는 Grid만으로 모두 해결되지 않습니다. Grid는 칸을 나누는 데 강하지만, 카드 내부에서 버튼을 아래로 밀거나 설명 길이를 제한하는 문제는 카드 내부 레이아웃과 함께 봐야 합니다. 예를 들어 카드 안쪽을 flex flex-col로 만들고 버튼 영역에 mt-auto를 주는 식의 조합이 필요할 수 있습니다.
<section class="grid grid-cols-1 gap-5 sm:grid-cols-2 xl:grid-cols-4"> <article class="flex min-h-64 flex-col rounded-2xl border border-gray-200 p-5"> <div class="aspect-video rounded-xl bg-gray-100"></div> <h3 class="mt-4 text-base font-semibold">카드 제목</h3> <p class="mt-2 line-clamp-2 text-sm text-gray-600">카드 설명이 길어질 수 있는 영역입니다.</p> <button class="mt-auto rounded-lg bg-gray-900 px-4 py-2 text-sm text-white">자세히 보기</button> </article>
</section> 바깥쪽 Grid는 카드가 몇 열로 배치될지를 담당하고, 안쪽 Flex는 카드 내부 요소가 어떤 순서로 밀릴지를 담당합니다. 실무에서는 이 둘을 경쟁 관계로 보지 않는 것이 좋습니다. Grid는 목록의 판을 만들고, Flex는 카드 안쪽 정렬을 마무리하는 역할로 나누면 레이아웃 수정이 덜 흔들립니다.
Flex가 아니라 Grid를 선택하는 기준
Flex와 Grid는 자주 같이 쓰이기 때문에 선택 기준이 흐려지기 쉽습니다. 단순히 “한 줄이면 Flex, 여러 줄이면 Grid”라고만 정리하면 실제 화면에서는 부족합니다. 한 줄이어도 Grid가 나을 때가 있고, 여러 개가 있어도 Flex가 더 단순한 경우가 있습니다.
상단 헤더에서 로고는 왼쪽, 메뉴는 오른쪽으로 보내는 정도라면 Flex가 간단합니다. 버튼 안에 아이콘과 텍스트를 나란히 두는 것도 Flex가 자연스럽습니다. 반대로 카드 목록, 관리자 통계 패널이미지 갤러리처럼 행과 열의 간격을 함께 제어해야 한다면 Grid가 더 잘 맞습니다.
| 상황 | 더 자연스러운 선택 | 판단 기준 |
|---|---|---|
| 버튼 안 아이콘과 텍스트 정렬 | Flex | 한 방향 정렬이 핵심입니다. |
| 헤더의 로고와 메뉴 배치 | Flex | 주축 기준으로 요소를 나누면 충분합니다. |
| 상품 카드 목록 | Grid | 여러 행과 열의 간격을 유지해야 합니다. |
| 대시보드 통계 카드 | Grid | 특정 카드가 여러 칸을 차지할 수 있습니다. |
| 좌측 필터와 우측 목록 | Grid | 고정 폭 영역과 유동 영역을 나누기 좋습니다. |
실제 작업에서는 “요소를 한 방향으로 나열하고 싶은가”와 “화면을 면 단위로 나누고 싶은가”를 먼저 봅니다. Flex는 한 방향의 정렬과 분배에 강하고, Grid는 행과 열이 함께 보이는 구조에 강합니다. 이 기준을 잡아두면 클래스 이름보다 레이아웃 의도가 먼저 보입니다.
실무에서 자주 쓰는 Grid 클래스 조합
Grid에서 자주 쓰는 조합은 많지 않습니다. 오히려 너무 많은 클래스를 한 번에 외우려고 하면 작업할 때 더 헷갈립니다. 처음에는 grid, grid-cols-*, gap-*, col-span-* 정도만 기준으로 잡아도 카드형 레이아웃 대부분을 시작할 수 있습니다.
기본 열 만들기
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"> <div class="rounded-xl border p-4">카드 1</div> <div class="rounded-xl border p-4">카드 2</div> <div class="rounded-xl border p-4">카드 3</div>
</div> 이 조합은 카드 목록의 기본형입니다. grid로 Grid 컨테이너를 만들고, grid-cols-1로 모바일 기본 1열을 잡습니다. 이후 :grid-cols-2, :grid-cols-3를 붙여 화면이 넓어질수록 열 수를 늘립니다.
gap을 함께 줄지, 나눠 줄지 결정하기
<div class="grid grid-cols-1 gap-y-5 md:grid-cols-2 md:gap-x-6 lg:grid-cols-3"> <article class="rounded-xl border p-4">카드</article> <article class="rounded-xl border p-4">카드</article> <article class="rounded-xl border p-4">카드</article>
</div> gap-*은 행과 열 간격을 함께 잡을 때 씁니다. 하지만 실제 화면에서는 세로 간격과 가로 간격을 다르게 잡아야 할 때가 있습니다. 모바일에서는 카드가 1열로 쌓이기 때문에 세로 간격이 더 눈에 띄고, 데스크톱에서는 열 사이의 가로 간격이 레이아웃 밀도에 영향을 줍니다. 이때 gap-x-*와 gap-y-*를 나눠 쓰면 의도가 더 분명해집니다.
특정 카드만 넓게 보여주기
<section class="grid grid-cols-1 gap-4 lg:grid-cols-3"> <article class="rounded-xl border p-5 lg:col-span-2"> 이번 달 주요 통계 </article> <article class="rounded-xl border p-5"> 방문자 수 </article> <article class="rounded-xl border p-5"> 문의 수 </article>
</section> col-span-*은 Grid item이 여러 열을 차지해야 할 때 씁니다. 대시보드에서 핵심 통계 카드만 크게 보여주거나, 공지 영역을 넓게 배치할 때 사용할 수 있습니다. 다만 처음부터 모든 카드에 span을 붙이면 반응형에서 배치 순서가 복잡해집니다. 기본 카드들은 동일한 폭으로 두고, 강조가 필요한 카드에만 제한적으로 붙이는 쪽이 관리하기 쉽습니다.
사이드바와 콘텐츠 영역 나누기
<div class="grid gap-6 lg:grid-cols-[240px_1fr]"> <aside class="rounded-xl border p-4"> 필터 영역 </aside> <main class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3"> <article class="rounded-xl border p-4">콘텐츠 카드</article> <article class="rounded-xl border p-4">콘텐츠 카드</article> </main>
</div> grid-cols-[240px_1fr]처럼 대괄호를 쓰는 는 기본 scale로 표현하기 어려운 구조에서 사용할 수 있습니다. 좌측 필터 영역은 240px로 고정하고, 우측 콘텐츠는 남은 공간을 차지하게 만드는 식입니다. 다만 를 많이 쓰면 클래스만 보고 프로젝트의 규칙을 파악하기 어려워질 수 있습니다. 반복되는 레이아웃이라면 나중에 컴포넌트나 별도 유틸리티로 기준을 모아두는 편이 낫습니다.
반응형 Grid를 잡을 때 먼저 정할 것
반응형 Grid는 , , 를 얼마나 많이 붙이느냐가 아니라, 어느 화면에서 정보가 답답해지는지를 보는 작업입니다. 카드 하나에 이미지, 제목, 설명, 버튼이 모두 들어간다면 2열이 되는 순간 카드 폭이 충분한지 먼저 확인해야 합니다.
Tailwind의 반응형 prefix는 지정한 breakpoint 이상에서 적용됩니다. 그래서 grid-cols-1 :grid-cols-2 :grid-cols-3는 “모바일 1열이상 2열이상 3열”로 읽어야 합니다. 이 순서를 반대로 이해하면 모바일 스타일을 나중에 덮어쓰려 하면서 클래스가 복잡해집니다.
반응형 열 수를 정하는 실무 기준
- 모바일에서는 대부분 1열을 기본으로 둡니다.
- 카드 안 텍스트가 길면 태블릿 2열에서도 답답할 수 있습니다.
- 이미지 비율이 중요한 목록은 열을 많이 늘리기보다 카드 폭을 확보해야 합니다.
- 관리자 통계 카드처럼 짧은 정보는 데스크톱에서 4열까지 늘려도 무리가 적습니다.
<section class="grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-5 2xl:grid-cols-4"> <article class="rounded-2xl border p-5"> <p class="text-sm text-gray-500">오늘 방문자</p> <strong class="mt-2 block text-2xl">1,248</strong> </article> <article class="rounded-2xl border p-5"> <p class="text-sm text-gray-500">문의 수</p> <strong class="mt-2 block text-2xl">36</strong> </article>
</section> 이런 통계 카드는 텍스트 양이 적어서 넓은 화면에서 4열까지 늘려도 정보가 크게 깨지지 않습니다. 반대로 상품 설명이나 글 요약이 긴 카드는 4열로 늘리는 순간 카드 내부가 답답해질 수 있습니다. 반응형 열 수는 화면 너비만 보고 정하지 말고, 카드 안의 정보 밀도까지 같이 봐야 합니다.
Grid 레이아웃을 수정할 때 확인할 체크포인트

Grid 레이아웃은 처음 만들 때보다 수정할 때 기준이 더 중요해집니다. 카드가 하나 추가되거나, 특정 영역이 강조되거나, 모바일에서 순서가 달라져야 하는 순간 기존 클래스 조합이 버티는지 확인해야 합니다.
먼저 컨테이너와 아이템을 나눠 봅니다. grid, grid-cols-*, gap-*은 보통 컨테이너에 들어갑니다. col-span-*, col-start-*, col-end-*는 Grid item에 들어갑니다. 이 구분이 흐려지면 어느 요소를 수정해야 하는지 찾는 시간이 길어집니다.
수정 전에 보는 순서
- 이 레이아웃이 반복 카드 목록인지, 큰 화면 분할 구조인지 확인합니다.
- 모바일 기본값이 prefix 없는 클래스로 잡혀 있는지 봅니다.
- 열 수 변경이 필요한지, gap 조정만으로 충분한지 나눕니다.
- 특정 카드만 넓어져야 한다면 span을 desktop breakpoint부터 적용할지 확인합니다.
- 가 일회성 예외인지, 반복되는 레이아웃 규칙인지 판단합니다.
<section class="grid grid-cols-1 gap-4 lg:grid-cols-4"> <article class="rounded-xl border p-5 lg:col-span-2">주요 카드</article> <article class="rounded-xl border p-5">보조 카드</article> <article class="rounded-xl border p-5">보조 카드</article>
</section> 여기서 :col-span-2처럼 breakpoint를 붙인 이유는 모바일에서 굳이 두 칸을 차지할 구조가 없기 때문입니다. 모바일은 1열이므로 모든 카드가 자연스럽게 한 줄씩 쌓이면 됩니다. 넓은 화면에서만 주요 카드가 2칸을 차지하게 하면 모바일 레이아웃과 데스크톱 레이아웃의 책임이 분리됩니다.
Grid가 깨졌을 때도 바로 클래스를 더 붙이기보다, 현재 문제가 열 수인지 간격인지 아이템 span인지부터 나누는 것이 좋습니다. 예를 들어 카드 사이가 답답하면 grid-cols가 아니라 gap 문제일 수 있고, 특정 카드가 어색하게 내려가면 col-span이 현재 열 수와 맞지 않을 수 있습니다.
정리
Tailwind CSS Grid는 클래스를 많이 아는 것보다 화면을 나누는 기준을 먼저 잡는 것이 오래 갑니다. 카드 목록이라면 반복 구조와 반응형 열 수를 먼저 보고, 대시보드라면 어떤 카드가 강조되어야 하는지 확인해야 합니다. 사이드바가 있는 화면이라면 고정 영역과 유동 영역을 나누는 기준이 필요합니다.
처음에는 grid grid-cols-1 gap-4 :grid-cols-2 :grid-cols-3 같은 조합만으로도 충분합니다. 여기서 출발해 카드 내부 정렬은 Flex로 보완하고, 특정 아이템 강조는 col-span으로 제한적으로 처리하면 됩니다. 기본 scale로 표현하기 어려운 구조에서만 grid-cols-[…] 같은 를 쓰는 식으로 범위를 정하면 클래스가 길어져도 의도를 유지하기 쉽습니다.
다음에 Grid 레이아웃을 만들 때는 클래스 이름보다 먼저 질문을 던지는 것이 좋습니다. 반복되는 목록인지, 행과 열을 모두 제어해야 하는지, 모바일 기본값이 충분한지, 넓은 화면에서 몇 열까지 늘릴지, Flex로 더 단순하게 끝낼 수 있는지부터 확인하면 됩니다. 이 순서가 잡히면 Tailwind Grid는 암기해야 할 문법이 아니라 레이아웃을 빠르게 조립하는 기준으로 바뀝니다.
같이 읽으면 좋은 글
- Tailwind CSS 실무 로드맵: 기본 클래스부터 반응형·상태·동적 클래스까지
- Tailwind CSS 클래스 감지 원리: 동적 className이 빠지는 이유
- Tailwind CSS 클래스 적용 오류 해결: 스타일이 보이지 않을 때 확인할 것
“Tailwind CSS Grid 실무 레이아웃 정리: 카드 목록부터 대시보드까지”에 대한 1개의 생각