diff --git a/src/main/java/com/dnd/dndtravel/map/repository/custom/MemberAttractionRepositoryImpl.java b/src/main/java/com/dnd/dndtravel/map/repository/custom/MemberAttractionRepositoryImpl.java index 6c69db1..ef27760 100644 --- a/src/main/java/com/dnd/dndtravel/map/repository/custom/MemberAttractionRepositoryImpl.java +++ b/src/main/java/com/dnd/dndtravel/map/repository/custom/MemberAttractionRepositoryImpl.java @@ -7,6 +7,7 @@ import java.util.List; import com.dnd.dndtravel.map.repository.dto.projection.RecordProjection; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -46,9 +47,11 @@ public List findAttractionRecords(long memberId, long cursorNo attraction )) .from(memberAttraction) - .join(member).on(memberAttraction.member.id.eq(memberId)) .join(attraction).on(memberAttraction.attraction.id.eq(attraction.id)) - .where(memberAttraction.id.lt(cursorNo)) + .where( + memberAttraction.member.id.eq(memberId), + ltCursorNo(cursorNo) + ) .orderBy(memberAttraction.id.desc()) .limit(displayPerPage) .fetch(); @@ -61,4 +64,11 @@ public Long entireVisitCount(long memberId) { .where(memberAttraction.member.id.eq(memberId)) .fetchOne(); } + + private BooleanExpression ltCursorNo(Long cursorNo) { + if (cursorNo == null || cursorNo <= 0) { + return null; // 조건 없이 최신 데이터부터 조회 + } + return memberAttraction.id.lt(cursorNo); + } } diff --git a/src/main/java/com/dnd/dndtravel/map/repository/custom/PhotoRepositoryImpl.java b/src/main/java/com/dnd/dndtravel/map/repository/custom/PhotoRepositoryImpl.java index 2ba999b..b7236a8 100644 --- a/src/main/java/com/dnd/dndtravel/map/repository/custom/PhotoRepositoryImpl.java +++ b/src/main/java/com/dnd/dndtravel/map/repository/custom/PhotoRepositoryImpl.java @@ -28,7 +28,6 @@ public List findByRecordDtos(List r memberAttraction.id, photo.url)) .from(photo) - .join(photo.memberAttraction, memberAttraction) .where(photo.memberAttraction.id.in(memberAttractionIds)) .fetch(); } diff --git a/src/main/java/com/dnd/dndtravel/map/repository/dto/projection/RecordProjection.java b/src/main/java/com/dnd/dndtravel/map/repository/dto/projection/RecordProjection.java index ede4cec..21eef94 100644 --- a/src/main/java/com/dnd/dndtravel/map/repository/dto/projection/RecordProjection.java +++ b/src/main/java/com/dnd/dndtravel/map/repository/dto/projection/RecordProjection.java @@ -14,7 +14,6 @@ @Getter public class RecordProjection { private final long memberAttractionId; - private String attractionName; private final String memo; private final LocalDate visitDate; private final String region; @@ -39,7 +38,7 @@ public void inputPhotoUrls(List attractionPhotoProjec } } - public void inputAttractionNames() { - this.attractionName = this.attraction.getName(); + public String getAttractionName() { + return this.attraction.getName(); } } diff --git a/src/main/java/com/dnd/dndtravel/map/service/MapService.java b/src/main/java/com/dnd/dndtravel/map/service/MapService.java index 80e879e..be0bb86 100644 --- a/src/main/java/com/dnd/dndtravel/map/service/MapService.java +++ b/src/main/java/com/dnd/dndtravel/map/service/MapService.java @@ -91,23 +91,17 @@ public void recordAttraction(RecordDto recordDto, long memberId) { // 모든 기록 조회 @Transactional(readOnly = true) public AttractionRecordsResponse allRecords(long memberId, long cursorNo, int displayPerPage) { - //validation - Member member = memberRepository.findById(memberId).orElseThrow(() -> new MemberNotFoundException(memberId)); - List memberAttractions = memberAttractionRepository.findByMemberId(memberId); - if (memberAttractions.isEmpty()) { + //전체 방문 기록 수 조회 + Long visitCount = memberAttractionRepository.entireVisitCount(memberId); + + //방문기록이 없는경우 + if (visitCount == 0) { return new AttractionRecordsResponse(0, List.of()); } - // 첫 커서값인 경우 - if (cursorNo <= 0) { - cursorNo = memberAttractionRepository.maxCursor(member.getId()); - } List attractionRecords = memberAttractionRepository.findAttractionRecords(memberId, cursorNo, displayPerPage); - Long visitCount = memberAttractionRepository.entireVisitCount(memberId); - // 명소명 저장 - attractionRecords.forEach(RecordProjection::inputAttractionNames); - // 사진 URL 저장 + //사진 URL 저장 setPhotoUrlsWithJoin(attractionRecords); return new AttractionRecordsResponse(visitCount, attractionRecords.stream()