LLM GuideMarkdown

ColumnDef 옵션

LLM 및 에이전트 워크플로우용 원문 Markdown입니다.

# @mycrm-ui/react-table LLM 가이드

## 15. ColumnDef 옵션

이 문서는 `@mycrm-ui/react-table`의 `ColumnDef`를 기준으로 컬럼 옵션을 생성하거나 수정해야 하는 AI 에이전트를 위한 가이드입니다.

이 파트는 사용자가 “이 컬럼을 정렬 가능하게 해줘”, “이 컬럼만 편집 가능해야 해”, “이 컬럼은 복사 가능해야 해”처럼 컬럼 단위 속성을 요청할 때 사용합니다.

## 목적

`ColumnDef` 파트의 목적은 개별 옵션을 외우는 것이 아니라, 요청에 맞는 옵션 묶음을 정확히 고르는 것입니다.

LLM은 `ColumnDef`를 단순 타입 목록으로 보지 말고, 아래처럼 기능별 묶음으로 해석해야 합니다.

- 기본 표시
- 정렬 / 필터
- 편집 / 행 추가
- 정렬 / 너비 / 정렬 방식
- 복사 / 검증 / 커스텀 렌더러

## 필수 입력

### 기본 표시 옵션

항상 자주 쓰는 기본 옵션:

- `key`
- `label`
- `render`

예시:

```tsx
{
  key: "name",
  label: "이름",
  render: (row) => row.name,
}
```

### 레이아웃 옵션

- `width`
- `minWidth`
- `align`

예시:

```tsx
{
  key: "price",
  label: "가격",
  width: "120px",
  minWidth: 80,
  align: "right",
  render: (row) => row.price,
}
```

### 정렬 / 필터 옵션

- `sortable`
- `filterType`
- `filterOptions`
- `filterPlaceholder`

예시:

```tsx
{
  key: "role",
  label: "역할",
  sortable: true,
  filterType: "select",
  filterOptions: [
    { label: "관리자", value: "관리자" },
    { label: "사용자", value: "사용자" },
  ],
  render: (row) => row.role,
}
```

### 편집 / 추가 옵션

- `editable`
- `insertable`
- `validate`
- `renderEditCell`
- `renderInsertCell`
- `onValidationError`

예시:

```tsx
{
  key: "email",
  label: "이메일",
  editable: true,
  insertable: true,
  validate: (value) =>
    value.trim() ? null : "필수 항목입니다.",
  render: (row) => row.email,
}
```

중요 규칙:

- `renderEditCell`은 `editing.renderCell`보다 우선합니다.
- inline error UI가 필요하면 `onValidationError`는 신중히 써야 합니다.

### 복사 옵션

- `copyable`

예시:

```tsx
{
  key: "sku",
  label: "SKU",
  copyable: true,
  render: (row) => row.sku,
}
```

## 최소 동작 패턴

```tsx
import type { ColumnDef } from "@mycrm-ui/react-table";

interface User {
  id: number;
  name: string;
  role: string;
}

const columns: ColumnDef<User>[] = [
  {
    key: "name",
    label: "이름",
    width: "160px",
    sortable: true,
    filterType: "text",
    editable: true,
    render: (row) => row.name,
    validate: (value) => (value.trim() ? null : "필수 항목입니다."),
  },
  {
    key: "role",
    label: "역할",
    render: (row) => row.role,
  },
];
```

## LLM 판단 규칙

사용자 요청이 아래 의미에 가깝다면 이 가이드를 사용합니다.

- "이 컬럼은 정렬 가능해야 해"
- "이 컬럼은 select 필터가 필요해"
- "이 컬럼만 편집 가능하게 해줘"
- "이 컬럼은 복사 가능해야 해"
- "이메일 컬럼은 validate가 필요해"

이 경우 LLM은 아래 순서로 처리합니다.

1. 사용자의 요구가 “테이블 전체 기능”인지 “특정 컬럼 옵션”인지 판단합니다.
2. 컬럼 단위 요구라면 `ColumnDef`에서 해결 가능한지 먼저 봅니다.
3. 필요한 옵션 묶음을 선택합니다.
4. 옵션 간 전제 조건을 확인합니다.

대표 전제:

- 정렬: `sortable`
- 필터: `filterType` + 필요 시 `filterOptions`
- 편집: `editable` + 필요 시 `validate`
- 추가: `insertable`
- 복사: `copyable`

## 이 파트에서 추가해도 되는 것

- 기능별 옵션 조합 예시
- 컬럼별 최소 옵션 템플릿
- 같은 컬럼에 여러 옵션을 함께 적용한 예시

## 이 파트에서 추가하지 말아야 하는 것

사용자가 명시적으로 요구하지 않았다면 아래는 한꺼번에 다 넣지 않습니다.

- `sortable`
- `filterType`
- `editable`
- `insertable`
- `copyable`

좋은 방식:

- 필요한 옵션만 추가합니다.

## 자주 하는 실수

### 실수 1. 컬럼 요청인데 테이블 전역 props를 먼저 건드림

문제점:

- 요구사항이 컬럼 단위인데 범위가 불필요하게 커집니다.

좋은 방식:

- 먼저 `ColumnDef`에서 해결 가능한지 확인합니다.

### 실수 2. `filterType: "select"`인데 `filterOptions`를 안 넣음

문제점:

- 선택지가 없어 필터 UI가 불완전합니다.

좋은 방식:

- select 필터에는 `filterOptions`를 함께 넣습니다.

### 실수 3. `insertable: true`가 필요한데 `editable`만 넣음

문제점:

- 인라인 편집은 가능하지만 행 추가 입력에는 참여하지 않습니다.

좋은 방식:

- 행 추가 요구면 `insertable`을 별도로 판단합니다.

### 실수 4. `renderEditCell`과 `onValidationError`를 같이 쓰면서 inline error UI를 기대

문제점:

- 검증 실패 흐름이 의도와 다르게 보일 수 있습니다.

좋은 방식:

- 에러 UI 전달 경로를 먼저 확인하고 옵션을 조합합니다.

## LLM 안전 출력 템플릿

컬럼 옵션 요청이 있을 때는 아래 템플릿을 우선 사용합니다.

```tsx
import type { ColumnDef } from "@mycrm-ui/react-table";

interface Row {
  id: number;
  name: string;
}

const columns: ColumnDef<Row>[] = [
  {
    key: "name",
    label: "이름",
    render: (row) => row.name,
  },
];
```

필요한 옵션만 점진적으로 추가합니다.

예시:

```tsx
{
  key: "name",
  label: "이름",
  sortable: true,
  editable: true,
  render: (row) => row.name,
}
```

## 다음 가이드로 넘어가야 하는 조건

아래 요구가 나오면 각 기능별 가이드로 이동합니다.

- 기본 사용
- 정렬
- 체크박스 선택
- 필터
- 행 삭제 / 추가
- 인라인 편집
- 툴팁 / 복사