본문으로 건너뛰기

그룹 수업 폼을 쪼개고 검증은 브라우저에 맡기기

· 약 2분
Seung hyo, Lee
Front End Engineer @ Assistfit

11월 내내 그룹 수업 생성·수정 폼을 새로 만들었다. 항목이 많은 폼이라 처음부터 어떻게 나눌지를 먼저 정했다.

폼 구조를 상수로​

그룹 수업 관련 파일을 class/form 폴더로 모으는 것부터 했다. 그리고 폼에 어떤 섹션과 항목이 있는지를 GROUP_CLASS_FORM_ELEMENTS 상수 하나에 적었다. 각 항목의 제목과 id가 들어 있다.

왼쪽에 붙는 FormNavigation은 이 상수를 읽어 목차를 그린다. 처음에는 클릭하면 요소 위치를 계산해 window.scrollTo로 부드럽게 이동하는 핸들러를 달았다. 다음 날 Link href="#id" 앵커로 바꿨다. 스크롤 처리가 사라지니 'use client'도 지울 수 있었다. 브라우저가 해 주는 걸 굳이 JS로 다시 만들 필요가 없었다.

좌석 관리처럼 모달과 폼이 같이 봐야 하는 값(좌석 수, 이용 불가 좌석)은 Recoil 상태로 뺐다.

항목마다 자기 검증을 갖게​

마지막 주에는 수업 시간, 수업 진행 기간, 인원 설정, 운영 요일, 좌석 관리를 각각 컴포넌트로 분리했다. 검증 로직도 그 컴포넌트 안으로 들어갔다. GroupClassForm에서는 120줄 넘게 빠졌다.

검증은 별도 라이브러리 없이 HTML 기본 기능을 썼다. required, min, type="time"을 걸고 메시지만 한국어로 바꾼다.

<input
required
type="time"
id="startTime"
name="startTime"
onInput={(e) => (e.target as HTMLInputElement).setCustomValidity('')}
onInvalid={(e) =>
(e.target as HTMLInputElement).setCustomValidity('시작 시간을 입력해주세요.')
}
/>

종료 시간 input은 시작 시간이 비어 있으면 disabled이고, min을 시작 시간으로 잡아서 더 이른 시간을 고를 수 없게 했다. 수업 이름 입력에는 디바운스와 길이 제한을 넣었다.

컴포넌트를 나눠 놓고 보니 onInput, onInvalid에서 target을 캐스팅하고 메시지를 넣는 코드가 거의 같은 모양으로 반복된다. 다음 정리 대상이다.