Claude 계정이 revoke됐다
이날은 중간에 계정이 날아가서 강제 마이그레이션을 한 날이다.
Claude 직접 계정이 revoke됐다.
사내 AI 게이트웨이로 바꿔야 했다.
근데 이 제약이 오히려 개인이랑 회사 설정을 분리하는 패턴이 됐다.
점심쯤에 Claude 계정이 갑자기 revoke됐다.
에이전트 도구가 전부 Claude를 쓰고 있었으니까, 갑자기 전부 멈췄다.
사내 AI 게이트웨이가 있어서 거기로 마이그레이션했다.
18개 모델 참조를 전부 사내 게이트웨이로 바꿨다.
API 엔드포인트도, 인증도, 모델 이름도 전부 바꿨다.
다행히 게이트웨이가 Claude 호환이라서 프롬프트 캐싱이랑 추론 기능은 그대로 됐다.
VPN 끊기면 조용히 멈춘다
게이트웨이로 바꾸니까 새 문제가 나왔다.
사내 도메인이라 VPN이 필요하다.
근데 VPN이 끊기면 조용히 멈춘다.
TCP 연결이 방화벽에서 조용히 드롭된다.
에러가 안 난다.
그냥 응답이 안 온다.
SDK가 30초에서 2분 동안 기다린다.
사용자는 왜 멈췄는지 모른다.
해결은 타임아웃을 15초로 잡는 거였다.
VPN이 끊기면 5초 안에 감지할 수 있다.
정상 스트리밍 응답은 30초 이상 걸리니까, 15초 타임아웃은 정상 요청을 끊지 않는다.
타임아웃이 나면 폴백 모델로 전환한다.
“조용히 멈추는” 문제를 “15초 후에 실패하는” 문제로 바꾼 거다.
실패하면 폴백으로 간다.
조용히 멈추면 아무것도 못 하지만 실패하면 다음 단계로 간다.
개인이랑 회사 설정 분리
게이트웨이 마이그레이션이 필요하니까, 아예 개인이랑 회사 설정을 분리했다.
개인 설정이랑 회사 설정을 따로 둔다.
회사 프로필은 게이트웨이 프로바이더를 쓰고 개인 프로필은 기존 프로바이더를 쓴다.
전환은 셸 함수 하나로 한다.
근데 여기서 함정이 있었다.
프레임워크가 설정 파일 이름을 하드코딩하고 있었다.
파일 이름은 못 바꾸고 디렉토리만 바꿀 수 있었다.
그래서 디렉토리를 분리해서 각 디렉토리에 같은 이름의 설정 파일을 뒀다.
회사 디렉토리에는 게이트웨이 관련 설정만 넣는다.
나머지는 기본 설정에서 자동으로 상속된다.
이러면 회사 디렉토리에는 차이점만 들어간다.
수료증 PDF 다운로드 완성
교육 플랫폼에서 수료증 PDF 다운로드를 완성했다.
기존에 95% 만들어져 있는 스캐폴드를 발견해서 거기에 피그마 디자인이랑 맞추고 버그를 잡았다.
픽셀 퍼펙트 수정 10개를 했다.
도장 위치, 장식 선, 폰트, 워터마크 크기 등. 그리고 인쇄 버그도 잡았다.
인쇄 버그는 Vue의 CSS 모듈 해싱 때문이었다.
CSS 모듈이 클래스 이름을 해싱한다.
근데 별도 SCSS 파일의 인쇄 미디어 쿼리가 해싱된 클래스 이름을 못 찾는다.
그래서 인쇄할 때 버튼이 같이 나온다.
해결은 루트에 모듈이 아닌 일반 클래스를 하나 두는 거였다.
인쇄 선택자가 이 클래스를 찾을 수 있게. 화상감독 검증 메시지도 수정했다.
제한 기간 테스트는 “오늘 또는 이전 날짜”를 막아야 하는데, 메시지는 “오늘”만 막는다고 돼 있었다.
피그마에서 정확한 문구를 확인하고 수정했다.
마무리
내가 이날 배운 핵심은 다음과 같다.
이날은 제약이 패턴이 된 날이었다.
VPN이 필요하니까 타임아웃을 15초로 잡았다.
이게 “조용히 멈추는” 문제를 “15초 후에 실패하는” 문제로 바꿨다.
실패하면 폴백으로 간다.
제약이 더 나은 동작을 만든 거다.
게이트웨이가 필요하니까 설정을 분리했다.
이게 개인이랑 회사 프로필을 분리하는 패턴이 됐다.
제약이 더 깔끔한 구조를 만든 거다.
제약은 불편하지만 제약을 잘 활용하면 더 나은 설계가 나온다.
“왜 이렇게 해야 하지”라고 불평하는 대신, “이 제약을 활용해서 뭘 만들 수 있나”를 생각하면 된다.
이날은 그렇게 해서 두 가지 패턴이 나왔다.