Skip to content

Commit 1261120

Browse files
authored
Merge pull request #107 from UMCWegg/feature/#72
FIX: [#72] 주변 weggy 핫플 조회 API repository Native Query->JPQL로 수정
2 parents 31411d0 + 28b32e4 commit 1261120

2 files changed

Lines changed: 25 additions & 40 deletions

File tree

‎src/main/java/umc/wegg/repository/AddressRepository.java‎

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,39 +20,23 @@ List<Address> findAddressesInRange(@Param("minX") double minX,
2020
@Param("minY") double minY,
2121
@Param("maxY") double maxY);
2222

23-
@Query(value = """
24-
SELECT a.id,
25-
CAST((6371 * acos(cos(radians(:centerLat)) * cos(radians(a.latitude)) *
26-
cos(radians(a.longitude) - radians(:centerLon)) +
27-
sin(radians(:centerLat)) * sin(radians(a.latitude)))) AS DOUBLE) AS distance,
28-
(SELECT COUNT(p.id)
29-
FROM Posts p
30-
JOIN Plans pl ON p.plan_id = pl.id
31-
WHERE pl.address_id = a.id) AS authCount
32-
FROM Address a
33-
WHERE a.longitude BETWEEN :minX AND :maxX
34-
AND a.latitude BETWEEN :minY AND :maxY
35-
ORDER BY
36-
CASE WHEN :sortBy = 'distance' THEN distance ELSE NULL END ASC,
37-
CASE WHEN :sortBy = 'authCount' THEN authCount ELSE NULL END DESC
38-
LIMIT :size OFFSET :page
39-
""",
40-
countQuery = """
41-
SELECT COUNT(*) FROM Address a
42-
WHERE a.longitude BETWEEN :minX AND :maxX
43-
AND a.latitude BETWEEN :minY AND :maxY
44-
""",
45-
nativeQuery = true)
46-
List<Object[]> findAddressesWithSorting(
23+
@Query("SELECT a, " +
24+
"(SELECT COUNT(p.id) FROM Post p JOIN Plan pl ON p.plan.id = pl.id WHERE pl.address.id = a.id) AS authCount, " +
25+
"(6371 * acos(\n" +
26+
"cos(radians(:centerLat)) * cos(radians(a.latitude)) *" +
27+
"cos(radians(a.longitude) - radians(:centerLon)) + " +
28+
"sin(radians(:centerLat)) * sin(radians(a.latitude)))) AS distance " +
29+
"FROM Address a " +
30+
"WHERE a.longitude BETWEEN :minX AND :maxX " +
31+
"AND a.latitude BETWEEN :minY AND :maxY")
32+
Page<Object[]> findAddressesWithSorting(
4733
@Param("minX") double minX,
4834
@Param("maxX") double maxX,
4935
@Param("minY") double minY,
5036
@Param("maxY") double maxY,
5137
@Param("centerLat") double centerLat,
5238
@Param("centerLon") double centerLon,
53-
@Param("sortBy") String sortBy,
54-
@Param("page") int page,
55-
@Param("size") int size
39+
PageRequest pageRequest
5640
);
5741

5842
//사용자 위치를 중심으로 특정 거리 내의 주소를 조회하는 쿼리

‎src/main/java/umc/wegg/service/MapService/MapServiceImpl.java‎

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,28 +98,32 @@ public MapResponseDTO.SearchHotPlaceListDTO searchHotPlaceListByKeyword(MapReque
9898
@Override
9999
public MapResponseDTO.HotPlaceListDTO viewHotPlaceList(MapRequestDTO.ViewHotPlaceDTO request, Integer page, Integer size){
100100

101+
Sort sort = Sort.by(Sort.Direction.ASC, "distance");
102+
103+
if ("authCount".equals(request.getSortBy())) {
104+
sort = Sort.by(Sort.Direction.DESC, "authCount");
105+
}
106+
101107
// DB에서 sortBy에 따라 addressId, distance, authCount 계산해서 가져오기(Paging 적용)
102-
List<Object[]> resultPage = addressRepository.findAddressesWithSorting(
108+
Page<Object[]> resultPage = addressRepository.findAddressesWithSorting(
103109
request.getMinX(), request.getMaxX(),
104110
request.getMinY(), request.getMaxY(),
105111
(request.getMinX() + request.getMaxX()) / 2, // 중심 좌표
106112
(request.getMinY() + request.getMaxY()) / 2,
107-
request.getSortBy(),
108-
page,
109-
size
113+
PageRequest.of(page, size, sort)
110114
);
111115

112116
// DB에서 가져온 값으로 DTO 생성
113117
MapResponseDTO.HotPlaceListDTO hotPlaceList = new MapResponseDTO.HotPlaceListDTO(
114118
resultPage.stream()
115119
.map(row -> {
116-
// DB에서 addressId, distance, authCount 가져오기
117-
Long addressId = (Long) row[0]; // addressId
118-
Double distance = (Double) row[1]; // 거리
119-
Long authCount = (Long) row[2]; // 인증된 개수
120+
// DB에서 address, distance, authCount 가져오기
121+
Address address = (Address) row[0]; // address
122+
Long authCount = (Long) row[1]; // authCount
123+
Double distance = (Double) row[2]; //distance
120124

121125
// Plan을 거쳐서 Post 목록 가져오기(15개)
122-
List<Post> latestPosts = postRepository.findLatestPostsByAddressId(addressId, PageRequest.of(0, 15, Sort.by(Sort.Direction.DESC, "createdAt")));
126+
List<Post> latestPosts = postRepository.findLatestPostsByAddressId(address.getId(), PageRequest.of(0, 15, Sort.by(Sort.Direction.DESC, "createdAt")));
123127

124128
List<MapResponseDTO.HotPlaceListDTO.HotPlaceDTO.PostDTO> postList = latestPosts.stream()
125129
.map(post -> new MapResponseDTO.HotPlaceListDTO.HotPlaceDTO.PostDTO(
@@ -128,10 +132,7 @@ public MapResponseDTO.HotPlaceListDTO viewHotPlaceList(MapRequestDTO.ViewHotPlac
128132
.collect(Collectors.toList());
129133

130134
// 저장된 횟수 계산 (my_address 테이블에서 address_id로 저장된 레코드 수 조회)
131-
Long saveCount = myAddressRepository.countByAddressId(addressId);
132-
133-
Address address = addressRepository.findById(addressId)
134-
.orElseThrow(() -> new IllegalArgumentException("해당 장소를 찾을 수 없습니다."));
135+
Long saveCount = myAddressRepository.countByAddressId(address.getId());
135136

136137
return new MapResponseDTO.HotPlaceListDTO.HotPlaceDTO(
137138
address.getId(),

0 commit comments

Comments
 (0)