문제: 맥에서 한글로 채팅 입력 시 메시지가 중복으로 전송되는 현상
영향 범위: 맥OS 사용자의 채팅 기능
해결 상태: 완료
IME (Input Method Editor) 처리 누락
compositionstart
/compositionend
이벤트 미처리이벤트 중복 처리
// chat.js:37-42 (수정 전)
document.addEventListener('keydown', (e) => {
if (e.key === 'Enter' && !e.shiftKey && e.target.classList.contains('message-textarea')) {
e.preventDefault();
this.sendMessage(); // IME 상태 확인 없이 바로 전송
}
});
// ChatInterface 생성자에 상태 변수 추가
constructor() {
this.selectedRoomId = null;
this.stompClient = null;
this.currentUser = null;
this.isComposing = false; // IME 입력 상태
this.lastSendTime = 0; // 중복 방지용 타임스탬프
this.init();
}
// Composition 이벤트 처리
document.addEventListener('compositionstart', (e) => {
if (e.target.classList.contains('message-textarea')) {
this.isComposing = true;
}
});
document.addEventListener('compositionend', (e) => {
if (e.target.classList.contains('message-textarea')) {
this.isComposing = false;
}
});
// 개선된 Enter 키 처리
document.addEventListener('keydown', (e) => {
if (e.key === 'Enter' && !e.shiftKey && e.target.classList.contains('message-textarea')) {
// IME 입력 중일 때는 메시지 전송 방지
if (!this.isComposing) {
e.preventDefault();
this.sendMessage();
}
}
});
async sendMessage() {
const textarea = document.getElementById('messageInput');
const message = textarea?.value.trim();
if (!message || !this.selectedRoomId) {
return;
}
// 디바운스 로직 - 500ms 내 중복 전송 방지
const now = Date.now();
if (now - this.lastSendTime < 500) {
console.log('Duplicate message send prevented (debounced)');
return;
}
// 추가 안전장치 - composition 상태 재확인
if (this.isComposing) {
console.log('Message send prevented: IME composition in progress');
return;
}
this.lastSendTime = now;
// 기존 전송 로직...
}
src/main/resources/static/js/chat.js
isComposing
상태 플래그 추가lastSendTime
디바운스용 타임스탬프 추가compositionstart
이벤트 핸들러compositionend
이벤트 핸들러 keydown
핸들러에 composition 상태 검사 추가