Skip to content

Commit 082b095

Browse files
authored
Merge pull request #281 from SEMOSAN/refactor/#275-tracking-session-fetch-join
[Refactor] TrackingSession 조회 시 fetch join 적용하여 N+1 쿼리 제거
2 parents 84cb9cd + 9eaa85b commit 082b095

3 files changed

Lines changed: 28 additions & 4 deletions

File tree

src/main/java/com/semosan/api/domain/tracking/dto/response/TrackingSessionResponse.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@ public static TrackingSessionResponse from(TrackingSession session) {
2929
}
3030

3131
public static TrackingSessionResponse from(TrackingSession session, Long hikingRecordId) {
32+
var course = session.getCourse();
3233
return new TrackingSessionResponse(
3334
session.getId(),
3435
session.getUser().getId(),
3536
session.getMountain().getId(),
3637
session.getMountain().getName(),
37-
session.getCourse() != null ? session.getCourse().getId() : null,
38-
session.getCourse() != null ? session.getCourse().getName() : null,
38+
course != null ? course.getId() : null,
39+
course != null ? course.getName() : null,
3940
session.getIsFreeRecording(),
4041
session.getStatus(),
4142
session.getStartedAt(),

src/main/java/com/semosan/api/domain/tracking/repository/TrackingSessionRepository.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,29 @@ Optional<TrackingSession> findFirstByUser_IdAndStatusInOrderByStartedAtDesc(
2222
Collection<TrackingSessionStatus> statuses
2323
);
2424

25+
@Query("""
26+
SELECT ts FROM TrackingSession ts
27+
JOIN FETCH ts.user
28+
JOIN FETCH ts.mountain
29+
LEFT JOIN FETCH ts.course
30+
WHERE ts.id = :id
31+
""")
32+
Optional<TrackingSession> findByIdWithRelations(@Param("id") Long id);
33+
34+
@Query("""
35+
SELECT ts FROM TrackingSession ts
36+
JOIN FETCH ts.user
37+
JOIN FETCH ts.mountain
38+
LEFT JOIN FETCH ts.course
39+
WHERE ts.user.id = :userId AND ts.status IN :statuses
40+
ORDER BY ts.startedAt DESC
41+
LIMIT 1
42+
""")
43+
Optional<TrackingSession> findFirstActiveWithRelations(
44+
@Param("userId") Long userId,
45+
@Param("statuses") Collection<TrackingSessionStatus> statuses
46+
);
47+
2548
/**
2649
* 24h 자동 만료 스케줄러용.
2750
* 활성 상태(IN_PROGRESS/PAUSED) 이면서 마지막 업데이트가 cutoff 이전인 세션을 찾는다.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public TrackingSessionResponse create(Long userId, CreateTrackingSessionRequest
8282

8383
public Optional<TrackingSessionResponse> getActive(Long userId) {
8484
return trackingSessionRepository
85-
.findFirstByUser_IdAndStatusInOrderByStartedAtDesc(userId, TrackingSessionStatus.ACTIVE_STATES)
85+
.findFirstActiveWithRelations(userId, TrackingSessionStatus.ACTIVE_STATES)
8686
.map(TrackingSessionResponse::from);
8787
}
8888

@@ -158,7 +158,7 @@ public TrackingSessionResponse abandon(Long userId, Long sessionId) {
158158
}
159159

160160
private TrackingSession findOwnedSession(Long userId, Long sessionId) {
161-
TrackingSession session = trackingSessionRepository.findById(sessionId)
161+
TrackingSession session = trackingSessionRepository.findByIdWithRelations(sessionId)
162162
.orElseThrow(() -> new GeneralException(ErrorStatus.TRACKING_SESSION_NOT_FOUND));
163163
if (!session.isOwnedBy(userId)) {
164164
throw new GeneralException(ErrorStatus.TRACKING_SESSION_FORBIDDEN);

0 commit comments

Comments
 (0)