← 탐색

태그된 포스트: spring boot

백엔드 깊이보기 · ·3분 읽기

타임아웃 안 건 RestTemplate 하나가 서버 전체를 멈췄다

새벽 2시 47분, 슬랙에 알림이 쏟아졌다. 결제 API 응답률 0%.

spring bootresttemplate타임아웃
백엔드 깊이보기 · ·3분 읽기

배치 메일이 8통씩 나가는데 3개월간 아무도 몰랐다

CS팀에서 "고객이 같은 알림 메일을 여러 통 받는다"는 티켓이 올라온 건 금요일 오후였다. 재현도 안 되고, 로그도 깨끗하고, 코드에 버그도 없었다.

spring bootscheduledshedlock
백엔드 깊이보기 · ·3분 읽기

Kafka consumer group.instance.id 안 넣었을 뿐인데 배포마다 5분씩 메시지가 멈췄다

프로덕션 배포가 끝나면 Grafana를 5분 정도 지켜보는 게 루틴이었다. 그런데 어느 순간부터 배포 직후 consumer lag 그래프가 수직으로 치솟았다가 천천히 내려오는 패턴이 반복됐다.

kafkaspring bootkubernetes
백엔드 깊이보기 · ·3분 읽기

캐시가 날아간 30초 동안 일어난 일

금요일 밤 11시, PagerDuty가 울렸다. Redis 클러스터 마스터 1대가 메모리 부족으로 eviction을 시작했고, 페일오버가 진행되는 30초 동안 캐시 히트율이 98%에서 0%로 떨어졌다.

redisspring boot캐시
백엔드 깊이보기 · ·2분 읽기

readOnly = true인데 레플리카를 한 번도 안 탄 3개월

Aurora 읽기 전용 레플리카를 추가한 건 2월이었다. 라이터 DB의 CPU가 80%를 찍길래 급하게 도입했고, AbstractRoutingDataSource로 readOnly 트랜잭션을 레플리카로 보내는 구조를 잡았다.

spring bootjpaaurora
백엔드 깊이보기 · ·2분 읽기

Spring Boot 3에서 4로, 이틀이면 끝날 줄 알았다

Spring Boot 3.4에서 4.

spring bootjackson 3jspecify
백엔드 깊이보기 · ·3분 읽기

@Timed 태그에 userId 넣었을 뿐인데 Prometheus가 OOM으로 죽었다

커스텀 메트릭 하나 추가한 게 전부였다. "사용자별 API 응답 시간 추적하면 좋겠다"는 PM의 요청에 @Timed 어노테이션에 userId 태그를 하나 끼워 넣었고, 스테이징에서 잘 돌았고, 배포했다.

micrometerprometheusspring boot
백엔드 깊이보기 · ·3분 읽기

@Version 하나 붙였을 뿐인데 발급 요청 절반이 실패했다

쿠폰 발급 테이블에 동시 수정이 가능하다는 코드 리뷰가 달렸고, 다음 날 PR에 @Version 필드가 추가됐다. 낙관적 락을 걸면 충돌 시 예외가 터지니까 안전하다 — 이론적으로는 맞다.

jpaoptimistic locking동시성
백엔드 깊이보기 · ·3분 읽기

maximumPoolSize=10인데 DB 커넥션이 380개가 된 이유

새벽 4시 반, 슬랙에 "DB connection pool exhausted" 알림이 쏟아졌다. DB 서버의 CPU 사용률은 15%.

spring boothikaricpkubernetes
백엔드 깊이보기 · ·3분 읽기

Actuator health 엔드포인트가 파드 12개를 연쇄로 죽인 밤

readiness probe 설정할 때 "/actuator/health 쓰면 되죠?"라고 대답하는 개발자가 많다.

spring bootkubernetesactuator
백엔드 깊이보기 · ·3분 읽기

Virtual Thread 켰더니 오히려 처리량이 반토막 났다

Spring Boot 4에서 spring.threads.

spring bootvirtual threadpinning
백엔드 깊이보기 · ·3분 읽기

SELECT FOR UPDATE 안 걸었을 뿐인데 포인트가 두 배로 지급됐다

동시에 두 명이 포인트를 사용하면 잔액이 마이너스가 되지 않는 게 당연하다고 생각했다. 그 생각이 틀렸다는 걸 화요일 오후 CS 인입량이 알려줬다.

spring bootjpa동시성
백엔드 깊이보기 · ·3분 읽기

LLM 호출 한 줄이 톰캣 스레드 200개를 잡아먹기까지

Spring AI 2.0 GA가 5월 28일에 나온다.

spring aispring boot톰캣
백엔드 깊이보기 · ·3분 읽기

캐시 TTL을 전부 10분으로 맞춘 그날 새벽

캐시 정리의 최적화라고 생각했다. 서비스 전체에 흩어진 @Cacheable 설정을 보니 TTL이 3분, 7분, 15분, 30분 — 제각각이었다.

spring bootrediscache stampede
백엔드 깊이보기 · ·3분 읽기

launch { } 안에서 터진 예외는 어디로 가는가

새벽 2시, 슬랙 알림이 울린다. 결제 완료 후 포인트 적립이 안 됐다는 CS가 3건 들어왔다.

kotlincoroutinesspring boot
백엔드 깊이보기 · ·2분 읽기

Spring Boot 4 올렸더니 결제 응답이 조용히 깨졌다

지난달 팀에서 Spring Boot 4로 올리면서 "Jackson 3? 패키지명만 바뀌었겠지"라고 생각했다.

spring bootjacksonmigration
백엔드 깊이보기 · ·4분 읽기

@Retryable 3번 설정했을 뿐인데 외부 호출이 27배가 됐다

재시도 로직은 백엔드 개발자의 안전장치지만, 서비스 체인에 겹겹이 쌓이면 증폭기로 돌변한다. 지난달 결제 API 장애 때 우리가 겪은 일이 정확히 이것이었고, 새벽 2시에 PagerDuty가 울렸을 때 처음 본 지표는 외부 API 오류가 아니라 우리 서버의 스레드 풀 고갈이었다.

spring bootspring retryretry amplification
백엔드 깊이보기 · ·3분 읽기

@Transactional 안에 RestClient 호출 한 줄 넣었더니 커넥션 풀이 말랐다

주문 API에서 결제 게이트웨이 연동 하나 추가한 게 전부였다. 배포하고 트래픽 올라가자마자 HikariCP 커넥션 대기 큐가 쌓이기 시작했고, 30초 만에 ConnectionTimeoutException이 터졌다.

spring boottransactionalhikaricp
백엔드 깊이보기 · ·2분 읽기

Graceful Shutdown 설정했는데 502가 계속 나오는 이유

배포할 때마다 502가 몇 건씩 찍힌다. Grafana 봐도 서버 과부하가 아니고, Rolling Update가 돌 때만 나타난다.

spring bootkubernetesgraceful shutdown
백엔드 깊이보기 · ·3분 읽기

Virtual Thread 켰더니 HikariCP가 먼저 터졌다

운영 서버에 Virtual Thread를 적용한 지 이틀 만에 Slack 알림이 울렸다. Connection is not available, request timed out after 30000ms.

virtual threadspring boothikaricp
1 / 2 Next →