Forms
사용자가 정보를 입력하고 제출하는 폼을 일관되게 구성해요.
폼은 설정을 바꾸거나 이슈를 만드는 것처럼 사용자가 정보를 입력하고 제출해야 할 때 써요. 폼이 길고 복잡할수록 사람들은 중간에 포기해요. 꼭 필요한 것만 묻고, 무엇을 어떻게 입력해야 하는지 처음부터 분명히 보여주는 것이 핵심이에요.
구성
- 제목 — 폼이 하는 일을 짧게 써요. 동사가 들어가면 제출 버튼에도 같은 동사를 써요. (예: "이슈 만들기" → 버튼 "만들기")
- 설명 (선택) — 폼의 목적이나 결과를 한두 문장으로 설명해요.
- 필수 항목 안내 — 필수 필드가 있다면 설명 아래에 "
*표시는 필수 항목이에요" 를 적어요. - 필드 — 라벨, 입력, 도움말(선택), 글자 수(선택), 검증 메시지.
- 섹션 (선택) — 관련 있는 필드를 묶고 소제목을 붙여요.
- 푸터 — 제출 버튼과 보조 액션.
사용하는 컴포넌트: Form, Textfield, Textarea, Select, Checkbox, Radio, Toggle, Datetime picker, Button.
레이아웃
- 한 열로 배치해요. 위에서 아래로 따라가기 쉽고, 화면 확대기를 쓰는 사람이 두 번째 열을 놓치지 않아요.
- 폼 너비는 담기는 곳(페이지, Modal dialog, Drawer)에 맞춰요.
- 필드 너비는 예상되는 입력 길이에 맞춰요. 우편번호에 긴 입력칸을 주면 오히려 헷갈려요.
| 너비 | 예 |
|---|---|
| 75px | 숫자 2~3자리, 스토리 포인트 |
| 150px | 날짜, 짧은 코드, 버전 |
| 250px | 이름, 이슈 키 |
| 350px | 이메일, 프로젝트 이름 |
| 500px | 요약, URL |
라벨
Do· 위쪽, 왼쪽 정렬
모든 입력에 보이는 라벨을 두고, 입력칸 위에 왼쪽 정렬로 놓아요.
Don't· 플레이스홀더를 라벨 대신
플레이스홀더는 입력을 시작하면 사라지고 대비도 낮아서 라벨을 대신할 수 없어요.
- 라벨은 명사로 짧게 써요. "이름을 입력하세요" 대신 "이름".
- 유일한 예외는 검색 필드예요. 돋보기 아이콘, 보이지 않는 접근성 라벨, 플레이스홀더가 함께 있으면 라벨을 생략할 수 있어요.
- 필수 필드는 라벨 뒤에 빨간 별표(
*)를 붙여요. 대부분이 필수라면 선택 필드에 "(선택)" 을 붙이는 편이 더 깔끔해요.
도움말과 검증 메시지
필드 아래에는 세 종류의 메시지가 올 수 있어요.
| 메시지 | 컴포넌트 | 언제 |
|---|---|---|
| 도움말 | HelperMessage | 입력 형식이나 조건을 미리 알려줄 때 (입력 전부터 보여요) |
| 오류 | ErrorMessage | 입력이 조건에 맞지 않을 때 |
| 확인 | ValidMessage | 사용 가능한 값임을 확인해 줄 때 (예: 사용할 수 있는 키) |
검증 시점
- 필드를 벗어날 때(blur) 검증해요. 입력하는 도중에 오류를 띄우면 사용자를 재촉하는 느낌을 줘요.
- 한 번 오류가 난 필드는 입력할 때마다 다시 검사해서, 고치는 즉시 오류가 사라지게 해요.
- 서버에서만 알 수 있는 오류(중복된 이름, 권한 없음)는 제출할 때 검증하고, 해당 필드 아래에 보여줘요.
- 제출했을 때 오류가 있으면 첫 번째 오류 필드로 포커스를 옮겨요.
오류 문구
- 무엇이 잘못됐는지보다 어떻게 고치면 되는지를 써요. "잘못된 값" 대신 "4자 이상 입력해 주세요".
- 사용자를 탓하지 않아요. "입력을 잘못했어요" 대신 상황을 담담하게 설명해요.
- 색만으로 오류를 알리지 않아요. 아이콘과 문구를 함께 보여줘요.
버튼
- 제출 버튼은 하나의 primary 로 두고, 보조 액션은 최대 하나만 둬요.
- 취소는
subtle버튼으로 낮춰요. - 페이지 폼은 왼쪽 정렬, 모달 안의 폼은 오른쪽 정렬로 버튼을 놓아요. 순서는 보조 액션 → 주 액션이에요.
- 필드가 덜 채워졌다고 제출 버튼을 비활성화하지 않아요. 왜 눌리지 않는지 알 수 없어요. 대신 누르면 빠진 필드를 알려줘요.
- 제출 중에는 버튼에
isLoading을 줘서 두 번 제출하지 않게 해요.
더 좋은 폼을 위해
- 첫 번째 필드에 자동으로 포커스를 줘요. (모달이 열릴 때 특히)
- 묻는 필드 수를 줄여요. 선택 필드는 정말 필요한지 다시 생각해요.
- 근거 있는 기본값을 채워 둬요. (예: 담당자 = 나, 우선순위 = 보통)
autocomplete속성(email,name,organization…)을 지정해서 브라우저 자동 완성을 살려요.- 새로고침하거나 실수로 닫아도 입력한 내용이 남도록 임시 저장해요.
- 모바일에서는
type="email",inputMode="numeric"처럼 입력에 맞는 키보드를 띄워요.