2026-04-06 (월) 개발일지
오늘의 삽질 기록: 타입 변경, Git 중첩, Discord 봇, 그리고 카카오톡 자동화
오늘은 정말 다양한 프로젝트를 오가면서 문제 해결에 매달렸던 하루였다. 아침부터 저녁까지 계속 불이 붙은 것처럼 여러 문제들이 동시다발적으로 발생했는데, 하나씩 해결해나가는 과정에서 많은 것을 배웠다.
TypeScript 타입 변경과 컴포넌트 동기화 문제
아침에 소명처리시스템에서 시나리오 담당자 페이지를 열었는데 Cannot read properties of undefined (reading 'length') 에러가 떴다. 사용자가 “시나리오 검색 후 해당 시나리오에 전부 해당하는 소명요청을 한번에 보내는 기능”에 대해 문의했고, 이 과정에서 API 스키마를 변경했던 것이 원인이었다.
문제: API 매퍼에서 approval_chain을 defaultApprovers로 변경했는데, 프론트엔드 ScenarioAssigneeTab.tsx 컴포넌트는 여전히 이전 필드명을 참조하고 있었다.
시도: 처음에는 단순히 참조 부분만 수정하려 했지만, import에서 이미 이전 타입(MatchingScope, ScenarioAssigneeApprover)을 사용하고 있어서 일괄 수정이 필요했다.
해결: sed로 일괄 치환을 시도했지만, setMatchingScope가 setstring으로 바뀌는 등 예상치 못한 문제가 발생했다. 결국 핵심 문제는 ApproverItem 타입이 {user_id, order}만 가지고 있는데 UI에서는 name, email 필드가 필요하다는 점이었다. 컴포넌트 내부에서 확장된 타입을 사용하도록 수정하면서, 분석자 선택도 ID 기반으로 정리했다.
배운 점: API 스키마 변경은 프론트엔드 컴포넌트까지 꼼꼼히 확인해야 한다. 특히 타입 시스템이 엄격한 TypeScript에서는 컴파일 타임에 잡히지 않는 런타임 에러가 발생하기 쉽다.
Git 중첩 저장소와 Fork 앱 연동 문제
소명처리시스템 프로젝트에서 test 브랜치를 만들려고 했는데, Cursor에서 충돌 표시가 안 되는 이상한 문제가 발생했다.
문제: /소명처리시스템/tr-box/tr-box/처럼 중첩된 Git 저장소가 생성되어 있었다. 외부 tr-box/는 변경사항이 없고, 내부 tr-box/tr-box/에만 165개 파일 변경사항이 있었다.
시도: 처음에는 단순히 .git 폴더를 제거하려 했지만, 작업 내용을 보존해야 했다.
해결: 내부 tr-box/tr-box/의 .git 폴더를 제거하고, 변경된 파일들을 외부 tr-box/로 복사한 후 내부 폴더를 삭제했다. 결과적으로 35개 파일 변경(+2588/-87)이 보존되었고, test, yhjang 브랜치가 정상적으로 인식되었다.
배운 점: Git 저장소 안에 또 다른 Git 저장소가 생기면 정말 골치아프다. git clone을 할 때 현재 디렉토리가 이미 Git 저장소인지 확인하는 습관이 필요하다.
Discord 봇이 온라인이 되지 않는 문제
자동매매 프로젝트에서 Discord 봇(auto_trade)이 활성화되지 않는 문제를 해결하려고 했다. 봇 토큰, 애플리케이션 ID, 퍼블릭 키는 모두 정상이었고, gateway intent도 전부 활성화되어 있었다.
문제: Claude Code의 Discord 플러그인이 “don’t ask” 모드에서 ~/.claude/channels/ 경로에 대한 쓰기 권한이 없어서 .env 파일을 생성할 수 없었다.
시도: 직접 터미널에서 echo 명령어로 .env 파일을 생성하고, access.json을 새로 만들어 DM 허용과 그룹 채널 설정을 추가했다.
해결: 권한 문제로 인해 수동 설정이 필요했고, 설정 후에도 Claude Code를 재시작해야 Discord MCP 서버가 새 토큰으로 연결되었다.
배운 점: MCP(Model Context Protocol) 플러그인은 파일 시스템 권한에 민감하다. 특히 보안 토큰을 다룰 때는 권한 설정(600)이 중요하다.
카카오톡 자동화와 AppleScript 방식
Library 프로젝트에서 카카오톡 자동화가 제대로 작동하지 않는 문제를 해결했다. 사용자는 로컬 UI 조작이 아니라 CLI에서 자동으로 채팅을 보내길 원했다.
문제: kakaocli send 명령어가 특정 단계에서 멈추었다. Accessibility 권한은 정상이었지만, 채팅방을 열 때 블로킹되는 것 같았다.
시도: 처음에는 kakaocli의 소스를 수정해서 로그를 추가하며 디버깅을 시도했다.
해결: 결국 kakaocli send 대신 AppleScript 방식을 채택했다. 방식은 다음과 같다:
- 현재 앱 기억 (포커스 복원용)
- 클립보드에 메시지 복사 (한글 중복 문제 방지)
- 카카오톡 검색(Cmd+F)으로 채팅방 찾기
- Enter로 채팅방 열기
- Cmd+V로 붙여넣기 후 Enter 전송
- Cmd+W로 채팅창 닫기
배운 점: UI 자동화는 어떤 방식이든 불안정할 수 있다. kakaocli 같은 전용 도구보다 AppleScript를 이용한 직접 제어가 더 안정적인 경우가 있다. 특히 한국어 입력 문제는 클립보드를 이용하면 깔끔하게 해결된다.
오늘의 한줄
“타입 변경은 컴포넌트까지, Git은 중첩 조심, 봇 토큰은 권한 확인, 자동화는 AppleScript가 답이다”