테이블

TanStack Table / AG Grid

추천

TanStack Table

사이트 디자인에 맞추기 쉽고 shadcn/ui와 함께 쓸 수 있습니다. 행이 수만 개나 되는 표라면 AG Grid를 검토하세요

결과 비교

같은 것을 각 라이브러리로 만들었습니다. 직접 만져 보세요.

TanStack Table
AG Grid

코드 비교

코드를 고치면 오른쪽 미리보기가 바로 바뀝니다.

import {
  createColumnHelper,
  createSortedRowModel,
  rowSortingFeature,
  tableFeatures,
  useTable,
} from "@tanstack/react-table"

type Employee = { name: string; department: string; joined: number }

// 표에 표시할 데이터
const employees: Employee[] = [
  { name: "김민준", department: "영업", joined: 2019 },
  { name: "이서연", department: "개발", joined: 2021 },
  { name: "박지훈", department: "개발", joined: 2023 },
  { name: "최수아", department: "인사", joined: 2020 },
]

// 사용할 기능 (정렬)
const features = tableFeatures({
  rowSortingFeature,
  sortedRowModel: createSortedRowModel(),
})

// 열 설정: 어느 열에 무엇을 표시할지
const helper = createColumnHelper<typeof features, Employee>()
const columns = helper.columns([
  helper.accessor("name", { header: "이름" }),
  helper.accessor("department", { header: "부서" }),
  helper.accessor("joined", { header: "입사 연도" }),
])

export default function App() {
  const table = useTable({ features, columns, data: employees })

  return (
    <div className="overflow-hidden rounded-xl border bg-background">
    <table className="w-full text-sm">
      <thead>
        {table.getHeaderGroups().map((group) => (
          <tr key={group.id} className="bg-muted/50">
            {group.headers.map((header) => (
              <th
                key={header.id}
                onClick={header.column.getToggleSortingHandler()}
                className="cursor-pointer px-4 py-2.5 text-left font-medium text-muted-foreground select-none hover:text-foreground"
              >
                <table.FlexRender header={header} />
                {header.column.getIsSorted() === "asc" && " ▲"}
                {header.column.getIsSorted() === "desc" && " ▼"}
              </th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody>
        {table.getRowModel().rows.map((row) => (
          <tr key={row.id} className="hover:bg-muted/30">
            {row.getAllCells().map((cell) => (
              <td
                key={cell.id}
                className="border-t px-4 py-2.5"
              >
                <table.FlexRender cell={cell} />
              </td>
            ))}
          </tr>
        ))}
      </tbody>
    </table>
    </div>
  )
}

비교

2026년 10월 기준

TanStack Table

추천공식 사이트 ↗

특징

정렬, 필터 같은 "계산"만 맡습니다. <table>과 스타일은 직접 쓰므로 디자인을 자유롭게 정할 수 있습니다

이럴 때 좋아요

shadcn/ui와 함께 쓰는 등 사이트 디자인에 맞춘 테이블을 만들고 싶을 때. shadcn/ui의 Data Table도 이것으로 만들어져 있습니다

특징

데이터를 넘기기만 하면 정렬, 열 너비 조절, 스크롤 등이 갖춰진 테이블이 나옵니다. Excel 같은 표를 잘 만듭니다

이럴 때 좋아요

관리 화면에서 행이 아주 많은 표나 표 안에서 바로 편집하고 싶을 때. 디자인보다 기능이 중요할 때