Skip to content

Commit d5805af

Browse files
committed
refactor: 등산 기록 단건 조회 fetch join + 칼로리 기본 체중 TODO
- HikingRecord 단건 상세 조회 시 Mountain/Course 를 fetch join 으로 함께 가져와 응답 조립 단계의 LAZY 추가 SELECT 2건을 제거. - 칼로리 기본 체중(65kg) 대체 정책에 향후 개선 방향(성별·나이 추정, 온보딩 단계 입력 강제) TODO 주석 추가.
1 parent f619c3a commit d5805af

3 files changed

Lines changed: 17 additions & 1 deletion

File tree

src/main/java/com/semosan/api/domain/hiking/repository/HikingRecordRepository.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,22 @@
1111
import org.springframework.data.repository.query.Param;
1212

1313
import java.util.List;
14+
import java.util.Optional;
1415

1516
public interface HikingRecordRepository extends JpaRepository<HikingRecord, Long> {
1617

18+
/**
19+
* 단건 상세 조회용. Mountain 은 INNER, Course 는 LEFT JOIN FETCH(자유기록은 null) 로 한 쿼리에 묶는다.
20+
* 응답 조립 시 mountain.name / course.name 접근으로 발생하는 추가 SELECT 를 막는다.
21+
*/
22+
@Query("""
23+
SELECT hr FROM HikingRecord hr
24+
JOIN FETCH hr.mountain
25+
LEFT JOIN FETCH hr.course
26+
WHERE hr.id = :id
27+
""")
28+
Optional<HikingRecord> findWithMountainAndCourseById(@Param("id") Long id);
29+
1730
@Query(
1831
value = """
1932
SELECT hm.hiking_record_id

src/main/java/com/semosan/api/domain/hiking/service/CalorieCalculator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
*/
1313
public final class CalorieCalculator {
1414

15+
// TODO: 체중 미등록 시 한국 성인 평균치(65kg) 로 일괄 대체 중. 향후 사용자 성별·나이 기반 추정값
16+
// 또는 온보딩 단계에서 체중 입력 강제로 정확도 개선 검토.
1517
static final double DEFAULT_WEIGHT_KG = 65.0;
1618

1719
private static final double MET_EASY = 6.0;

src/main/java/com/semosan/api/domain/hiking/service/HikingRecordService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ public Page<GetUserHikingRecordResponse> getUserHikingRecordsByMountainId(
8282
@Transactional(readOnly = true)
8383
public HikingRecordDetailResponse getHikingRecordDetail(Long userId, Long hikingRecordId) {
8484
User user = userReader.findCompletedOnboardingUserById(userId);
85-
HikingRecord record = hikingRecordRepository.findById(hikingRecordId)
85+
// Mountain / Course 를 fetch join 으로 함께 가져와 응답 조립 시 추가 SELECT 를 막는다.
86+
HikingRecord record = hikingRecordRepository.findWithMountainAndCourseById(hikingRecordId)
8687
.orElseThrow(() -> new GeneralException(ErrorStatus.HIKING_RECORD_NOT_FOUND));
8788

8889
if (!hikingMemberRepository.existsByHikingRecordAndUser(record, user)) {

0 commit comments

Comments
 (0)