Skip to content

Commit 490d723

Browse files
authored
Merge pull request #313 from CampingOn/revert-312-improve/#284-queryOptimizer
Revert "Improve/#284 camp, bookmark 도메인 fetch join을 이용한 n+1문제 해결"
2 parents 9dca71d + ea406eb commit 490d723

File tree

9 files changed

+194
-232
lines changed

9 files changed

+194
-232
lines changed

Diff for: src/main/java/site/campingon/campingon/bookmark/repository/BookmarkRepository.java

+1-9
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33

44
import org.springframework.data.jpa.repository.JpaRepository;
5-
import org.springframework.data.jpa.repository.Query;
6-
import org.springframework.data.repository.query.Param;
75
import org.springframework.stereotype.Repository;
86
import site.campingon.campingon.bookmark.entity.Bookmark;
97

@@ -13,11 +11,5 @@
1311
public interface BookmarkRepository extends JpaRepository<Bookmark, Long> {
1412
boolean existsByCampIdAndUserId(Long campId, Long userId);
1513

16-
@Query("SELECT b FROM Bookmark b " +
17-
"JOIN FETCH b.camp c " +
18-
"JOIN FETCH c.campAddr " +
19-
"JOIN FETCH c.campInfo " +
20-
"JOIN FETCH b.user " +
21-
"WHERE b.camp.id = :campId AND b.user.id = :userId")
22-
Optional<Bookmark> findByCampIdAndUserId(@Param("campId") Long campId, @Param("userId") Long userId);
14+
Optional<Bookmark> findByCampIdAndUserId(Long campId, Long userId);
2315
}

Diff for: src/main/java/site/campingon/campingon/camp/entity/Camp.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import jakarta.persistence.*;
44
import lombok.*;
5-
import org.hibernate.annotations.LazyToOne;
6-
import org.hibernate.annotations.LazyToOneOption;
75
import site.campingon.campingon.bookmark.entity.Bookmark;
86
import site.campingon.campingon.common.public_data.dto.GoCampingParsedResponseDto;
97

@@ -67,10 +65,10 @@ public class Camp{
6765
@Builder.Default
6866
private List<CampInduty> induty=new ArrayList<>(); // 업종
6967

70-
@OneToOne(mappedBy = "camp", cascade = CascadeType.ALL, orphanRemoval = true,fetch = FetchType.LAZY)
68+
@OneToOne(mappedBy = "camp", cascade = CascadeType.ALL, orphanRemoval = true)
7169
private CampAddr campAddr;
7270

73-
@OneToOne(mappedBy = "camp", cascade = CascadeType.ALL, orphanRemoval = true,fetch = FetchType.LAZY)
71+
@OneToOne(mappedBy = "camp", cascade = CascadeType.ALL, orphanRemoval = true)
7472
private CampInfo campInfo;
7573

7674
@OneToMany(mappedBy = "camp", cascade = CascadeType.ALL, orphanRemoval = true)
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
package site.campingon.campingon.camp.repository;
22

33
import org.springframework.data.jpa.repository.JpaRepository;
4-
import org.springframework.data.jpa.repository.Query;
5-
import org.springframework.data.repository.query.Param;
64
import org.springframework.stereotype.Repository;
75
import site.campingon.campingon.camp.entity.CampInfo;
86

97
import java.util.Optional;
108

119
@Repository
1210
public interface CampInfoRepository extends JpaRepository<CampInfo, Long> {
13-
@Query("SELECT ci FROM CampInfo ci " +
14-
"JOIN FETCH ci.camp c " +
15-
"JOIN FETCH c.campAddr " +
16-
"WHERE c.id = :campId")
17-
Optional<CampInfo> findByCampId(@Param("campId") Long id);
11+
Optional<CampInfo> findByCampId(Long id);
1812
}

Diff for: src/main/java/site/campingon/campingon/camp/repository/CampRepository.java

+6-24
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,21 @@
1010
import site.campingon.campingon.camp.entity.Camp;
1111

1212
import java.util.List;
13-
import java.util.Optional;
1413

1514
@Repository
1615
public interface CampRepository extends JpaRepository<Camp, Long> {
1716

1817
// 캠핑장 정보의 추천수의 내림차순으로 캠핑장 정렬
19-
@Query(value = """
18+
@Query("""
2019
SELECT c FROM Camp c
21-
JOIN FETCH c.campInfo ci
22-
JOIN FETCH c.campAddr
23-
ORDER BY ci.recommendCnt DESC, c.thumbImage DESC
24-
""", countQuery = "SELECT COUNT(c) FROM Camp c"
25-
)
20+
JOIN CampInfo ci ON c.id = ci.camp.id
21+
ORDER BY ci.recommendCnt DESC
22+
""")
2623
Page<Camp> findPopularCamps(Pageable pageable);
2724

28-
@Query("""
29-
SELECT c FROM Camp c
30-
JOIN FETCH c.campInfo
31-
JOIN FETCH c.campAddr
32-
WHERE c.id= :campId
33-
""")
34-
Optional<Camp> findById(@Param("campId") Long campId);
35-
3625
// 사용자의 isMarked 된 캠핑장 목록 페이지
37-
@Query(value = """
38-
SELECT c FROM Camp c
39-
JOIN FETCH c.campInfo
40-
JOIN FETCH c.campAddr
41-
JOIN c.bookmarks b
42-
WHERE b.user.id = :userId
43-
ORDER BY b.createdAt DESC
44-
""",countQuery = "SELECT COUNT(c) FROM Camp c JOIN c.bookmarks b WHERE b.user.id= :userId")
45-
Page<Camp> findByBookmarksUserId(@Param("userId") Long userId, Pageable pageable);
26+
@Query("SELECT c FROM Camp c JOIN c.bookmarks b WHERE b.user.id = :userId ORDER BY b.createdAt DESC")
27+
Page<Camp> findByBookmarks_User_Id(@Param("userId") Long userId, Pageable pageable);
4628

4729
//쿼리 최적화 where in 조건
4830
@Modifying

Diff for: src/main/java/site/campingon/campingon/camp/repository/CampSiteRepository.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,8 @@ public interface CampSiteRepository extends JpaRepository<CampSite, Long> {
2121
""")
2222
List<CampSite> findByCampId(@Param("campId") Long campId);
2323

24-
@Query(value = """
24+
@Query("""
2525
SELECT cs FROM CampSite cs
26-
JOIN FETCH cs.camp c
27-
JOIN FETCH c.campInfo
28-
JOIN FETCH c.campAddr
2926
WHERE cs.id = :siteId
3027
AND cs.camp.id = :campId
3128
""")

Diff for: src/main/java/site/campingon/campingon/camp/service/CampService.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
import site.campingon.campingon.camp.mapper.CampMapper;
1313
import site.campingon.campingon.camp.repository.CampRepository;
1414
import site.campingon.campingon.bookmark.repository.BookmarkRepository;
15+
import site.campingon.campingon.camp.repository.mongodb.MongoSearchClient;
1516
import site.campingon.campingon.common.exception.ErrorCode;
1617
import site.campingon.campingon.common.exception.GlobalException;
18+
import site.campingon.campingon.user.repository.UserKeywordRepository;
1719

1820
import java.util.Collections;
1921
import java.util.List;
@@ -60,7 +62,7 @@ public CampDetailResponseDto getCampDetail(Long campId) {
6062

6163
// 사용자의 찜한 캠핑장 목록 조회
6264
public Page<CampListResponseDto> getBookmarkedCamps(Long userId, Pageable pageable) {
63-
Page<Camp> bookmarkedCamps = campRepository.findByBookmarksUserId(userId, pageable);
65+
Page<Camp> bookmarkedCamps = campRepository.findByBookmarks_User_Id(userId, pageable);
6466

6567
List<CampListResponseDto> campDtos = bookmarkedCamps.getContent().stream()
6668
.map(camp -> {

Diff for: src/test/java/site/campingon/campingon/camp/service/CampServiceTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ void getBookmarkedCamps_success() {
295295
List<Camp> camps = Arrays.asList(mockCamp);
296296
Page<Camp> campPage = new PageImpl<>(camps, pageable, camps.size());
297297

298-
when(campRepository.findByBookmarksUserId(userId, pageable))
298+
when(campRepository.findByBookmarks_User_Id(userId, pageable))
299299
.thenReturn(campPage);
300300
when(campMapper.toCampListDto(any(Camp.class))).thenReturn(mockCampListDto);
301301

@@ -307,7 +307,7 @@ void getBookmarkedCamps_success() {
307307
assertEquals(1, result.getTotalElements());
308308
assertTrue(result.getContent().get(0).isMarked());
309309

310-
verify(campRepository).findByBookmarksUserId(userId, pageable);
310+
verify(campRepository).findByBookmarks_User_Id(userId, pageable);
311311
verify(campMapper).toCampListDto(any(Camp.class));
312312
}
313313

@@ -319,7 +319,7 @@ void getBookmarkedCamps_noBookmarks_returnsEmptyList() {
319319
Pageable pageable = PageRequest.of(0, 3);
320320
Page<Camp> emptyPage = new PageImpl<>(Collections.emptyList(), pageable, 0);
321321

322-
when(campRepository.findByBookmarksUserId(userId, pageable))
322+
when(campRepository.findByBookmarks_User_Id(userId, pageable))
323323
.thenReturn(emptyPage);
324324

325325
// when
@@ -328,7 +328,7 @@ void getBookmarkedCamps_noBookmarks_returnsEmptyList() {
328328
// then
329329
assertTrue(result.isEmpty());
330330
assertEquals(0, result.getTotalElements());
331-
verify(campRepository).findByBookmarksUserId(userId, pageable);
331+
verify(campRepository).findByBookmarks_User_Id(userId, pageable);
332332
}
333333

334334
// 캠핑장 관리자 테스트 CRUD

Diff for: src/test/java/site/campingon/campingon/common/public_data/service/GoCampingServiceTest.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.junit.jupiter.api.extension.ExtendWith;
77
import org.mockito.*;
88
import org.mockito.junit.jupiter.MockitoExtension;
9-
import org.springframework.boot.test.context.SpringBootTest;
109
import org.springframework.web.client.RestTemplate;
1110
import site.campingon.campingon.camp.repository.*;
1211
import site.campingon.campingon.common.public_data.GoCampingPath;
@@ -51,7 +50,7 @@ class GoCampingServiceTest {
5150
@Mock
5251
private CampIndutyRepository campIndutyRepository;
5352

54-
@Mock
53+
@Spy
5554
private RestTemplate restTemplate;
5655

5756

@@ -67,8 +66,6 @@ void testGetAndConvertToGoCampingDataDto_Success() throws Exception {
6766
String numOfRows = "1";
6867
String pageNo = "1";
6968

70-
URI mockUri = new URI("http://example.com"); // 반환할 실제 URI 객체 생성
71-
7269
// Item 객체 생성
7370
GoCampingDataDto.Item item = GoCampingDataDto.Item.builder()
7471
.contentId(123L).facltNm("Sample Camping Site")
@@ -101,10 +98,10 @@ void testGetAndConvertToGoCampingDataDto_Success() throws Exception {
10198
)
10299
.build();
103100
System.out.println("goCampingDataDto :" + goCampingDataDto);
104-
when(goCampingProviderService.createUri(any(GoCampingPath.class),anyString(), anyString(), anyString(), anyString())).thenReturn(mockUri);
105101

106-
doReturn(goCampingDataDto).when(restTemplate).getForObject(eq(mockUri), eq(GoCampingDataDto.class));
102+
doReturn(goCampingDataDto).when(restTemplate).getForObject(any(URI.class), eq(GoCampingDataDto.class));
107103

104+
//when
108105
GoCampingDataDto result = goCampingService.fetchCampData(GoCampingPath.BASED_LIST, "numOfRows", numOfRows, "pageNo", pageNo);
109106

110107
// then

0 commit comments

Comments
 (0)