문제의 시작리워드 배치가 파트너사 실적을 가져오다가 13개월 중 8개월꼴로 통째로 skip되는 사고가 있었다. 처음엔 타임아웃과 서킷브레이커 임계값을 손보면 될 줄 알았는데, 결국 손댄 곳은 "임계값"이 아니라 "이 자리에 서킷브레이커를 쓴다는 설계" 그 자체였다.문제: 13개월 중 8개월이 조용히 비어버렸다배치는 매 실행마다 미처리 월을 찾아 최대 13개월치를 순회하며, 월별로 파트너사 실적 조회 API를 호출해 회원 포인트를 적립한다. 재시도가 붙어 있는데도 결과적으로 서킷브레이커(모든 월이 공유하는 하나의 인스턴스)가 열려서 그 달 데이터가 통째로 skip되는 일이 반복됐다.이번이 처음이 아니었다는 게 이 사고를 다르게 보게 만들었다. 한 달 전에도 같은 유형의 사고("slow-call 임계값이 너..
한 줄 요약rewardJob이 2026-08-17 실행 이후 20일 연속 read=0 write=0 skip=0으로, 아무것도 처리하지 않은 채 COMPLETED로 조용히 끝났다.원인은 서로 다른 두 레이어에 겹쳐 있었다.레이어 1 — RewardOrderReader/RewardOrderProcessor가 StepScope 빈인데, Step 실행마다 상태가 제대로 리셋되지 않는 문제.레이어 2 — Spring Batch 6.0.0의 ChunkOrientedStep.chunkTracker가 한 번 소진되면 컨테이너를 재시작하기 전까지 영구히 고정되는 프레임워크 버그 (upstream #5126).1차 수정(레이어 1)은 실제로 필요한 수정이었고 정상 동작했다. 다만 증상의 절반만 설명하고 있었다.증상rew..
AI 에이전트를 안정적으로 제어하기 위한 구조: 하네스(Harness)와 컨텍스트 엔지니어링AI 에이전트(Agent) 기술을 도입할 때 자주 겪는 문제 중 하나는 에이전트가 예상치 못한 비정상 루프에 빠지거나, 정제되지 않은 결과를 출력해 시스템이 제어 불능 상태가 되는 점입니다.에이전트가 높은 자율성을 바탕으로 문제를 해결하는 과정에서 생기는 불확실성을 통제하기 위해 '하네스(Harness)'와 '컨텍스트 엔지니어링(Context Engineering)' 개념이 중요하게 다루어집니다. 두 개념의 역할과 차이, 그리고 기술적 발전 맥락을 정리합니다.1. AI 에이전트 시스템의 발전 과정AI 기술은 모델의 응답 정밀도를 높이는 단계에서 시작해, 자율적으로 실행하고 이를 통제하는 방향으로 진화했습니다.Pla..
외부 파트너 시스템에 상태를 통지하는 기능을 붙이면서 마주친 문제와, 그걸 @TransactionalEventListener로 풀어가는 과정에서 밟은 함정들을 정리했습니다. Spring Boot 3.5 / Java 21 / PostgreSQL 환경입니다.문제 상황파트너사와 연동하는 리포트 발급 기능이 있습니다. 흐름은 단순합니다.사용자가 리포트를 신청하면 → 파트너사에 "진행 중" 통지산출이 완료되면 → 파트너사에 "완료" 통지처음 작성한 코드는 이런 모양이었습니다.@Transactionalpublic void completeReport(String reportNo) { // ... 리포트 산출 결과 처리 ... // 파트너사 통지 externalApiClient.sendStatus(pa..
들어가기 전최근 리뷰하던 코드에서 System.exit(1)을 마주쳤습니다. 애플리케이션 코드 아무 곳에서나 이렇게 프로세스를 강제 종료시키는 게 정말 괜찮은 방법인지 궁금해서, 왜 지양해야 하는지와 그럼에도 직접 호출하는 게 맞는 경우까지 정리해봤습니다.결론부터 요약하면 이렇습니다.System.exit()은 JVM 전체를 그 자리에서 끝내버리는 명령입니다. 호출부가 코드 곳곳에 흩어질수록 나중에 "왜 죽었는지" 추적하기 어렵고, 테스트도 사실상 불가능해집니다.Spring Boot처럼 프레임워크 위에서 동작하는 앱이라면, 예외를 던져서 프레임워크의 실패 처리 경로(SpringApplication)에 종료를 맡기는 편이 진단 정보와 정리 과정 양쪽 모두에서 더 낫습니다.그렇다고 System.exit()이 ..
환경 : Mac / Vultr 클라우드 / 게이트웨이 서버 경유 내부망 구성상황Vultr 클라우드에서 아래와 같은 서버 구성을 쓰고 있었습니다.내 Mac ↓ (인터넷)gateway.mydevcloud.net ← 공인 IP, 외부 접근 가능 (SSH A) ↓ (내부 사설 네트워크)prod-server.internal.mydevcloud.net ← 사설 IP만 있음 (SSH B)터미널에서는 SSH A에 접속한 다음 SSH B로 hop하면 내부 서버에 들어갈 수 있었습니다.그런데 SFTP 클라이언트로 파일을 올리려고 하니 무한 로딩이 걸렸습니다.왜 SFTP가 바로 안 될까?터미널에서 SSH A → SSH B 수동 hop은 되지만,SFTP 클라이언트는 Mac에서 SSH B로 직접 TCP 연결을 ..
- Total
- Today
- Yesterday
- 동시성제어
- docker
- 데이터적합성
- dockerfile
- 트랜잭션
- JPA
- ncp
- OpenFeign
- 스케줄러
- Lock
- Cache
- springcloud
- 이슈
- Linux
- spring
- mybatis
- MySQL
- LocalDate
- 이슈해결
- Java
- Spring JPA
- SQL
- 알고리즘
- SpringBatch
- spring batch
- hazelcast
- 컨테이너
- 에러
- 도커
- Quartz
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |