728x90 반응형 전체 글172 JavaScript 이벤트 리스너 중복 등록으로 검색창이 두 번 열리던 날 웹 로그 화면에 검색 단축키를 붙였는데, 화면을 여러 번 오가자 검색창이 두 번씩 열렸다. 원인은 화면 진입마다 새로운 이벤트 핸들러를 등록하면서 이전 리스너를 정리하지 않은 것이었다. 결국 AbortController로 등록과 해제 시점을 묶어 해결했다.첫 진입에서는 정상적으로 동작했다2026년 9월 12일, 웹 로그 화면의 키 입력을 처리하고 있었다. 처음에는 addEventListener만 붙이면 검색 단축키가 될 줄 알았다. 실제로 첫 진입에서는 잘 동작했다.그런데 페이지를 여러 번 오가니까 같은 키에 중복으로 반응했다. 검색창이 두 번 열리거나, 핸들러가 겹쳐 이상한 포커스 이동이 생겼다. 화면은 멀쩡한데 키 입력만 이상했다.원인은 매번 새로 만든 이벤트 핸들러였다문제는 화면에 진입할 때마다 새.. 2026. 10. 16. TypeScript 타입 좁히기와 가드로 API 응답 오류를 막은 날 업데이트 체크 기능에서 서버 JSON을 TypeScript 인터페이스로 캐스팅했더니, 필드가 빠졌을 때 런타임 오류가 발생했다. 이후 응답을 unknown으로 받고 타입 가드로 필수 필드를 검증하도록 바꿨다. 타입 선언만 믿었던 실수와 해결 과정을 정리했다.TypeScript 인터페이스만 믿고 넘어갔다처음에는 서버 JSON을 바로 인터페이스로 캐스팅하면 될 줄 알았다. 에디터 자동완성이 잘 되어서 타입은 깔끔해 보였다.코드를 작성할 때는 별문제가 없어 보였다. 하지만 인터페이스로 타입을 지정했다고 해서 서버에서 받은 데이터까지 검증되는 것은 아니었다.필드가 빠지자 런타임에서 터졌다예상한 필드가 빠지거나 타입이 바뀌면 런타임에서 오류가 발생했다. 컴파일 타임의 타입 안전성이 런타임 데이터의 안전성까지 보장.. 2026. 10. 16. 자동 업데이트 롤아웃, 중단 버튼만으론 멈추지 않았다 원격 제어 프로그램의 자동 업데이트를 관리자 화면에서 중단하면 PC의 설치도 멈출 줄 알았다. 하지만 서버가 멈춘 것은 대기열과 완료 확인이었고, 이미 실행된 설치까지 중단하지는 못했다. 2026년 10월 14~15일 두 커밋을 통해 이 문제를 보완한 과정을 정리했다.중단 버튼을 누르면 다 멈출 줄 알았다원격 제어 프로그램은 관리 서버가 PC 에이전트에 업데이트를 한 대씩 순서대로 전달하는 구조였다. 10월 14일에는 실행 중인 업데이트와 같은 버전의 자동 대기 작업을 긴급히 취소해야 했다.사용자 승인을 받은 뒤 운영 DB에서 실행 중이던 작업 1건과 자동 대기 작업 9건, 총 10건을 취소했다. 먼저 백업과 작업별 감사 기록을 남겼고, 실행 중 명령도 취소 상태로 종료했다. 기존 배포 설정과 PC별 설.. 2026. 10. 16. 읽기 전용 공유, 버튼 하나가 아니었던 날 사내 클라우드 스토리지에 읽기 전용 공유 버튼을 붙이면 작업이 끝날 것으로 생각했다. 실제로는 초대 상태와 서버 권한을 함께 설계하고, 알림 재전송과 운영 검증까지 확인해야 했다. 2026년 10월 2일의 구현·배포 기록을 바탕으로 그 과정을 정리했다.공유 버튼만 만들면 파일을 열 수 있을 줄 알았다처음 목표는 사내 클라우드 스토리지의 파일과 폴더를 다른 계정에 읽기 전용으로 공유하는 것이었다. 소유자가 공유 대상을 고르고 상대 계정을 검색한 뒤 초대하는 흐름을 구상했다.하지만 초대를 보냈다고 곧바로 접근을 허용할 수는 없었다. 수신자가 수락하기 전에는 원본 파일뿐 아니라 미리보기와 다운로드 경로도 막아야 했다.초대를 수락한 뒤에도 파일을 읽는 권한과 수정하는 권한은 구분해야 했다. 수신자에게는 읽기 권.. 2026. 10. 16. AI 커밋 메시지에 없던 변경까지 적혔다 — diff 검증과 역할 분담 커밋 메시지를 생성 AI에 맡겼다가 실제로 하지 않은 변경까지 적힌 초안을 받았다. 이후 diff에서 무엇을 왜 바꿨는지는 내가 정리하고, AI는 문장만 다듬게 했다. 그 과정에서 커밋 기록의 신뢰를 지키려면 무엇을 직접 확인해야 하는지 배웠다.그럴듯한 AI 초안에 없던 변경까지 들어갔다처음에는 AI한테 "커밋 메시지 줘"만 던지면 될 줄 알았다. 문장도 그럴듯하고 형식도 깔끔해 보였다.그런데 막상 보면 핵심 변경보다 파일 나열에 가깝거나, 안 한 일까지 넣어 놓은 경우가 있었다. 그대로 쓰면 커밋 히스토리가 이상해진다. 그럴듯한 문장이 사실 확인을 가리고 있었다.diff를 먼저 정리하고 표현만 맡겼다그래서 diff(변경 내역)를 내가 먼저 짧게 정리했다. "무엇을 왜 바꿨는지"는 내가 고정하고, AI에.. 2026. 10. 16. MySQL collation이 섞여 조회가 깨진 날 클라우드 앱의 FCM 토큰 조회는 테이블마다 콜레이션이 다른 설치에서 Illegal mix of collations 오류로 깨질 수 있었다. 문자열 JOIN에 서로 다른 콜레이션이 섞이는 구조가 원인이었다. 기존 테이블을 바꾸지 않고 비교식과 계정 ID 매칭을 수정했다.콜레이션이 섞인 설치에서 푸시 토큰 조회가 위험했다사내 인증 서비스는 클라우드 앱 알림에 필요한 FCM 토큰을 계정별로 조회했다. 기존 설치마다 테이블 기본 콜레이션이 다를 수 있다는 점 때문에 문자열 JOIN 조건을 살펴봤다.오류의 핵심은 Illegal mix of collations였다. 세션 테이블과 푸시 토큰 테이블의 문자열 비교가 서로 다른 콜레이션으로 묶인 상태였다.한쪽에는 MySQL 8의 utf8mb4_0900_ai_ci가 적.. 2026. 10. 16. 이전 1 2 3 4 ··· 29 다음 728x90 반응형