Skip to content

Commit 2dd76e2

Browse files
committed
refactor: HikingRecord 확장 마이그레이션 V9 + 리뷰 반영
- 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 일 때 경고 로그 추가
1 parent b412b69 commit 2dd76e2

5 files changed

Lines changed: 50 additions & 56 deletions

File tree

src/main/java/com/semosan/api/domain/hiking/dto/HikingRecordSummaryResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static HikingRecordSummaryResponse from(HikingRecord record) {
1818
record.getMountain().getName(),
1919
record.getCourse().getName(),
2020
record.getDuration(),
21-
record.getAltitude(),
21+
record.getMaxAltitude(),
2222
record.getCalories(),
2323
record.getCliveImageUrl(),
2424
record.getPhotoReportImageUrl()

src/main/java/com/semosan/api/domain/hiking/entity/HikingRecord.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class HikingRecord extends BaseEntity {
4545

4646
/** 등산 중 도달한 최고 고도 (m). */
4747
@Column(name = "max_altitude", nullable = false)
48-
private Double altitude;
48+
private Double maxAltitude;
4949

5050
/**
5151
* 소모 칼로리 (kcal).
@@ -99,7 +99,7 @@ public static HikingRecord fromTrackingSession(
9999
.course(session.getCourse())
100100
.trackingSession(session)
101101
.duration(duration)
102-
.altitude(maxAltitude == null ? 0.0 : maxAltitude)
102+
.maxAltitude(maxAltitude == null ? 0.0 : maxAltitude)
103103
.calories(0) // TODO: 칼로리 산정 공식 도입 시 교체
104104
.distance(distance)
105105
.ascent(ascent)

src/main/java/com/semosan/api/domain/tracking/service/TrackingSessionService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import com.semosan.api.domain.user.entity.User;
2020
import com.semosan.api.domain.user.service.UserReader;
2121
import lombok.RequiredArgsConstructor;
22+
import lombok.extern.slf4j.Slf4j;
2223
import org.springframework.context.ApplicationEventPublisher;
2324
import org.springframework.stereotype.Service;
2425
import org.springframework.transaction.annotation.Transactional;
2526

2627
import java.util.Optional;
2728

29+
@Slf4j
2830
@Service
2931
@RequiredArgsConstructor
3032
@Transactional(readOnly = true)
@@ -92,6 +94,10 @@ public TrackingSessionResponse complete(Long userId, Long sessionId) {
9294
session.complete();
9395

9496
TrackingSessionStatsService.Stats stats = statsService.getStats(sessionId);
97+
if (stats.pointCount() == 0) {
98+
// GPS 점이 한 건도 들어오지 않은 채 종료 — 사용자의 명시적 종료는 존중하되 통계가 비어있음을 알림.
99+
log.warn("Completing tracking session {} with no GPS points; stats will be zero/null", sessionId);
100+
}
95101
HikingRecord record = HikingRecord.fromTrackingSession(
96102
session,
97103
stats.distanceMeters(),

src/main/resources/db/migration/002_hiking_record_extension.sql

Lines changed: 0 additions & 53 deletions
This file was deleted.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
-- =====================================================================
2+
-- V9__extend_hiking_record.sql
3+
-- 목적: 트래킹 흐름에서 생성될 HikingRecord 확장.
4+
-- - 트래킹 세션 참조 (tracking_session_id, UNIQUE — 세션당 기록 1건 강제)
5+
-- - 시간 정보 (started_at, ended_at, paused_seconds_total)
6+
-- - GPS 통계 (distance, ascent, descent)
7+
-- - 자유 기록 대응 (course_id NOT NULL → NULLABLE)
8+
-- =====================================================================
9+
10+
-- 1) course_id 를 nullable 로 (자유 기록 대응)
11+
ALTER TABLE hiking_records
12+
ALTER COLUMN course_id DROP NOT NULL;
13+
14+
-- 2) 트래킹 세션 참조
15+
ALTER TABLE hiking_records
16+
ADD COLUMN IF NOT EXISTS tracking_session_id bigint;
17+
18+
-- 3) 시간 정보
19+
ALTER TABLE hiking_records
20+
ADD COLUMN IF NOT EXISTS started_at timestamp(6);
21+
ALTER TABLE hiking_records
22+
ADD COLUMN IF NOT EXISTS ended_at timestamp(6);
23+
ALTER TABLE hiking_records
24+
ADD COLUMN IF NOT EXISTS paused_seconds_total integer not null default 0;
25+
26+
-- 4) GPS 통계
27+
ALTER TABLE hiking_records
28+
ADD COLUMN IF NOT EXISTS distance double precision;
29+
ALTER TABLE hiking_records
30+
ADD COLUMN IF NOT EXISTS ascent double precision;
31+
ALTER TABLE hiking_records
32+
ADD COLUMN IF NOT EXISTS descent double precision;
33+
34+
-- 5) FK + UNIQUE 제약 (NULL 은 표준 UNIQUE 검사에서 제외돼 수동 기록은 영향 없음)
35+
ALTER TABLE hiking_records
36+
ADD CONSTRAINT fk_hiking_records_tracking_session
37+
FOREIGN KEY (tracking_session_id) REFERENCES tracking_sessions(id);
38+
39+
ALTER TABLE hiking_records
40+
ADD CONSTRAINT uk_hiking_records_tracking_session
41+
UNIQUE (tracking_session_id);

0 commit comments

Comments
 (0)