안녕하세요! 겉으로 보이는 화려한 디자인보다, 보이지 않는 곳에서 묵묵히 돌아가는 견고한 로직의 아름다움을 사랑하는 프론트엔드 사수, 웹 개발자입니다.
지난 4편에서는 애플(Apple) 웹사이트처럼 눈을 뗄 수 없게 만드는 화려한 애니메이션과 마이크로 인터랙션의 세계를 탐험했습니다. 아마 당장이라도 포트폴리오에 적용해 보고 싶은 마음이 굴뚝같으실 텐데요. 하지만 오늘은 분위기를 조금 반전시켜서, 화려한 껍데기 뒤에 숨겨진 프론트엔드의 아주 깊고 어두운, 하지만 반드시 알아야만 하는 '진짜 실력'에 대해 이야기해 보려고 합니다.
바로 '웹 접근성(Accessibility, 일명 A11y)'과 이를 완벽하게 해결해 주는 마법의 뼈대, 'Headless UI(헤드리스 UI)'에 대한 이야기입니다. 2026년 현재, 왜 접근성을 지키는 것이 기업의 돈이 되고 개발자의 몸값을 올리는 무기가 되는지 아주 쉽고 깊게 파헤쳐 보겠습니다.

1. 접근성(A11y), 단순한 배려가 아니라 '돈'이자 '법'입니다
개발자들 사이에서 'a11y'라고 불리는 웹 접근성(Accessibility의 a와 y 사이에 11개의 알파벳이 있다는 뜻)은 무엇일까요? 시력이 좋지 않은 분들을 위해 글자를 읽어주는 '스크린 리더(Screen Reader)'를 지원하고, 마우스를 쓰기 불편한 분들을 위해 '키보드(Tab 키, 방향키 등)만으로도' 웹사이트의 모든 기능을 이용할 수 있게 만드는 것을 말합니다.
과거에는 이를 그저 "시간 남을 때 챙기면 좋은 착한 배려" 정도로 치부했습니다. 하지만 지금은 다릅니다. 전 세계적으로 고령화가 가속화되면서, 접근성을 지키지 않은 쇼핑몰은 수백만 명의 잠재 고객(구매력 있는 시니어 층)을 경쟁사에 뺏기는 꼴이 됩니다. 게다가 미국이나 유럽, 그리고 국내에서도 대기업이나 공공기관 웹사이트가 접근성 지침을 위반하면 엄청난 금액의 소송을 당하거나 벌금을 물게 됩니다. 즉, 접근성을 지키는 코드를 짤 줄 안다는 것은 곧 회사에 돈을 벌어다 주고 법적 리스크를 막아주는 '에이스 개발자'라는 뜻입니다.
2. "모달 창 하나 띄우는 게 이렇게 어렵다고?" – 생짜 코딩의 악몽
웹 접근성이 얼마나 맞추기 까다로운지, 우리가 흔히 쓰는 '모달 창(팝업 창)'을 예로 들어보겠습니다. 화면 한가운데에 네모난 박스를 띄우는 것, CSS로 position: fixed 주고 z-index 높이면 10분 만에 뚝딱 만들 수 있죠?
하지만 이건 비장애인 마우스 사용자 기준입니다. 접근성을 지키려면 눈에 보이지 않는 무시무시한 자바스크립트 로직들을 전부 직접 짜야 합니다.
- 포커스 트랩 (Focus Trap)의 지옥: 모달 창이 켜졌을 때, 사용자가 키보드의 Tab 키를 누르면 어떻게 될까요? 초점이 모달 창 안의 '확인', '취소' 버튼을 왔다 갔다 해야 합니다. 그런데 만약 로직을 제대로 안 짜면, 초점이 모달 창 뒤에 있는 반투명한 배경(본문)의 링크들로 넘어가 버립니다. 시각장애인 분들은 스크린 리더가 갑자기 생뚱맞은 본문을 읽어주니 혼란에 빠지게 되죠. 이걸 막으려면 자바스크립트로 "모달이 열리면 포커스를 가두고, 마지막 버튼에서 Tab을 누르면 다시 첫 번째 버튼으로 돌아가라"는 엄청나게 복잡한 로직을 구현해야 합니다.
- 키보드 이벤트와 ARIA 속성: 모달이 열려있을 때 키보드의 ESC 키를 누르면 자연스럽게 창이 꺼져야 합니다. 또한, 스크린 리더기에게 "지금 화면에 떠 있는 건 일반 박스가 아니라 '대화상자(Dialog)'야!"라고 알려주기 위해 HTML 태그에 aria-modal="true", role="dialog" 같은 긴 꼬리표를 달아주어야 합니다.
디자인은 10분이면 끝나는데, 이 놈의 접근성 로직을 맞추느라 이틀 밤을 꼬박 새우는 것이 과거 프론트엔드 개발자들의 서글픈 현실이었습니다.
3. "껍데기는 버렸다, 완벽한 뼈대만 제공하마" – Headless UI의 등장
이 끔찍한 고통을 끝내기 위해 천재 개발자들이 모여 새로운 패러다임을 제시했습니다. 바로 Headless UI(머리가 없는 UI) 입니다. 대표적으로 Radix UI(래딕스 UI), Headless UI, Zag.js 등이 있습니다.
왜 '머리(Head)'가 없다고 할까요? 여기서 머리는 '디자인(CSS)'을 뜻합니다. 즉, 껍데기는 단 1%도 없고, 오직 위에서 말한 포커스 트랩, 키보드 방향키 이동, 스크린 리더 호환 같은 '보이지 않는 접근성 로직'만 완벽하게 100% 짜놓은 투명한 뼈대 컴포넌트입니다.
이게 왜 엄청난 혁명일까요? 지난 3편에서 다룬 'Shadcn UI'가 바로 이 Radix UI를 기반으로 만들어졌습니다. 개발자는 Radix UI가 제공하는 투명하고 완벽한 뼈대 위에, 그저 자신이 원하는 '테일윈드 CSS' 물감만 쓱쓱 칠해주면 끝나는 것입니다.

4. 코드 한 줄로 해결하는 마법의 로직 분석
실제로 Radix UI의 모달(Dialog) 컴포넌트 구조를 보면, 접근성 로직이 어떻게 추상화되어 있는지 감탄이 절로 나옵니다. 이 코드를 한글로 쉽게 풀어서 설명해 드릴게요.
[Radix UI Dialog 기본 뼈대]
import * as Dialog from '@radix-ui/react-dialog';
export default function MyModal() {
return (
// 1. Root: 모든 상태(열림/닫힘)를 관리하는 총사령관
<Dialog.Root>
// 2. Trigger: 모달을 여는 스위치 역할 (엔터키, 스페이스바 반응 자동 탑재)
<Dialog.Trigger>프로필 수정하기</Dialog.Trigger>
// 3. Portal: 모달을 HTML 구조의 최상단(body 끝)으로 강제 이동시켜 z-index 꼬임을 방지
<Dialog.Portal>
// 4. Overlay: 모달 뒤에 깔리는 까만 반투명 배경 (클릭 시 모달 닫힘 로직 자동 탑재)
<Dialog.Overlay className="bg-black/50 fixed inset-0" />
// 5. Content: 실제 모달 내용물이 들어가는 곳 (포커스 트랩, ESC 닫힘 자동 탑재)
<Dialog.Content className="fixed bg-white p-6 rounded-lg">
<Dialog.Title>프로필 수정</Dialog.Title>
<Dialog.Description>여기에 내용을 입력하세요.</Dialog.Description>
// 6. Close: 모달을 닫는 X 버튼
<Dialog.Close>저장하고 닫기</Dialog.Close>
</Dialog.Content>
</Dialog.Portal>
</Dialog.Root>
);
}
이 코드를 보시면, 자바스크립트로 isOpen, setIsOpen 같은 상태(State)를 만들거나 if 문을 쓸 필요가 아예 없습니다. <Dialog.Root>가 알아서 열고 닫는 로직을 통제합니다. 그리고 <Dialog.Content> 안쪽으로 들어오는 순간, 마법처럼 포커스 트랩이 작동하여 Tab 키가 모달 창 밖으로 절대 빠져나가지 않습니다. ESC 키를 누르거나 까만 배경(<Dialog.Overlay>)을 클릭하면 알아서 창이 닫힙니다. 스크린 리더는 <Dialog.Title>을 읽고 시각장애인에게 현재 어떤 창이 떴는지 친절하게 음성으로 안내합니다.
우리는 이 완벽하게 짜인 부품들을 가져와서 className에 테일윈드로 색깔만 입혀주면, 전 세계 웹 접근성 표준(W3C)을 100% 통과하는 글로벌 스탠다드 컴포넌트를 단 5분 만에 만들어낼 수 있는 것입니다.
마무리하며: 보이지 않는 것을 볼 줄 아는 개발자
디자인만 번지르르하게 깎아놓고 Tab 키조차 먹히지 않는 웹사이트를 만드는 개발자와, 화려함은 조금 덜하더라도 누구나 소외당하지 않고 평등하게 이용할 수 있는 웹 접근성 로직을 짤 줄 아는 개발자. 만약 여러분이 CTO(기술 책임자)라면 과연 누구를 채용하시겠습니까?
Headless UI는 단순한 라이브러리가 아닙니다. 프론트엔드 개발자가 본연의 역할인 '모든 사용자를 위한 탄탄한 사용자 경험(UX) 구축'에 집중할 수 있도록 도와주는 궁극의 무기입니다.
지금까지 트렌디하고 세밀한 UI 오픈소스들을 살펴보았습니다. 하지만 실무에서 모든 프로젝트가 화려하고 힙할 필요는 없죠? 다음 제6편에서는, 방대한 데이터를 다루는 사내 관리자 페이지(어드민)나 B2B 시스템을 만들 때 영원한 국밥처럼 쓰이는 거대 프레임워크, 'MUI와 Ant Design'에 대한 아주 현실적이고 실무적인 비교 분석으로 찾아오겠습니다. 다음 포스팅도 기대해 주세요!
(지금까지 웹 접근성(A11y)과 Headless UI의 개념에 대해 알아보았습니다. 본 포스팅은 제가 직접 실무에서 웹 접근성 심사를 통과하며 겪은 치열한 트러블슈팅 경험을 바탕으로 작성되었습니다. 실제 서비스 배포 시에는 스크린 리더기를 통한 직접적인 QA 테스트를 병행하시기를 권장합니다.)
[UI/IX 컴포넌트 오픈소스 #06] "B2B와 사내 어드민의 영원한 국밥", MUI와 Ant Design 비교 분석
`안녕하세요! 화려한 겉모습보다 비즈니스의 복잡한 문제를 묵묵히 해결해 내는 '실무 최적화 로직'을 사랑하는 웹 개발자입니다.우리는 지난 1편부터 5편까지 테일윈드(Tailwind), Shadcn UI, 그리고
code-bricks.tistory.com