EKS에 올린 Spring Boot 서비스에서 특정 API 하나만 간헐적으로 504 Gateway Timeout을 냈다. 그 API는 관리자 화면에서 배치 작업을 즉시 실행하는 용도였다. 평소엔 잘 되다가 데이터가 많은 날만 실패했다. 결론은 ALB idle timeout 60초였다. 그런데 거기까지 가는 데 며칠이 걸렸다. 왜 돌아갔는지까지 포함해서 기록한다. 증상 마지막 세 가지가 힌트였는데, 처음엔 더 읽기
SPRING
백엔드 개발자 면접관을 하면서 정리한 기술 질문 세트 — RabbitMQ, WebSocket, JPA, Redis, Gateway, Batch
지원자 입장으로 면접을 본 경험은 많지만, 면접관 자리에 앉는 건 다른 일이다. 최근 2~3년차 백엔드 개발자 채용에 면접관으로 참여하면서, 지원자의 이력서에 적힌 기술 스택을 기준으로 질문 세트를 미리 준비했다. 이 글은 그 세트를 특정 지원자를 식별할 수 없게 일반화해서 정리한 것이다. 같은 연차 백엔드 채용을 준비하는 면접관에게도, 반대로 면접을 앞둔 더 읽기
BFF 패턴에서 OAuth2 + PKCE 인증 흐름 문서화하기 — /auth/login부터 /auth/logout까지
WebView(React) + Spring Boot 구조에서 인증을 BFF(Backend for Frontend) 패턴으로 구현했다. 브라우저(WebView)는 토큰을 직접 들고 있지 않고, 백엔드가 OAuth2 + PKCE 흐름을 대신 수행한 뒤 세션 쿠키만 내려준다. IdP는 Auth0 Universal Login을 사용했다. 구현 후 팀에 공유할 기술 문서를 작성했는데, 다 쓰고 나서 검수해보니 빠진 게 세 가지 있었다. /auth/logout이 더 읽기
FCM 푸시 토큰, 언제 수집해야 하나 — 첫 화면 진입 vs 알림 동의 시점
하이브리드 앱(WebView + Spring Boot API)에 푸시 알림을 붙이면서 팀 안에서 한 번 정리하고 넘어가야 했던 질문이 있다. FCM 토큰은 언제 수집해서 서버에 저장해야 하는가? 구현 자체는 어렵지 않다. 문제는 “언제”다. 앱을 처음 켜자마자 받아둘지, 사용자가 알림에 동의한 시점에 받을지에 따라 서버의 데이터 모델과 개인정보 처리 관점이 달라진다. 결론은 동의 더 읽기
WebView 앱에서 구글 로그인이 막히는 이유 — OAuth 정책과 “최소 변경” 대응 방법
React를 WebView에 띄우고 백엔드는 Spring Boot API로 받는 하이브리드 앱을 만들다 보면, 소셜 로그인 단계에서 한 번은 반드시 부딪히는 문제가 있다. 구글 로그인 화면이 WebView 안에서 아예 열리지 않거나 403 disallowed_useragent 로 막히는 것이다. 처음 이 상황을 만나면 “앱 전체를 네이티브로 다시 짜야 하나?” 하는 생각이 들 수 있는데, 결론부터 더 읽기
AI에게 아키텍처를 질문할 때 프롬프트를 얼마나 구체적으로 작성해야 하는가? — Spring Batch EKS CronJob 사례로 보는 제약 조건의 중요성
AI에게 아키텍처를 질문할 때 프롬프트를 얼마나 구체적으로 작성해야 하는가 AI에게 시스템 아키텍처를 질문할 때 자주 발생하는 문제가 있다. 처음에는 단순히: 라는 정도의 정보만 전달한다. 그러면 AI는 대부분 다음 기준으로 답변하게 된다. 대표적으로 아래와 같은 구조를 추천하게 된다. 즉: 를 중심으로 접근한다. 그리고 대부분의 일반적인 시스템에서는 실제로 이 방향이 맞다. 그런데 더 읽기
Spring @Scheduled 동작 조건과 반복 실행 문제 해결 가이드
@Scheduled가 동작하지 않는 이유와 설정 조건 Spring의 @Scheduled는 단순히 어노테이션을 붙이는 것만으로는 동작하지 않습니다. 다음과 같은 조건이 반드시 충족되어야 합니다. ✅ 필수 설정 💥 예외 사례 아래와 같이 파라미터가 있는 메서드는 @Scheduled에서 예외가 발생합니다: ✅ 올바른 예시 cron 표현식 정리 표현식 설명 */2 * * * * ? 매 2초마다 더 읽기
Spring Batch ExecutionContext 사이즈 초과 원인과 해결 방법
1. ExecutionContext 사이즈 초과 발생 원인 Spring Batch에서 아래와 같은 방식으로 대용량 데이터를 ExecutionContext에 저장할 경우, 직렬화된 데이터가 수십 KB ~ 수 MB까지 증가하면서 DB 저장에 실패하거나 OutOfMemoryError가 발생할 수 있습니다. 2. 안전한 대체 전략 📌 2-1. Processor에서 get 후 즉시 remove 📌 2-2. StepExecutionListener로 꺼내고 바로 삭제 그리고 Processor에서 더 읽기
Apache POI SXSSFWorkbook 사용 시 OutOfMemoryError(OOM) 발생 원인 및 해결 전략
Apache POI의 SXSSFWorkbook은 대용량 Excel 파일을 메모리 부담 없이 생성할 수 있는 streaming 기반 API입니다. 하지만 적절히 설정하지 않으면 5만 건 이하의 데이터에서도 OOM(OutOfMemoryError)가 발생할 수 있습니다. 1. OOM 발생 원인 2. SXSSFWorkbook 생성 시 올바른 사용 예시 3. SXSSF는 랜덤 접근이 불가능 flush된 row는 메모리에서 제거되며, 이후 sheet.getRow(n)으로 접근할 더 읽기
Spring Boot 3 구동 지연 원인 분석 및 ConditionEvaluationReport 활용
1. 배경 Spring Boot 3 기반의 배치 시스템을 운영 중, 일부 구동 시점에서 눈에 띄는 지연 현상이 발생하여 이에 대한 분석을 진행하였습니다. JPA 미사용, 보안 비활성화 등의 전제가 있는 프로젝트입니다. 2. 분석 방식 Spring Boot 3.1 이상에서 제공하는 ConditionEvaluationReport 로그를 통해 자동 설정이 어떤 조건에 따라 적용 또는 제외되는지를 확인했습니다. 더 읽기