USB 키보드 입력 원리, 손끝부터 화면까지
스위치 접점부터 HID 리포트까지, 키 하나가 이동하는 전 과정
- 키를 누르면 MCU가 매트릭스를 스캔해 신호를 잡아낸다
- 디바운싱을 거쳐야 잘못된 중복 입력이 걸러진다
- USB HID 프로토콜이 키코드를 표준 리포트로 포장한다
- 폴링레이트가 이 리포트를 PC로 보내는 주기를 결정한다
- 매트릭스 설계와 리포트 방식이 롤오버·고스팅을 좌우한다
게임 중 콤보 키가 한 박자 늦게 들어간 적이 있다면, USB 키보드 입력 원리를 한 번쯤 의심해봐야 합니다.
키보드는 그냥 스위치 덩어리가 아닙니다. 손가락이 스위치를 누른 순간부터 화면에 글자가 찍히기까지, 짧게는 5밀리초 안에 여러 단계가 순서대로 일어납니다.
이 글에서는 스위치 접점 → MCU 스캔 → 디바운싱 → USB HID 리포트 → 폴링 → 화면 표시까지, 전 과정을 단계별로 뜯어봅니다. 어디서 지연이 생기는지도 함께 짚습니다.
1. 키를 누르는 순간, USB 키보드 입력 원리는 이렇게 시작됩니다
기계식 스위치는 키캡을 누르면 내부 스템이 하강하면서 금속 접점 두 개를 맞닿게 합니다. 이 순간 회로가 닫히고, 아주 작은 전류가 흐를 통로가 생깁니다.
키보드 안에는 이 접점을 감시하는 MCU(마이크로컨트롤러)가 있습니다. 흔히 STM32나 ATmega32u4 같은 칩이 쓰이는데, 이 칩이 초당 수백~수천 번씩 전체 키를 훑습니다.
여기서 이해해야 할 게 하나 있습니다. 키보드는 키 하나하나에 전선을 따로 연결하지 않습니다. 대신 행(row)과 열(column)을 격자로 배치한 매트릭스 회로를 씁니다.
키를 누르면 해당 행과 열이 만나는 지점이 연결되고, MCU는 “몇 번 행, 몇 번 열이 눌렸다”는 좌표만 읽습니다. 이 좌표를 키맵에 대입해야 비로소 어떤 글자인지 알 수 있습니다.
키보드 특정 키만 안 눌린다면 스위치 고장보다 매트릭스 배선 문제일 가능성이 높습니다. 같은 행이나 열의 다른 키도 함께 이상한지 확인해보세요.
실수 사례도 있습니다. 저가형 키보드일수록 매트릭스 크기를 줄이려고 다이오드를 생략하는 경우가 있는데, 이러면 여러 키를 동시에 눌렀을 때 유령 입력(고스팅)이 생깁니다. 이 부분은 5번 항목에서 다시 다룹니다.
2. MCU가 스위치 신호를 코드로 바꾸는 스캔과 디바운싱
매트릭스 좌표를 읽었다고 바로 입력을 확정하지는 않습니다. 기계식 스위치 접점은 붙는 순간 미세하게 튕기는데, 이를 “바운스(bounce)”라고 부릅니다.
바운스는 보통 5~20밀리초 사이에 여러 번 접점이 붙었다 떨어졌다를 반복합니다. 이걸 그대로 읽으면 한 번 눌렀는데 “ㄱㄱㄱ”처럼 여러 번 입력된 것으로 오인됩니다.
그래서 MCU 펌웨어는 디바운싱 알고리즘을 씁니다. 신호가 일정 시간 동안 안정적으로 유지돼야 “진짜 눌림”으로 확정하는 방식입니다.
2-1. 디바운싱 시간이 타건감에 영향을 주는 이유
오픈소스 키보드 펌웨어 QMK는 기본 디바운싱 시간을 5밀리초로 설정합니다. 이 값이 너무 길면 빠르게 연타할 때 입력이 씹히고, 너무 짧으면 바운스를 오탐지합니다.
디바운싱 방식도 여러 종류입니다. 키 하나 단위로 판단하는 방식(per-key), 행 단위(per-row), 키보드 전체 단위(global)로 나뉘며 방식에 따라 반응 속도와 안정성이 갈립니다.
디바운싱이 끝나면 MCU는 해당 좌표를 키맵 테이블에서 조회해 실제 키코드로 변환합니다. 이 시점부터 신호는 “전기 신호”에서 “의미 있는 데이터”로 바뀝니다.
커스텀 키보드에서 “레이어”를 바꾸면 같은 물리 키가 다른 문자를 입력하죠. 이건 매트릭스 좌표는 그대로 두고, 키맵 조회 단계에서 다른 테이블을 참조하도록 펌웨어가 분기하기 때문입니다. 하드웨어를 안 바꿔도 소프트웨어만으로 키 배열을 완전히 재정의할 수 있는 이유입니다.
3. USB HID 프로토콜로 보는 USB 키보드 입력 원리의 핵심
키코드가 확정되면 이제 USB를 거쳐 PC로 전달할 차례입니다. 이때 쓰이는 규격이 USB HID(Human Interface Device) 클래스입니다.
HID는 키보드·마우스·게임패드처럼 사람이 직접 조작하는 장치를 위해 USB-IF가 정의한 표준 프로토콜입니다. 이 표준 덕분에 제조사가 달라도 운영체제는 별도 드라이버 없이 장치를 인식합니다.
키보드를 PC에 꽂으면 가장 먼저 “리포트 디스크립터(Report Descriptor)”라는 설명서를 주고받습니다. 이 안에는 이 장치가 어떤 데이터를, 몇 바이트로, 어떤 순서로 보낼지가 정의돼 있습니다.
이 8바이트짜리 구조가 “부트 프로토콜(Boot Protocol)”입니다. BIOS처럼 복잡한 드라이버를 못 쓰는 환경에서도 키보드를 읽을 수 있게 만든 최소 규격입니다.
부트 프로토콜은 일반 키를 동시에 6개까지만 보고합니다. 그래서 “USB 키보드는 6키 롤오버까지”라는 오해가 퍼졌는데, 이는 절반만 맞는 말입니다. 실제로는 리포트 디스크립터를 다르게 정의하면 6개 제한을 넘어설 수 있습니다. 자세한 내용은 5번 항목에서 다룹니다.
리포트 디스크립터 교환이 끝나면 운영체제는 표준 HID 드라이버를 로드합니다. 윈도우는 hidclass.sys, 리눅스는 커널 내장 HID 모듈이 이 역할을 맡아 제조사별 전용 드라이버 없이도 키보드를 바로 씁니다.
4. 폴링레이트와 인터럽트 전송, 신호는 이렇게 PC로 갑니다
HID 리포트가 준비됐다고 해서 곧바로 PC로 날아가지 않습니다. USB는 장치가 아니라 호스트(PC)가 통신 타이밍을 주도하는 구조이기 때문입니다.
키보드는 연결 시 “나를 몇 밀리초마다 확인해달라”는 값을 함께 보고합니다. 이걸 bInterval이라 부르고, 이 값의 역수가 흔히 말하는 폴링레이트입니다.
PC의 USB 컨트롤러는 이 주기에 맞춰 키보드에 “혹시 새 데이터 있어?”라고 계속 묻습니다. 이 방식을 인터럽트 전송(Interrupt Transfer)이라고 합니다.
운영체제 쪽에서는 표준 HID 드라이버가 이 리포트를 받아 처리합니다. 윈도우는 hidclass.sys라는 클래스 드라이버가 모든 HID 장치의 리포트를 공통 방식으로 해석합니다.
여기서 실수하기 쉬운 부분이 하나 있습니다. USB 허브 하나에 마우스·키보드·RGB 컨트롤러를 몰아서 꽂으면, 여러 1000Hz 장치가 같은 대역폭을 나눠 쓰면서 리포트가 밀릴 수 있습니다.
고폴링 키보드와 마우스를 함께 쓴다면 가능하면 서로 다른 USB 컨트롤러(메인보드 뒷면 포트 분산)에 연결하세요. 같은 허브에 몰아넣으면 폴링이 밀려 체감 지연이 늘어납니다.
5. N-키 롤오버와 고스팅을 막는 원리
3번 항목에서 잠깐 언급한 “6키 제한”은 부트 프로토콜에만 해당합니다. 실제로는 리포트 디스크립터를 확장하면 훨씬 많은 키를 동시에 보고할 수 있습니다.
이렇게 6개 제한을 넘어서는 방식을 N-키 롤오버(NKRO)라고 부릅니다. 모디파이어 영역 대신 키 전체를 비트맵으로 표현해서, 눌린 키 개수와 무관하게 상태를 한 번에 담습니다.
고스팅은 조금 다른 문제입니다. 매트릭스 회로에서 세 키를 특정 조합으로 동시에 누르면, 전기적으로 눌리지 않은 네 번째 키까지 회로가 연결된 것처럼 읽힐 수 있습니다.
이를 막으려면 스위치마다 다이오드를 하나씩 달아 전류가 한 방향으로만 흐르게 강제합니다. 다이오드가 없는 저가형 키보드에서 고스팅이 자주 발생하는 이유입니다.
“안티고스팅”과 “NKRO”는 자주 섞여 쓰이지만 다른 개념입니다. 안티고스팅은 잘못된 유령 입력을 막는 회로 설계 문제고, NKRO는 정상적으로 눌린 키를 몇 개까지 동시에 보고하느냐의 문제입니다. 안티고스팅 없는 NKRO도, NKRO 없는 안티고스팅도 이론상 존재할 수 있습니다.
6. 입력 지연을 줄이는 법: USB 키보드 입력 원리에서 찾는 해법
지금까지 본 과정을 이으면 전체 지연 시간이 보입니다. 스위치 접점 → 디바운싱(약 5ms) → 매트릭스 스캔 → USB 폴링(1~8ms) → OS 처리 순서입니다.
합치면 보통 10~20밀리초 안팎이 걸립니다. 사람이 반응 지연을 체감하는 문턱이 대략 20~30밀리초라는 점을 생각하면, 대부분은 크게 느끼기 어려운 수준입니다.
다만 게임처럼 초 단위 경쟁이 벌어지는 상황에서는 이 차이가 승패를 가르기도 합니다. 아래 항목부터 순서대로 점검해보세요.
1. 제조사 정품 드라이버를 설치합니다. 윈도우 기본 HID 드라이버도 동작하지만, 정품 드라이버가 폴링레이트 설정과 NKRO 전환을 함께 제공하는 경우가 많습니다.
2. 폴링레이트를 확인하고 필요하면 1000Hz로 올립니다. 다만 오래된 메인보드나 저사양 USB 컨트롤러에서는 오히려 끊김이 늘 수 있으니 500Hz로 낮춰보는 것도 방법입니다.
3. 여러 고폴링 장치를 한 허브에 몰아넣지 않습니다. 4번 항목에서 다룬 대역폭 병목을 피하기 위함입니다.
4. NKRO 모드가 꺼져 있다면 켭니다. 보통 Fn 조합키나 전용 소프트웨어에서 전환할 수 있습니다.
무선 키보드는 여기에 무선 구간 지연이 추가로 붙습니다. 2.4GHz 동글이나 블루투스 방식마다 지연 폭이 다르므로, 지연에 민감한 작업이라면 유선 연결이 여전히 가장 예측 가능한 선택입니다.
부트 프로토콜만 그렇습니다. 대부분의 기계식·게이밍 키보드는 확장 리포트 디스크립터를 써서 6개 제한을 넘는 NKRO를 지원합니다.
PC가 키보드 상태를 확인하는 주기가 짧아지기 때문입니다. 125Hz는 8ms마다, 1000Hz는 1ms마다 확인하므로 최대 대기 시간이 줄어듭니다.
체감 차이는 미미하고 오히려 바운스를 오탐지해 중복 입력이 생길 위험이 커집니다. 기본값(약 5ms)을 유지하는 편이 안전합니다.
네, 블루투스 키보드도 동일한 USB HID 리포트 구조를 그대로 재사용합니다. 다만 무선 구간에서 페어링·암호화 절차가 추가로 끼어듭니다.
정품 드라이버 설치, 폴링레이트 설정, NKRO 활성화, USB 포트 분산 이 네 가지를 순서대로 점검하는 게 가장 효과적입니다.
📚 함께 보면 좋은 글
키보드·마우스 내부 원리를 더 깊이 파고 싶다면 아래 글도 함께 보세요.
🔗 공식 자료
📖 출처
USB Implementers Forum, “Human Interface Devices (HID) Specifications and Tools”, usb.org
USB Implementers Forum, “HID Usage Tables for USB Version 1.4”, usb.org
QMK Firmware, “Contact bounce / contact chatter” 공식 문서, docs.qmk.fm
Microsoft Learn, “HID Architecture – Windows drivers”, learn.microsoft.com
Adafruit, “N-key Rollover (NKRO) with USB Keyboards”, blog.adafruit.com
Deskthority Wiki, “USB” 항목 중 부트 프로토콜·NKRO 설명, deskthority.net
USB 키보드 입력 원리는 스위치 접점, MCU 스캔, 디바운싱, HID 리포트, USB 폴링까지 다섯 단계가 밀리초 단위로 이어진 결과입니다. 지연을 줄이고 싶다면 드라이버·폴링레이트·NKRO·포트 분산부터 순서대로 점검해보세요.






