본문으로 건너뛰기
b.BEOMSEOKPORTFOLIO

HOW I WORK

문제를 이해하고,
더 나은 방법을 고민합니다.

일하는 방식

문제의 원인을 파악하고 개선하는 과정에서, 다른 개발자도 쉽게 이해하고 유지보수할 수 있도록 코드를 작성합니다.

01문제 분석 · 접근성 개선 제안

문제의 원인을 찾고 개선을 제안합니다

문제
디자인시스템 컴포넌트의 접근성 정보가 부족해 E2E 테스트에서 컴포넌트를 찾기 어려웠습니다.
조사
전체 컴포넌트의 접근성 속성을 조사하고, 개선이 필요한 항목을 정리했습니다.
제안
접근성 테스트 예시와 디자인시스템 컴포넌트별 개선안을 작성해 공유했습니다.
결과
제안한 개선안이 반영되어, 디자인시스템 33종 컴포넌트에 필요한 role·ARIA 속성이 적용되었습니다.
접근성 Role.mdMarkdown

role 속성과 테스트 코드의 연관성

프론트엔드에서 e2e 테스트 코드를 작성하는 방법에는 크게 세 가지가 있습니다.

// 1. html 태그와 css 선택자로 탐색
const repeatSettingModal = page.locator('section#repeat-setting-modal');

// 2. test-id 부여
await page.getByTestId('repeat-select').click();

// 3. 접근성 role을 통해 탐색
await page.getByRole('button', { name: '일정 추가' }).click();

1번 방법의 경우, 복잡한 구조의 태그는 쉽게 찾을 수 없다는 단점이 있습니다.

2번 방법의 경우, 테스트가 필요한 모든 컴포넌트에 data-testid 속성을 넘겨주어야 하는 번거로움이 있습니다.

사용자관리 전화번호 입력 예시
// 사용자관리 테이블 최상단에 전화번호를 입력
await page
  .locator('section')
  .locator('table')
  .locator('tbody')
  .locator('input[placeholder="휴대전화"]')
  .fill('010-1234-5678')

// 접근성 role을 사용하여 탐색할 경우
await page
  .getByRole('textbox', { name: '휴대전화' })
  .fill('010-1234-5678')

접근성을 사용할 경우, 위처럼 role 속성과 Accessible Name 값을 통해 쉽게 테스트 코드를 작성할 수 있습니다.

디자인 시스템 Role 정의

현재 하이웍스 디자인시스템에서 role 속성이 정의되어 있지 않거나, 논의가 필요한 컴포넌트는 다음과 같습니다.

(경영 플랫폼을 기준으로 정리하였습니다.)

컴포넌트정리한 Role 기준
Autocompletecombobox
DatePickercombobox · TableDatePicker는 button
↳ DatePicker - Calendardialog · 내부 요소에 aria-label 추가
……
직접 작성한 접근성 Role 문서에서 테스트 코드와 컴포넌트별 Role 기준을 발췌, 표는 일부 항목만 표시
02주석 · 의도와 판단 기준

코드와 주석으로 의도를 전달합니다

공통 훅의 동작 조건과 반환값의 의미를 주석으로 설명하고, 판단의 근거가 되는 정책 문서를 함께 연결했습니다. 다른 개발자가 구현 전체를 살펴보지 않아도 코드의 역할과 설계 의도를 파악할 수 있도록 했습니다.

코드를 읽는 사람이 구현 의도와 판단 기준을 이해할 수 있도록 합니다.

useActionButtonValidator.tsTypeScript
/** * @description * 게시물과 사용자 권한을 기준으로 버튼 표시 여부를 계산합니다. * * 상세 로직은 {@link [사내 문서 URL] 권한별 기능정의}에서 확인할 수 있습니다. * * @returns * - 버튼별 표시 여부: 각 버튼의 `isVisible` 값 * - `movableBoardList`: `MoveButton`의 이동 가능한 게시판 목록 * - `shareableBoardList`: `ShareButton`의 공유 가능한 게시판 목록 */export const useActionButtonValidator = ({ postDetail }: Props): ActionButtonsValidation => {  const userInfo = useAuth()?.data;
2025.03.26 작성한 주석과 코드 일부를 발췌, 사내 문서 URL은 제외
03컴포넌트 설계 · 명확한 구조

코드만 봐도 구조를 이해할 수 있게 설계합니다

일정관리 모달의 제목, 본문, 버튼 영역을 하위 컴포넌트로 나눠 조합하도록 변경했습니다. 모달을 사용하는 코드에서 각 영역의 구성이 드러나도록 정리하고, 기존 모달 28개에 적용했습니다.

다른 개발자가 코드를 쉽게 이해하고 수정할 수 있는 구조인지 항상 생각합니다.

MyCalendarFormModal.tsxTypeScript
<Modal>  <Modal.Header title={isEditMode ? '내 캘린더 수정' : '내 캘린더 만들기'} />  <Modal.Body labelWidth={125}>    <Modal.Content label="캘린더 이름">      ...    </Modal.Content>  </Modal.Body>  <Modal.Footer    onClose={() => closeModal()}    confirmButton={{ text: '저장', onClick: handleSubmit }}  /></Modal>
2025.04 · 일정관리 모달 28개에 적용 · 코드 일부 생략