[Feat] #20 트래킹 세션 종료 시 하이킹 기록 생성#54
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/main/resources/db/migration/002_hiking_record_extension.sql`:
- Around line 45-53: Add a DB-level uniqueness guard so each tracking_session_id
maps to at most one hiking_records row: in the migration that alters table
hiking_records (currently adding fk_hiking_records_tracking_session and creating
idx_hiking_records_tracking_session), also create a UNIQUE constraint or UNIQUE
INDEX on hiking_records(tracking_session_id) (e.g. name it
uq_hiking_records_tracking_session or
unique_idx_hiking_records_tracking_session) using the same IF NOT EXISTS pattern
so retries/concurrent runs are safe; ensure the UNIQUE creation follows/avoids
conflict with the existing fk_hiking_records_tracking_session and
idx_hiking_records_tracking_session.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 2ce8896c-99e6-4ec1-86de-f1a680da581b
📒 Files selected for processing (5)
src/main/java/com/semosan/api/domain/hiking/entity/HikingRecord.javasrc/main/java/com/semosan/api/domain/tracking/dto/response/TrackingSessionResponse.javasrc/main/java/com/semosan/api/domain/tracking/service/TrackingSessionService.javasrc/main/java/com/semosan/api/domain/tracking/service/TrackingSessionStatsService.javasrc/main/resources/db/migration/002_hiking_record_extension.sql
| ALTER TABLE hiking_records | ||
| ADD CONSTRAINT fk_hiking_records_tracking_session | ||
| FOREIGN KEY (tracking_session_id) REFERENCES tracking_sessions(id); | ||
| END IF; | ||
| END$$; | ||
|
|
||
| -- 6) 조회 인덱스 (HikingRecord 로 트래킹 세션 역방향 찾을 일은 거의 없으나, 디버그/분석용) | ||
| CREATE INDEX IF NOT EXISTS idx_hiking_records_tracking_session | ||
| ON hiking_records (tracking_session_id); |
There was a problem hiding this comment.
Enforce one-record-per-session at DB level.
tracking_session_id currently has FK + index only, so duplicate hiking_records per session are still possible under retries/concurrency. Add a unique constraint (or unique index) on tracking_session_id to protect data integrity.
Suggested migration adjustment
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.table_constraints
WHERE table_name = 'hiking_records'
AND constraint_name = 'fk_hiking_records_tracking_session'
) THEN
ALTER TABLE hiking_records
ADD CONSTRAINT fk_hiking_records_tracking_session
FOREIGN KEY (tracking_session_id) REFERENCES tracking_sessions(id);
END IF;
END$$;
-CREATE INDEX IF NOT EXISTS idx_hiking_records_tracking_session
- ON hiking_records (tracking_session_id);
+CREATE UNIQUE INDEX IF NOT EXISTS uq_hiking_records_tracking_session
+ ON hiking_records (tracking_session_id)
+ WHERE tracking_session_id IS NOT NULL;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ALTER TABLE hiking_records | |
| ADD CONSTRAINT fk_hiking_records_tracking_session | |
| FOREIGN KEY (tracking_session_id) REFERENCES tracking_sessions(id); | |
| END IF; | |
| END$$; | |
| -- 6) 조회 인덱스 (HikingRecord 로 트래킹 세션 역방향 찾을 일은 거의 없으나, 디버그/분석용) | |
| CREATE INDEX IF NOT EXISTS idx_hiking_records_tracking_session | |
| ON hiking_records (tracking_session_id); | |
| ALTER TABLE hiking_records | |
| ADD CONSTRAINT fk_hiking_records_tracking_session | |
| FOREIGN KEY (tracking_session_id) REFERENCES tracking_sessions(id); | |
| END IF; | |
| END$$; | |
| -- 6) 조회 인덱스 (HikingRecord 로 트래킹 세션 역방향 찾을 일은 거의 없으나, 디버그/분석용) | |
| CREATE UNIQUE INDEX IF NOT EXISTS uq_hiking_records_tracking_session | |
| ON hiking_records (tracking_session_id) | |
| WHERE tracking_session_id IS NOT NULL; |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/resources/db/migration/002_hiking_record_extension.sql` around lines
45 - 53, Add a DB-level uniqueness guard so each tracking_session_id maps to at
most one hiking_records row: in the migration that alters table hiking_records
(currently adding fk_hiking_records_tracking_session and creating
idx_hiking_records_tracking_session), also create a UNIQUE constraint or UNIQUE
INDEX on hiking_records(tracking_session_id) (e.g. name it
uq_hiking_records_tracking_session or
unique_idx_hiking_records_tracking_session) using the same IF NOT EXISTS pattern
so retries/concurrent runs are safe; ensure the UNIQUE creation follows/avoids
conflict with the existing fk_hiking_records_tracking_session and
idx_hiking_records_tracking_session.
1b1d692 to
7a65656
Compare
|
|
||
| -- 6) 조회 인덱스 (HikingRecord 로 트래킹 세션 역방향 찾을 일은 거의 없으나, 디버그/분석용) | ||
| CREATE INDEX IF NOT EXISTS idx_hiking_records_tracking_session | ||
| ON hiking_records (tracking_session_id); |
| /** 등산 중 도달한 최고 고도 (m) */ | ||
| /** 등산 중 도달한 최고 고도 (m). */ | ||
| @Column(name = "max_altitude", nullable = false) | ||
| private Double altitude; |
There was a problem hiding this comment.
이거 columne name이랑 entity 필드 명이랑 불일치
| return TrackingSessionResponse.from(session); | ||
|
|
||
| TrackingSessionStatsService.Stats stats = statsService.getStats(sessionId); | ||
| HikingRecord record = HikingRecord.fromTrackingSession( |
There was a problem hiding this comment.
stats의 pointCount가 0이면 통계 데이터 없음으로 간주하고 경고 처리나 예외 처리하면 좋을 듯!
There was a problem hiding this comment.
좋습니다 일단 예외는 안넣고 로그만 넣었습니다
| @@ -0,0 +1,53 @@ | |||
| -- ===================================================================== | |||
[Feat] #19 트래킹 GPS 머지
…record-finalize # Conflicts: # src/main/java/com/semosan/api/domain/tracking/service/TrackingSessionService.java
- 002_hiking_record_extension.sql 삭제, V9__extend_hiking_record.sql 신규 작성 - 기존 002 내용 + tracking_session_id UNIQUE 제약 (세션당 기록 1건 강제) - HikingRecord.altitude 필드명을 컬럼명과 정합되게 maxAltitude 로 변경 (DTO 응답 키 호환 위해 HikingRecordSummaryResponse 필드명은 유지) - TrackingSessionService.complete: stats.pointCount == 0 일 때 경고 로그 추가
🧾 요약
HikingRecord를 자동 생성하도록 구현했습니다.🔗 이슈
✨ 변경 내용
기타사항
002_hiking_record_extension.sql) 추가한건 머지할때 빼겠습니다 !max_altitude·caloriesNOT NULL + 0 fallback → nullable 화 필요✅ 확인
Summary by CodeRabbit