ThreadLocal remove는 가상 스레드를 켜도 남겨 둔다

로그 추적기를 싱글톤 빈 하나로 만들고 요청을 묶는 트랜잭션 ID를 그 필드에 두면, 첫 요청이 끝나기 전에 들어온 두 번째 요청이 같은 ID를 이어 쓴다. 필드를 ThreadLocal로 바꾸면 값이 스레드마다 갈리지만, 톰캣 스레드 풀에서 같은 스레드가 다음 요청을 받으면 remove()로…

로그 추적기를 싱글톤 빈 하나로 만들고 요청을 묶는 트랜잭션 ID를 그 필드에 두면, 첫 요청이 끝나기 전에 들어온 두 번째 요청이 같은 ID를 이어 쓴다. 필드를 ThreadLocal로 바꾸면 값이 스레드마다 갈리지만, 톰캣 스레드 풀에서 같은 스레드가 다음 요청을 받으면 remove()로…

안드로이드나 Flutter 앱처럼 JavaScript SDK를 쓸 수 없는 클라이언트에서 Flue 에이전트와 대화하려면 HTTP로 직접 붙어야 한다. 메시지를 POST하면 답 대신 202 접수 응답이 오고, 답은 그 응답에 실린 offset을 들고 Flue 대화 스트림을 읽어서 받는다. offset은 응답에서 받은 문자열을 저장해…

Flue로 만든 고객 응대 에이전트에 스킬, 서브에이전트, MCP 서버, 샌드박스를 차례로 붙여 보면 useSkill, useSubagent, useMcpConnection, useSandbox 모두 에이전트 함수에 한 줄을 더하는 같은 모양이고, 조건문 안에 넣으면 상태에 따라 붙였다 뗄 수도 있다. 하지만 모델이 호출마다 받는 분량과 실제…

결제나 메일 발송을 맡은 도구가 도는 중에 서버가 죽으면, 서버가 돌아온 뒤 그 도구도 다시 실행될 거라고 기대하기 쉽다. Flue에서 크래시 뒤에 재실행되는 도구는 durable: true로 선언한 도구뿐이다. 일반 도구 호출은 결과를 알 수 없다는 오류로 마감되고, 모델이 그 오류를…

usePersistentState로 모드 상태를 두고 set_mode 도구로 그 모드를 바꾸게 만든 Flue 에이전트가 있다고 하자. 사용자가 “빠른 모드로 바꿔 줘”라고 보내면 모드가 바뀌었다고 알리는 답까지 빠른 모델이 쓸 것 같지만, 그 응답은 원래 모델이 끝내고 빠른 모델은 다음 메시지부터 답한다. 같은…

Flue로 첫 에이전트를 만들면 손이 가는 곳은 에이전트 코드보다 그 바깥이다. 에이전트는 시스템 프롬프트를 반환하는 함수 몇 줄로 끝나고, 대화 기록과 스트리밍, 중단된 작업의 복구는 Flue가 맡는다. 작성자에게 남는 일은 어디에 배포할지, 어떤 URL로 열지, 그 URL을 누구에게 열지를 정하는…
2026년 10월 12일, 정산 관리 API를 서비스하는 admin 서버가 새벽 4시 46분부터 오후 1시 50분까지 약 9시간 응답하지 않았다. 고객사 문의로 알았고, 원인은 힙 포화였다. 장애 공유 문서는 정산 화면의 5중 조인 쿼리가 주문 데이터를 대량으로 올려 힙을 채웠다고 적었다.…
운영 API는 2026년 5월 14일부터 ALB 뒤 서버 두 대를 한 대씩 재시작하는 롤링 배포를 해 왔다. 무중단 배포인 줄 알았다. 10월 1일 배포 중 health를 2초 간격으로 보다가, 노드마다 11~16초씩 503이 섞이는 창을 발견했다. 하루 전 운영에서 켠 미수신…
Claude Code에게 여러 일을 부탁했는데 첫 번째만 끝내고 “다음 작업을 원하시면 말씀해 주세요”라며 멈춘 경험이 있을 것이다. 반대로 반복 작업을 걸어 두면 이미 처리한 대상을 또 처리하기도 한다. 강의의 마지막 장은 이슈 작성, 수정 PR, 단순화, 리뷰를 이어 붙인 “소프트웨어…
기능 하나를 맡기고 끝날 때까지 기다리다 보면 다른 작업도 동시에 돌리고 싶어진다. 터미널 탭을 하나 더 열고 같은 폴더에서 Claude를 하나 더 실행하는 것이 가장 쉬운 방법이다. 두 세션이 같은 파일을 고치기 전까지는 그렇다. 병렬 작업에서는 무엇을 나눌지부터 정한다. 파일…