## 📖 작업 개요 - 트래킹 세션 종료/생성/GPS publish 등에서 @Transactional 메서드 내부에 외부 API(기상청) 호출이나 Redis 호출이 섞여 있어 DB 커넥션을 오래 점유하는 문제를 개선한다. ## 🧩 작업 내용 - [ ] `TrackingSessionService.complete()` — `weatherService.getTemperature()`(최대 3초 블로킹) 호출을 DB 저장 트랜잭션 밖으로 분리 - [ ] `TrackingSessionService.create()` — 마일스톤 초기화(Redis SET+EXPIRE)를 DB 저장 트랜잭션과 분리할지 검토 - [ ] `TrackingGpsPublisher.publish()` — `readOnly` 트랜잭션 내 Redis Stream publish 분리 검토 (고빈도 WebSocket 경로) - [ ] `TrackingSessionExpiryScheduler.expireStaleSessions()` — 반복문 안에서 세션 수만큼 Redis GET을 호출하는 구조 개선(배치 조회 등) --- ## 📱 관련 화면 / 기능 - [ ] 지도 - [ ] 등산 기록 - [ ] 코스 추천 - [ ] 커뮤니티 - [x] 기타: 실시간 GPS 트래킹 --- ## 💬 기타 사항 - `complete()`는 세션 종료 시 매번 호출되는 경로라 우선순위가 가장 높고, 나머지 3개는 함께 검토 권장
📖 작업 개요
🧩 작업 내용
TrackingSessionService.complete()—weatherService.getTemperature()(최대 3초 블로킹) 호출을 DB 저장 트랜잭션 밖으로 분리TrackingSessionService.create()— 마일스톤 초기화(Redis SET+EXPIRE)를 DB 저장 트랜잭션과 분리할지 검토TrackingGpsPublisher.publish()—readOnly트랜잭션 내 Redis Stream publish 분리 검토 (고빈도 WebSocket 경로)TrackingSessionExpiryScheduler.expireStaleSessions()— 반복문 안에서 세션 수만큼 Redis GET을 호출하는 구조 개선(배치 조회 등)📱 관련 화면 / 기능
💬 기타 사항
complete()는 세션 종료 시 매번 호출되는 경로라 우선순위가 가장 높고, 나머지 3개는 함께 검토 권장