EKS에 올린 Spring Boot 서비스에서 특정 API 하나만 간헐적으로 504 Gateway Timeout을 냈다. 그 API는 관리자 화면에서 배치 작업을 즉시 실행하는 용도였다. 평소엔 잘 되다가 데이터가 많은 날만 실패했다. 결론은 ALB idle timeout 60초였다. 그런데 거기까지 가는 데 며칠이 걸렸다. 왜 돌아갔는지까지 포함해서 기록한다. 증상 마지막 세 가지가 힌트였는데, 처음엔 더 읽기
spring batch
백엔드 개발자 면접관을 하면서 정리한 기술 질문 세트 — RabbitMQ, WebSocket, JPA, Redis, Gateway, Batch
지원자 입장으로 면접을 본 경험은 많지만, 면접관 자리에 앉는 건 다른 일이다. 최근 2~3년차 백엔드 개발자 채용에 면접관으로 참여하면서, 지원자의 이력서에 적힌 기술 스택을 기준으로 질문 세트를 미리 준비했다. 이 글은 그 세트를 특정 지원자를 식별할 수 없게 일반화해서 정리한 것이다. 같은 연차 백엔드 채용을 준비하는 면접관에게도, 반대로 면접을 앞둔 더 읽기
AI에게 아키텍처를 질문할 때 프롬프트를 얼마나 구체적으로 작성해야 하는가? — Spring Batch EKS CronJob 사례로 보는 제약 조건의 중요성
AI에게 아키텍처를 질문할 때 프롬프트를 얼마나 구체적으로 작성해야 하는가 AI에게 시스템 아키텍처를 질문할 때 자주 발생하는 문제가 있다. 처음에는 단순히: 라는 정도의 정보만 전달한다. 그러면 AI는 대부분 다음 기준으로 답변하게 된다. 대표적으로 아래와 같은 구조를 추천하게 된다. 즉: 를 중심으로 접근한다. 그리고 대부분의 일반적인 시스템에서는 실제로 이 방향이 맞다. 그런데 더 읽기
Spring @Scheduled 동작 조건과 반복 실행 문제 해결 가이드
@Scheduled가 동작하지 않는 이유와 설정 조건 Spring의 @Scheduled는 단순히 어노테이션을 붙이는 것만으로는 동작하지 않습니다. 다음과 같은 조건이 반드시 충족되어야 합니다. ✅ 필수 설정 💥 예외 사례 아래와 같이 파라미터가 있는 메서드는 @Scheduled에서 예외가 발생합니다: ✅ 올바른 예시 cron 표현식 정리 표현식 설명 */2 * * * * ? 매 2초마다 더 읽기
Spring Batch Chunk Size, Skip/Retry, Listener 구성 시 주의사항 정리
1. Spring Batch에서 Chunk Size 1과 1000의 성능 차이 Chunk Size는 Spring Batch 성능에 직접적인 영향을 주며, 특히 chunk=1과 chunk=1000은 속도 차이가 큽니다. 일반적으로는 chunk size를 100 ~ 1000 사이로 설정하는 것이 적절하며, 성능과 메모리 사용량의 균형을 고려해야 합니다. 2. Skip과 Retry를 함께 설정했을 때 우선순위는? Spring Batch에서는 retry가 우선입니다. 더 읽기
개별 항목 실패 시 해당 트랜잭션만 롤백 (TransactionTemplate 사용)
🧩 문제 현상 🔍 원인 분석 🛠 해결 방법 🧪 예시 적용 코드 (1000건씩 커밋) ✅ 적용 후 기대 효과 바깥 Tasklet 트랜잭션이 있을 때의 전파 조건은 Spring Batch Tasklet 트랜잭션 내 개별 항목 실패 시 커넥션 누수 방지 방법에서 이어집니다.
DataSource 커넥션 반환 누락 또는 수동 반환 필요
🧩 문제 현상 🔍 원인 분석 🛠 해결 방법 ✅ 적용 후 기대 효과 트랜잭션에 연결된 자원의 소유권은 Spring Batch Tasklet 트랜잭션 내 개별 항목 실패 시 커넥션 누수 방지 방법에서 이어집니다.
Spring Batch Tasklet 트랜잭션 내 개별 항목 실패 시 커넥션 누수 방지 방법
예외를 catch했다는 사실만으로 누수를 단정하지 않기 Tasklet 루프에서 예외를 잡고 다음 항목으로 진행하면 의도하지 않은 커밋이나 rollback-only 상태를 놓칠 수 있습니다. 그러나 catch 자체가 항상 커넥션 누수를 만드는 것은 아닙니다. Spring이 관리하는 트랜잭션과 직접 획득한 JDBC 자원의 소유권을 먼저 구분해야 합니다. 항목별 롤백의 전제 기본 TransactionTemplate의 REQUIRED는 바깥 트랜잭션에 참여할 더 읽기
Spring Batch Tasklet에서 slave DB를 여러 번 호출할 때 커넥션은 각각 반환되는가?
🔹 질문 시나리오 Spring Batch Tasklet 안에서 slaveMapper를 사용하는 다음 코드처럼: slaveTxSupport.read(() -> slaveMapper.selectSomething());slaveTxSupport.read(() -> slaveMapper.selectAnotherThing()); 이 경우: 이 궁금증에 대한 답을 정리합니다. 🔍 결론 요약 항목 설명 TransactionTemplate.read(…) 호출마다 트랜잭션 생성됨 ✅ 맞습니다 각 트랜잭션은 독립적인 커넥션 사용 ✅ 맞습니다 첫 번째 호출이 끝난 시점에 커넥션 반환되는가 ✅ 반환됨 더 읽기
Spring Batch에서 slave DB 커넥션 반환 문제와 MyBatis + Hikari 트랜잭션 실전 가이드
🔹 문제 인식 🔹 핵심 원인 🔹 해결 방법 ✅ 1. TransactionTemplate으로 slave 트랜잭션 분리 List<Data> list = slaveTxSupport.read(() -> slaveMapper.selectByCondition(paramA, paramB)); ✅ 2. chunk 방식에서 ListItemReader에 적용 가능 @Bean@StepScopepublic ListItemReader<Entity> reader() { return new ListItemReader<>( slaveTxSupport.read(() -> mapper.selectList(param)) );} ✅ 3. 커넥션 반환 여부 확인 🔹 MyBatis Interceptor에서 커넥션 더 읽기