CSS Grid로 복잡한 대시보드 레이아웃 구현하기

문제 상황

기존 관리자 대시보드는 Flexbox로 구현되어 있었는데, 위젯 배치가 복잡해지면서 코드 관리가 어려워졌다. 특히 반응형 처리를 위해 미디어 쿼리마다 order 속성을 변경하는 게 번거로웠다.

CSS Grid 도입

CSS Grid는 IE11을 제외하면 브라우저 지원이 충분해서 도입을 결정했다. 우리 서비스는 IE11 사용자가 5% 미만이었다.

.dashboard {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 20px;
  padding: 20px;
}

.widget-large {
  grid-column: span 2;
}

@media (max-width: 768px) {
  .widget-large {
    grid-column: span 1;
  }
}

주요 개선 사항

1. 명시적인 레이아웃 구조

Flexbox는 1차원 레이아웃이라 행과 열을 동시에 다루기 어려웠다. Grid는 2차원 레이아웃이라 한눈에 구조가 파악된다.

2. 반응형 처리 간소화

auto-fitminmax()를 사용하면 미디어 쿼리 없이도 자동으로 열 개수가 조정된다. 코드량이 약 40% 줄었다.

3. 갭 처리

기존에는 마진으로 처리해서 첫/마지막 요소 예외 처리가 필요했는데, gap 속성으로 깔끔하게 해결됐다.

남은 과제

IE11 사용자를 위한 폴백은 @supports 쿼리로 처리했다. Flexbox로 기본 레이아웃만 유지되도록 했고, 완벽하진 않지만 사용에는 문제없는 수준이다.

@supports not (display: grid) {
  .dashboard {
    display: flex;
    flex-wrap: wrap;
  }
}

다음에는 grid-template-areas를 활용해서 더 복잡한 레이아웃도 시도해볼 예정이다.

CSS Grid로 복잡한 대시보드 레이아웃 구현하기