2025/10 2

멀티 스레드 환경에서 공유 세션으로 발생한 동시성 경합과 커넥션 누수 분석 및 해결

동기에서 비동기 로직으로의 변경제 서비스는 상대방에게 편지를 작성하면 DB에 저장하고 편지주인에게 FCM 푸시 알림을 전송합니다.기존에는 편지를 작성하면 DB에 저장하고 상대방에게 FCM 푸시 알림까지 동기적으로 하였습니다.응답속도 개선을 위해 FCM 푸시 알림 로직을 별도의 스레드 풀을 사용하는 비동기 이벤트 구조로 변경했습니다. 문제 발생그 이후 동일한 테스트를 시행했을 때 ConcurrentModificationException이라는 다량의 예외와 동시에 DB 커넥션 누수가 탐지되었습니다. 커넥션 생성주기가 짧아서 그런 것일 까봐 커넥션 생명주기와 RDS의 타임아웃 설정을 조정해도 같은 문제가 발생했습니다. 문제의 코드// 1. 메인 스레드 편지 보내기 로직public void 편지 보내기(Stri..

소셜 로그인/회원가입 반환 프로토콜 재설계

문제 발견시작은 단순했다. “기존 회원과 신규 회원의 로그인 반환값을 어떻게 구분할까?”당시 구조에서는 MemberDetail이라는 DTO가 모든 책임을 떠안고 있었다. 로그인 과정에서 Member 도메인이 MemberDetail을 생성해 Auth 도메인으로 넘기고, Auth는 그 DTO를 기반으로 JWT와 쿠키를 발급했다.하지만 곧 두 가지 문제가 눈에 들어왔다.첫째, 기존 회원과 신규 회원의 흐름이 모두 하나의 DTO에 묶여 있어 분기 로직이 어색했다. 기존 회원의 경우 실제 Member 엔티티가 필요한데, DTO로 변환되는 순간 더티 체킹이나 추가 갱신이 불가능했다. 반대로 신규 회원은 DTO만 넘겨둔 채 Redis에 임시 저장을 맡기다 보니 “회원가입을 완료하지 않은 사용자”의 상태를 추적하기가 ..