키보드 디바운스 알고리즘 종류, 채터링 원인부터 QMK 설정까지
한 번 눌렀는데 두 번 입력되는 이유와 해결법
- 채터링은 스위치 접점이 붙는 순간 미세하게 튀면서 발생하는 신호 잡음이 원인입니다.
- 디바운스는 이 잡음을 걸러내는 로직으로, 하드웨어 방식과 펌웨어 방식이 있습니다.
- QMK 기준 디바운스 알고리즘은 크게 Eager·Defer, Symmetric·Asymmetric, Global·Per-row·Per-key로 나뉩니다.
- 기본 디바운스 시간은 5ms이며, 알고리즘 선택에 따라 체감 지연이 5~10ms 차이 납니다.
- 스위치 노후나 특정 축 특성으로 채터링이 반복되면 소프트웨어 설정만으로 해결되지 않을 수 있습니다.
스페이스바를 한 번 눌렀는데 화면에는 두 칸이 뜨는 경험, 한 번쯤 있으실 겁니다. 처음엔 손가락이 미끄러진 줄 알지만, 같은 키에서 반복된다면 얘기가 다릅니다.
이런 증상의 대부분은 스위치 자체의 고장이 아니라 채터링(chattering)이라는 현상 때문에 생깁니다. 그리고 이걸 막아주는 게 바로 디바운스(debounce) 알고리즘입니다.
이 글에서는 채터링이 왜 생기는지, QMK 펌웨어가 제공하는 디바운스 알고리즘 종류가 무엇인지, 그리고 상황에 맞게 어떤 걸 골라야 하는지 실제 설정 방법까지 정리했습니다.
1. 채터링이란 무엇인가 — 스위치가 두 번 눌리는 진짜 이유
채터링은 스위치 내부의 금속 접점이 맞닿는 순간, 물리적으로 완전히 붙지 못하고 아주 짧은 시간 동안 붙었다 떨어지기를 반복하는 현상입니다. 이 과정이 수 밀리초 안에 여러 번 일어나면서 하나의 입력이 여러 번의 신호로 잡히는 겁니다.
기계식 스위치는 접점이 스프링의 탄성으로 닫히기 때문에, 닫히는 순간 미세한 튕김(bounce)이 물리적으로 발생할 수밖에 없습니다. 이건 설계 결함이 아니라 기계 접점 방식의 본질적인 특성입니다.
채터링과 이중 입력을 헷갈리는 경우가 많은데, 실제로는 원인이 다를 수 있습니다. 특정 키만 반복적으로 두 번 눌린다면 채터링 가능성이 높고, 여러 키에서 랜덤하게 발생한다면 폴링레이트나 케이블 문제일 수 있습니다. 증상이 나는 키를 정확히 특정하는 게 진단의 첫걸음입니다.
2. 디바운스의 기본 원리 — 하드웨어 vs 펌웨어
디바운스는 접점이 튀는 짧은 구간의 신호를 무시하고, 안정된 신호만 실제 입력으로 인정하는 처리입니다. 방식은 크게 두 가지로 나뉩니다.
하드웨어 디바운스는 회로에 커패시터나 슈미트 트리거 같은 부품을 추가해서 물리적으로 신호를 안정화하는 방식입니다. 커스텀 PCB 제작 시 일부 적용되지만, 대부분의 완제품 키보드에는 들어있지 않습니다.
펌웨어 디바운스는 마이크로컨트롤러가 스캔한 신호를 소프트웨어 로직으로 걸러내는 방식입니다. QMK, VIA 기반 키보드 대부분이 이 방식을 씁니다. 일정 시간(DEBOUNCE ms) 동안의 추가 입력을 무시하거나, 변화가 없는 상태가 이어질 때까지 기다렸다가 입력을 확정하는 식으로 동작합니다.
QMK 기반 커스텀 키보드를 쓴다면 config.h에서
#define DEBOUNCE 5 같은 줄을 찾아 직접 값을 바꿀 수 있습니다. 값을 낮추면 반응은 빨라지지만 채터링에 취약해지고, 높이면 안정적이지만 빠른 연타 시 입력이 씹힐 수 있습니다.3. Eager와 Defer 방식의 차이
QMK 디바운스 API는 신호를 언제 확정하느냐에 따라 크게 두 갈래로 나뉩니다.
Eager(즉시형) 방식은 키 변화가 감지되면 즉시 입력을 보고하고, 이후 DEBOUNCE ms 동안 들어오는 추가 입력은 전부 무시합니다. 반응 속도가 빠른 대신, 이 구간 안에서 실제로 두 번 누른 입력도 걸러질 수 있어 노이즈에는 상대적으로 취약합니다.
Defer(지연형) 방식은 반대로 일정 시간 동안 변화가 없는 상태가 확인된 뒤에야 입력을 확정합니다. 신호가 안정된 뒤 처리하니 노이즈에는 강하지만, 그만큼 입력이 화면에 반영되는 데 약간의 지연이 생깁니다.
실사용 체감으로 보면, 게이밍처럼 반응 속도가 중요한 상황에서는 Eager 계열을, 타건감과 안정성을 우선한다면 Defer 계열을 선호하는 사람이 많습니다. 두 방식을 키다운·키업에 각각 다르게 적용하는 Asymmetric(비대칭) 조합도 QMK에서 지원합니다.
Eager 방식을 쓰면서 DEBOUNCE 시간을 지나치게 짧게 잡으면, 오히려 채터링을 그대로 통과시켜버리는 역효과가 날 수 있습니다. 기본값 5ms에서 시작해 조금씩 조정하는 걸 권장합니다.
4. Global·Per-row·Per-key 알고리즘 종류
디바운스 타이머를 어느 범위에 적용하느냐도 알고리즘을 나누는 기준입니다.
Global(전역)은 키보드 전체에 타이머 하나를 두는 방식입니다. 어떤 키든 변화가 감지되면 전체 타이머가 리셋됩니다. 구현이 단순하고 자원 소모가 적지만, 타이핑 속도가 빠른 사람은 다른 키 입력 때문에 타이머가 계속 리셋되면서 지연을 더 크게 느낄 수 있습니다.
Per-row(행 단위)는 행마다 별도 타이머를 둡니다. 변화가 감지되면 카운터가 DEBOUNCE 값으로 설정되고 즉시 반영된 뒤, 이후 스캔마다 경과 시간만큼 카운터가 줄어드는 구조입니다. 스캔 속도가 느리거나 손가락이 대체로 한 번에 한 행만 짚는 상황에 적합합니다.
Per-key(키 단위)는 키마다 독립적인 타이머를 둡니다. 상태 변화가 있으면 즉시 반응하고, 해당 키에 한해 DEBOUNCE ms 동안 추가 입력을 무시합니다. 정확도는 가장 높지만 키 개수만큼 자원을 더 쓰기 때문에 저사양 MCU에서는 부담이 될 수 있습니다.
스캔 레이트가 500 미만이면 eager-pr, 800 이상이면 eager-pk가 지연을 5~10ms 줄여주는 경향이 있다는 실측 사례가 커뮤니티에 공유된 적이 있습니다. 자신의 보드가 정확히 몇 Hz로 스캔하는지 모른다면 우선 기본 sym_defer_g로 두고, 특정 키에서만 문제가 반복될 때 알고리즘 변경을 고려하는 순서를 추천합니다.
5. 채터링이 유독 잦은 스위치와 흔한 실수
알고리즘을 아무리 잘 골라도 스위치 자체 문제라면 근본 해결이 안 됩니다. 오래 사용해 금속 접점이 산화되거나 마모된 스위치, 윤활이 없어 접점이 불안정하게 닿는 저가형 스위치에서 채터링이 더 자주 나타나는 편입니다.
가장 흔한 실수는 디바운스 시간을 무작정 높여서 해결하려는 겁니다. DEBOUNCE 값을 20ms, 30ms까지 올리면 채터링은 줄어들지만, 이번엔 빠르게 연속으로 누르는 입력(예: 게임에서 연타)이 하나로 뭉개지는 부작용이 생깁니다.
또 하나 흔한 실수는 소프트웨어 설정만 만지고 물리적 원인은 확인하지 않는 것입니다. 특정 키 하나에서만 반복적으로 증상이 나온다면, 설정보다 스위치 자체를 교체하거나 접점을 점검하는 게 더 빠른 해결책일 수 있습니다.
습기나 먼지가 접점에 끼어도 채터링과 비슷한 증상이 납니다. 이 경우엔 디바운스 설정이 아니라 스위치 분해 청소나 접점 세정제 사용이 먼저입니다.
6. QMK config.h 실전 설정 절차
직접 펌웨어를 빌드하는 커스텀 키보드라면, 아래 순서로 디바운스 설정을 조정해볼 수 있습니다.
1. keyboard 폴더의 config.h 파일을 엽니다.
2. DEBOUNCE_TYPE 항목이 없다면 기본값(sym_defer_g)이 적용된 상태입니다.
3. 원하는 알고리즘으로 #define DEBOUNCE_TYPE sym_eager_pr 처럼 지정합니다.
4. #define DEBOUNCE 5로 시간(ms)을 함께 조정합니다.
5. 펌웨어를 다시 빌드하고 플래시한 뒤, 실제 타이핑으로 채터링 여부를 확인합니다.
한 번에 여러 값을 바꾸지 말고, 알고리즘 하나를 바꾼 뒤 며칠 사용해보고 다음 값을 조정하는 식으로 접근하면 어떤 변경이 실제로 효과가 있었는지 명확히 파악할 수 있습니다.
자주 묻는 질문
가장 많이 쓰는 키(스페이스바, 엔터 등)는 접점 마모가 빠르게 진행되기 때문입니다. 사용 빈도가 높은 키일수록 채터링 발생 확률도 함께 올라갑니다.
네, 값을 과도하게 높이면 빠른 연타 입력이 하나로 인식되어 씹힐 수 있습니다. 게임용이라면 기본값에서 크게 벗어나지 않는 선에서 조정하는 게 안전합니다.
VIA나 QMK를 지원하지 않는 완제품은 대부분 불가능합니다. 오픈소스 펌웨어를 지원하는 커스텀·핫스왑 키보드에서만 직접 조정할 수 있습니다.
키보드 테스터 웹사이트나 QMK의 키 로거 기능으로 각 키를 눌러보면서 동일 입력이 중복 기록되는지 확인하는 방식이 일반적입니다.
아닙니다. 채터링은 접점이 튀면서 한 키가 중복 입력되는 현상이고, 고스팅은 여러 키를 동시에 누를 때 매트릭스 구조상 인식이 안 되는 별개의 문제입니다.
📚 함께 보면 좋은 글
디바운스와 매트릭스 구조를 이해했다면, 이어서 QMK 커스터마이징의 다른 영역도 함께 살펴보시면 좋습니다.
🔗 공식 자료
📖 출처
1. QMK Firmware 공식 문서 — Contact bounce / contact chatter, feature_debounce_type
2. QMK Firmware GitHub 저장소, docs/feature_debounce_type.md
3. holykeebs QMK Firmware 매트릭스 스캐닝·디바운스 문서(DeepWiki)
4. QMK Debounce Masterclass, kbd.news, 2020
5. 기계식키보드 마이너 갤러리, QMK 디바운스 API 변경 관련 게시글
채터링은 스위치 접점이 물리적으로 튀면서 생기는 자연스러운 현상이고, 디바운스는 이를 걸러내는 로직입니다. QMK 기준 기본값(sym_defer_g, 5ms)에서 시작해 증상이 반복되는 키가 있을 때만 알고리즘과 시간을 조금씩 조정해보시길 권합니다.






