Blog

개발하면서 배운 것들을 기록합니다.

백엔드#동시성#Pessimistic Lock#HikariCP+1

이커머스 재고 차감, -1 고정 버그부터 비관적 락까지 — 동시성 제어 기록

주문 수량을 무시하고 재고를 -1만 차감하던 버그를 발견한 후, PESSIMISTIC_WRITE 락·데드락 방지·트랜잭션 타임아웃·커넥션 풀 튜닝까지 한 번에 정리한 기록.

8
백엔드#Kotlin#Java 21#Virtual Thread+2

runCatching, CompletableFuture, 가상 스레드, 코루틴 — 뭘 써야 하나

외부 API 호출에 elapsed 로깅과 병렬화를 적용하면서 마주친 선택지들. runCatching vs try/catch/finally, CompletableFuture vs 코루틴, commonPool vs Java 21 가상 스레드를 실제 코드 기준으로 비교한다.

5
백엔드#Spring Boot#JPA#HikariCP+2

Spring Boot OSIV, 왜 끄기가 무서울까

→ 월요일 아침마다 터지는 커넥션 풀 고갈. 로그를 추적하다 보니 OSIV가 범인이었다.

11
백엔드#FCM#에러처리#토큰

FCM 대규모 발송: 무효 토큰은 어떻게 처리해야 하나

→ FCM(Firebase Cloud Messaging)은 구글이 제공하는 모바일 푸시 알림 서비스다. 토큰은 각 기기를 식별하기 위해 FCM이 발급하는 고유 문자열이다.

13
백엔드#MySQL#배치#성능

MySQL 배치 INSERT가 느린 이유: rewriteBatchedStatements

→ `rewriteBatchedStatements`는 MySQL JDBC 드라이버 옵션으로, 여러 개의 INSERT 문을 하나의 멀티 로우 INSERT 문으로 합쳐서 보내주는 기능이다.

13
백엔드#MySQL#트러블슈팅#DB

MySQL 크로스 DB JOIN에서 터지는 두 가지 폭탄

스케줄러가 2개 스키마(데이터베이스 안에서 테이블, 뷰 등을 논리적으로 묶어놓은 단위)의 테이블을 JOIN 해야 했다. 사용자 정보는 A 스키마, 활동 기록은 B 스키마.

11