-
Notifications
You must be signed in to change notification settings - Fork 8
프론트엔드 접근성 개선 보고서
코드잽 서비스에서는 다음과 같은 핵심 플로우를 선정해보았습니다.
로그인 → 템플릿 작성 페이지 이동 → 템플릿 작성 → 작성한 템플릿 조회
햄버거 메뉴가 div로 되어있어 키보드 tab으로 접근 시 포커스가 가지 않았고 스크린리더가 읽지 못했다.
→ 해당 컴포넌트를 button 태그로 변경 후 aria-label을 추가한다
- 실제 개선 과정과 결과
before
-.mov
after
-.mov
화면에는 ‘+’ 기호와 새 템플릿이 함께 있어서 해당 버튼이 ‘새 템플릿 추가’ 버튼임을 알 수 있으나 스크린리더에는 ‘새 템플릿’ 만 읽힌다.
→ aria-description='템플릿 작성 페이지로 이동됩니다.’ 를 추가하고, puls 아이콘의 aria-label을 제거한다
- 실제 개선 과정과 결과
before
-.mov
after
-.mov
아이디, 비밀번호 Input에 포커스 시, 요구사항에 대한 설명을 하지 않고 있다. 또한 비밀번호 입력 필드에 있는 비밀번호 보기 버튼(눈 아이콘)에 대해서도 안내하고 있지 않다.
→ 기존에는 placeholder가 없었다. 따라서 placeholder를 추가하고, 해당 placeholder에 아이디, 비밀번호 입력 필드 안내 및 요구사항을 추가하였다. 그리고 placeholder 스타일을 투명하게 주어 육안으로는 보이지 않되 보이스 오버가 인식할 수 있게 해주었다.
→ button
태그를 추가하고 해당 버튼에 aria-label 달아 비밀번호 보기 버튼
이라고 보이스 오버가 읽도록 하였다.
placeholder='아이디 입력. 1자에서 255자의 올바른 문자를 입력해주세요’
placeholder='비밀번호 입력. 영문자, 숫자를 포함한 8자에서 16자의 비밀번호를 입력해주세요.'
- 실제 개선 과정과 결과
before
-.mov
after <1차 개선 - placeholder 추가하여 입력 필드가 어디인지 읽어주기, 비밀번호 버튼 읽어주기>
default.mov
<2차 개선 - 각 입력 필드의 요구사항 읽어주기>
-.mov
기존에는 사용자가 태그를 등록하더라도 스크린리더가 이를 인식하지 못해 사용자가 등록 여부를 알 수 없는 문제가 있었습니다. 이는 특히 시각장애 사용자들에게 큰 불편을 초래할 수 있는 문제였는데요. 예를 들어, 사용자가 여러 태그를 추가하는 상황에서 현재 등록된 태그 목록을 파악하기 어려워 의도하지 않은 중복 태그를 추가할 가능성도 있었습니다.
→ 태그 등록 시 스크린리더가 "태그가 등록되었다"는 알림을 제공하도록 기능을 추가하였습니다. 이를 통해 사용자는 태그 등록 여부를 실시간으로 파악할 수 있게 되었습니다.
예를 들어, 템플릿의 태그가 생성되었을 때 해당 태그가 생성되었음을 알려야했습니다. 이를 화면에는 보이진 않지만 스크린 리더가 읽어주는 요소를 만들도록 하였습니다.
// TagInput.tsx
const { updateScreenReaderMessage } = useScreenReader();
// ...
updateScreenReaderMessage(`${value} 태그 등록`);
// index.tsx
<HeaderProvider>
<GlobalStyles />
<RouterProvider router={router} />
<ScreenReaderOnly />
</HeaderProvider>
// ScreenReacerOnly.tsx
const ScreenReaderOnly = () => (
<div
id='screen-reader'
aria-live='polite'
aria-hidden='true'
style={{
position: 'absolute',
width: '1px',
height: '1px',
margin: '-1px',
padding: '0',
border: '0',
overflow: 'hidden',
clip: 'rect(0, 0, 0, 0)',
whiteSpace: 'nowrap',
wordWrap: 'normal',
}}
/>
);
export default ScreenReaderOnly;
// useScreenReader.ts
import { useCallback } from 'react';
export const useScreenReader = () => {
const updateScreenReaderMessage = useCallback((message: string) => {
const element = document.getElementById('screen-reader');
if (element) {
element.setAttribute('aria-hidden', 'false');
element.textContent = message;
setTimeout(() => {
element.setAttribute('aria-hidden', 'true');
element.textContent = '';
});
}
}, []);
return { updateScreenReaderMessage };
};
- 실제 개선 과정과 결과
before
-.mov
after
-.mov
템플릿 작성 시, 필요하지 않은 상황에서도 스크린리더가 카테고리 작성 팁을 읽는 문제가 있었습니다. 이로 인해 사용자는 불필요한 정보를 듣게 되어 혼란을 겪었으며, 작업 흐름이 끊기는 경험을 하였습니다.
→ 스크린리더가 작성 팁이 화면에 표시될 때만 이를 읽도록 개선하였습니다. 이를 통해 불필요한 정보 전달을 줄이고, 사용자가 작업에 집중할 수 있도록 했습니다.
- 실제 개선 과정과 결과
before
-.mov
after
-.mov
→ isSourceCodeOpen 여부에 따라 aria-label 읽도록 설정해주었습니다. 소스코드 접기
또는 소스코드 펼치기
로 읽습니다.
- 실제 개선 결과
after
default.mov
- 백엔드 코드 컨벤션
- 백엔드 기술 스택 및 선정 이유
- 각종 인스턴스 설정 파일 및 구성 위치 가이드
- 1.1.2 버전 ERD (24.09.27)
- 백엔드 CI CD 동작 프로세스
- 로컬 DB 환경 설정
- 백엔드 로깅 전략
- 백엔드 로그 모니터링 구성도
- 스프링 메트릭 모니터링 구성도
- Flyway 로 스키마 관리
- 코드잽 서버 구성도
- Git Submodule 사용 메뉴얼
- 프론트엔드 코드 컨벤션
- 프론트엔드 기술 스택 및 선정 이유
- 프론트엔드 서비스 타겟 환경 및 브라우저 지원 범위 선정
- 프론트엔드 모니터링 및 디버깅 환경 구축
- 프론트엔드 테스트 목록
- 프론트엔드 라이브러리 기술 검토
- 프론트엔드 개발서버, 운영서버 빌드 및 배포 환경 구분
- 목표했던 타겟 환경과 디바이스에서 서비스 핵심 기능 동작 확인
- 프론트엔드 접근성 개선 보고서
- EC2 로그 확인 방법
- VSCode를 통한 EC2 인스턴스 SSH 연결 방법
- 터미널을 통한 EC2 인스턴스 SSH 연결 방법
- NGINX 설정 파일 접근 및 적용 방법
- DB 접속 및 백업 방법
- [QA] 배포 전 체크리스트
- CI 파이프라인 구축
- CD 파이프라인 구축
- 백엔드 CI CD 트러블슈팅
- Lombok Annotation Processor 의존성을 추가한 이유
- 2차 스프린트 기준 ERD
- DTO 검증하기
- ProblemDetail
- Fork된 레포지토리 PR에서 CI Secrets 접근 문제 해결
- AWS CloudWatch 모니터링
- 스프링 메트릭 모니터링 구축 방법
- 로깅과 Logback에 대해 알아보아요.
- 백엔드 CD 파이프라인 Ver.2
- 요청, 응답 로그에 correlationId 를 추가하자!
- 3차 스프린트 기준 ERD
- 더미데이터 생성하고 실행하기
- 쿼리 성능 개선 결과
- 테이블별 인덱스 설정 목록
- 사용자 증가 시 발생할 수 있는 문제 상황과 개선 방안
- k6를 사용한 서버 부하 테스트
- 6차 스프린트 기준 ERD
- Query Performance Improvement Results
- 테스트 전략 및 CI 설정
- CI CD 구조
- 배포 전, 로컬에서 로그인 기능 포함 테스트해보는 법
- stylelint 적용기
- 내 작업 브랜치 중간에 Merge된 동료의 작업물을 넣고 싶다면 pull vs rebase
- [TS] Webpack config
- [TS] Webpack 환경에서 MSW v2 이슈
- [TS] webpack에서 react‐router‐dom 적용 안됨
- 2024.07.28 새 기획 회의
- 2024.07.26 2차 데모데이 후 회의
- 2024.07.11 백엔드 논의 좀 할게요
- 2024.07.11 백엔드 ERD 회의
- 2024.07.09 깃 브랜치 전략, PR 템플릿 회의
- 2024.07.03 주제 선정 회의
- 2023.07.03 팀빌딩데이 킥오프 회의
- 2023.08.07 3차 스프린트 중간회고