Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] feat: Club 페이징 적용 및 batch size 설정 #622

Merged
merged 24 commits into from
Oct 23, 2024

Conversation

J-I-H-O
Copy link
Contributor

@J-I-H-O J-I-H-O commented Oct 7, 2024

이슈

개발 사항

  • batch size 옵션 설정
  • 페이징 구현

전달 사항

  • 이슈에 적힌 내용 꼭 확인해주세요! 저희 의사 결정 과정을 담아두었습니다.

J-I-H-O and others added 15 commits September 26, 2024 14:00
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
Copy link

github-actions bot commented Oct 7, 2024

Test Results

220 tests  +158   220 ✅ +158   19s ⏱️ +18s
 45 suites + 36     0 💤 ±  0 
 45 files   + 36     0 ❌ ±  0 

Results for commit 921cc14. ± Comparison against base commit 59cb10f.

This pull request removes 62 and adds 220 tests. Note that renamed tests count towards both.
com.happy.friendogly.presentation.ui.club.detail.ClubDetailViewModelTest ‑ 모임 상세 로드에 실패하면 사용자에게 실패를 알리는 이벤트를 발생시킨다()
com.happy.friendogly.presentation.ui.club.detail.ClubDetailViewModelTest ‑ 모임 상세가 로드된다()
com.happy.friendogly.presentation.ui.club.detail.ClubDetailViewModelTest ‑ 모임 참여에 성공하면 사용자에게 참여 성공을 알리는 이벤트가 발생된다()
com.happy.friendogly.presentation.ui.club.detail.ClubDetailViewModelTest ‑ 모임 참여할 수 없는 경우 사용자에게 참여 실패를 알리는 이벤트가 발생한다()
com.happy.friendogly.presentation.ui.club.list.ClubListViewModelTest ‑ 등록한 주소가 없는 경우 사용자에게 주소 등록을 요구하는 화면을 표시한다()
com.happy.friendogly.presentation.ui.club.list.ClubListViewModelTest ‑ 등록한 주소의 모임 리스트가 로드된다()
com.happy.friendogly.presentation.ui.club.list.ClubListViewModelTest ‑ 모임 리스트 로드에 실패하면 사용자에게 에러 발생을 나타내는 화면을 표시한다()
com.happy.friendogly.presentation.ui.club.list.ClubListViewModelTest ‑ 적합한 모임이 없는 경우 사용자에게 모임이 없다는 것을 나타내는 화면을 표시한다()
com.happy.friendogly.presentation.ui.mypage.MyPageViewModelTest ‑ 내가 방장인 모임 이동 이벤트가 발생한다()
com.happy.friendogly.presentation.ui.mypage.MyPageViewModelTest ‑ 내가 참여한 모임 이동 이벤트가 발생한다()
…
com.happy.friendogly.DataSourceRoutingTest ‑ readOnly 트랜잭션이면 redaer 데이터소스가 바운딩된다.
com.happy.friendogly.DataSourceRoutingTest ‑ 쓰기전용 트랜잭션이면 Writer 데이터소스가 바운딩된다.
com.happy.friendogly.chat.controller.ChatMessageControllerTest ‑ 두 시점 사이의 채팅 메시지를 조회할 수 있다.
com.happy.friendogly.chat.service.ChatCommandServiceTest ‑ 채팅 메시지를 DB에 저장한다.
com.happy.friendogly.chat.service.ChatCommandServiceTest ‑ 채팅 입장 메시지를 DB에 저장한다.
com.happy.friendogly.chat.service.ChatCommandServiceTest ‑ 채팅 퇴장 메시지를 DB에 저장한다.
com.happy.friendogly.chat.service.ChatQueryServiceTest ‑ since 시간과 until 시간 사이의 (포함 X) 채팅 내역을 조회할 수 있다.
com.happy.friendogly.chat.service.ChatQueryServiceTest ‑ 채팅 메시지 시간 범위 조회에서, 시간 범위가 잘못된 경우 예외가 발생한다.
com.happy.friendogly.chat.service.ChatQueryServiceTest ‑ 채팅방에 들어가 있지 않은 Member는 채팅 내역을 조회할 수 없다.
com.happy.friendogly.chat.service.ChatRoomCommandServiceTest ‑ 1대1 채팅방 저장 과정에서, 이미 채팅방이 존재하면 기존 채팅방 ID를 반환한다.
…

♻️ This comment has been updated with latest results.

J-I-H-O and others added 2 commits October 7, 2024 17:49
Co-authored-by: jimi567 <repday0609@gmail.com>
Comment on lines 75 to 83
private Slice<Club> fetchClubSlice(FindClubByFilterRequest request, LocalDateTime lastFoundCreatedAt, Long lastFoundId) {
return clubRepository.findAllBy(
request.province(),
Gender.toGenders(request.genderParams()),
SizeType.toSizeTypes(request.sizeParams()),
PageRequest.ofSize(request.pageSize()),
lastFoundCreatedAt,
lastFoundId
);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ofSize 예정대로 20개의 2배로 잡고
hasNext를 그대로 내려주지 않고, fetch해서 result에 add했을 때, fetch -> result로 포함안된
추가적인 record가 있을 경우 저희가 hasNext를 true로 변환해서 응답해줄 수 있을 것 같습니다.
추가 구현 후 다시 리뷰받도록 하져

Comment on lines +20 to +25
club.getAllowedSizes().stream()
.map(clubSize -> clubSize.getClubSizeId().getAllowedSize())
.collect(Collectors.toSet()),
club.getAllowedGenders().stream()
.map(clubGender -> clubGender.getClubGenderId().getAllowedGender())
.collect(Collectors.toSet())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 List -> Set으로 바꾸는거죠? 한 줄로 될 것 같아요!

Comment on lines +99 to +100
this.allowedGenders = allowedGenders.stream().map(gender -> new ClubGender(this, gender)).toList();
this.allowedSizes = allowedSizes.stream().map(sizeType -> new ClubSize(this, sizeType)).toList();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기도 stream까지 필요없을 것 같아요

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

map때문에 stream한 것 같은데 다른 방법이 있나요??

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앗 맞네요 ㅋㅋ

Comment on lines 37 to 39
public boolean isSameGenderWith(Gender gender) {
return this.getClubGenderId().getAllowedGender() == gender;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public boolean isSameGenderWith(Gender gender) {
return this.getClubGenderId().getAllowedGender() == gender;
}
public boolean hasGender(Gender gender) {
return this.getClubGenderId().getAllowedGender() == gender;
}

이름 제안해봅니당

Comment on lines 37 to 39
public boolean isSameSizeWith(SizeType sizeType) {
return this.getClubSizeId().getAllowedSize() == sizeType;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public boolean isSameSizeWith(SizeType sizeType) {
return this.getClubSizeId().getAllowedSize() == sizeType;
}
public boolean hasSizeType(SizeType sizeType) {
return this.getClubSizeId().getAllowedSize() == sizeType;
}

제안

Comment on lines -218 to +203
boolean isNotFull = !this.memberCapacity.isCapacityReached(countClubMember());

return hasJoinablePet && isNotFull && !isAlreadyJoined(member) && isOpen();
return hasJoinablePet && !isAlreadyJoined(member) && isOpen();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isOpen에 isNotFull이 포함이군요 ~!!

Copy link
Contributor

@ehtjsv2 ehtjsv2 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생했습니다. servie로직에서 궁금한 게 있는데, 대면으로 물어보는 게 나을 것 같아서 찾아가겠습니다~

Comment on lines +99 to +100
this.allowedGenders = allowedGenders.stream().map(gender -> new ClubGender(this, gender)).toList();
this.allowedSizes = allowedSizes.stream().map(sizeType -> new ClubSize(this, sizeType)).toList();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

map때문에 stream한 것 같은데 다른 방법이 있나요??

FROM ClubSize CS
WHERE C = CS.clubSizeId.club AND CS.clubSizeId.allowedSize IN :searchingSizes
)
ORDER BY C.createdAt DESC, C.id DESC
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 의문이 들었는데요,

1.

createdAt으로 먼저 정렬하고 id값으로 정렬한다는 것은 같은 createdAt이 있을 수 있다는 가정인 것이겠죠??
사실 이 정도로 정확성을 맞춰야 하는가 싶기도 하고, id는 pk이지만 정렬 기준을 두 번째로 했기 때문에, 기존에 pk로 만들어진 엔덱스는 사용할 수 없을 것으로 보입니다.
아마 fileSort가 createdAt한번 id 한번 총 두번 나올 것 같아요. 복합인덱스를 하지않았다면.

2.

id를 정렬기준에 놓았다는 것은 auto-increment라는 가정하에 한 것 같습니다. id를 정렬기준에서 하지 말아야한다는 주장은 아닙니다, 어차피 id를 정렬기준으로 놓는다면 createdAt은 정렬기준에서 없어도 되는 게 아닌 가 싶습니다. createdAt->id 정렬 하면 결국 id를 기준으로 정렬된다고 생각합니다.
제 주장은 createdAt만 정렬기준으로 두거나, id만 정렬기준으로 두거나 입니다. createdAt만 한다면 인덱스를 걸면 성능이 좋겠네요~!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 합리적인 것 같습니다

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정합성을 맞춘다고 추가한 것은 맞아요. composite index를 추가하는 것이 정합성을 맞추는 공수보다 덜 든다고 생각했어요.

제 주장은 createdAt만 정렬기준으로 두거나, id만 정렬기준으로 두거나 입니다.

id 생성전략에 의존적인 형태로 개발을 하고 싶지 않았어요.
사실 저희 서비스에서 생성시점이 ms 기준으로 중복될 정도의 데이터가 현실적으로 발생하냐고 물어보면 아니라고 생각해요(슬프지만..)
다만, 실제 테스트를 해보면 그런 상황이 종종 나와요.
비록 최신순 정렬이라는 별 것 없는 기능으로 보일 수 있지만 어느 정도 저희가 제어가능하고 예상 가능한 결과값이 나와야한다는 생각이였습니다.

Copy link
Contributor

@ehtjsv2 ehtjsv2 Oct 10, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

id 생성전략에 의존적인 형태로 개발을 하고 싶지 않았어요.

제가 하고싶은 말이랑 같은 말입니다. 이미 id를 정렬기준에 넣은 이상 auto-increment를 가정하고있고, id의 생성전략에 의존적인 형태로 개발하고 있는 것이랑 같지 않냐는 뜻입니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 저희 서비스에서 생성시점이 ms 기준으로 중복될 정도의 데이터가 현실적으로 발생하냐고 물어보면 아니라고 생각해요(슬프지만..)
다만, 실제 테스트를 해보면 그런 상황이 종종 나와요.

나온다고 해도 그정도의 정합성이 필요한 서비스인가? 라는 질문을 하고싶었던 것입니다. 저도 아예안나온다고 생각하지는 않구요!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

createdAt만 기준으로 사용하는건 사실 어려울 것 같아요.
페이징 때문에 where절에서 createdAt을 사용하고 있어요. 이때 완전히 동일한 시간에 생성된 두 모임이 존재할 수 있기 때문에, 데이터 누락을 막기 위해 createdAt 이외의 기준이 추가로 필요합니다. 그 기준으로 id를 고려한 것이에요.
차라리 id만 기준으로 사용할 수도 있을 것 같은데.. 어떻게 생각하시나요?

Co-authored-by: jimi567 <repday0609@gmail.com>
Comment on lines 51 to 55
@GetMapping("/searching")
public ApiResponse<List<FindClubByFilterResponse>> findByFilter(
public ApiResponse<FindClubPageByFilterResponse> findByFilter(
@Auth Long memberId,
@Valid @ModelAttribute FindClubByFilterRequest request
) {
Copy link
Contributor

@takoyakimchi takoyakimchi Oct 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이전 버전 앱 사용자는 명세가 바뀌면서 예외가 터질 수도 있을 것 같아요.
단순히 기존 명세에서 필드가 추가만 되었다고 하더라도 예측이 쉽지만은 않을 것 같아요.
버저닝 하는 건 어떨까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 의견이에요.
하지만 지금 채팅과 관련해서 강제 업데이트를 고려하고 있고, 서버 입장에서 위험한 API인 전체 조회 로직을 제거하는거라 더이상 지원하지 않는게 맞는 것 같습니다.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체조회 위험하긴 하네요 ~!!

J-I-H-O and others added 5 commits October 11, 2024 16:44
# Conflicts:
#	backend/src/main/java/com/happy/friendogly/club/controller/ClubController.java
Co-authored-by: jimi567 <repday0609@gmail.com>
Co-authored-by: jimi567 <repday0609@gmail.com>
takoyakimchi
takoyakimchi previously approved these changes Oct 21, 2024
Copy link
Contributor

@takoyakimchi takoyakimchi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨어요. dev에서도 다시한번 클라이언트 작동 확인하면 좋겠네요!

ehtjsv2
ehtjsv2 previously approved these changes Oct 21, 2024
Copy link
Contributor

@ehtjsv2 ehtjsv2 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

jimi567
jimi567 previously approved these changes Oct 21, 2024
Copy link
Member

@jimi567 jimi567 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

후..드디어 끝났네요.
고생했다 친구야!

@J-I-H-O J-I-H-O dismissed stale reviews from jimi567, ehtjsv2, and takoyakimchi via 921cc14 October 23, 2024 01:05
@J-I-H-O J-I-H-O merged commit 20cdaa4 into develop Oct 23, 2024
3 checks passed
@J-I-H-O J-I-H-O deleted the refactor/batch-size branch October 23, 2024 01:12
takoyakimchi pushed a commit that referenced this pull request Oct 23, 2024
Co-authored-by: jimi567 <repday0609@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🖥 backend backend 🤹 enhance 성능 개선 ✨ feat 기능 개발 🛠️ refactor 리팩터링
Projects
None yet
Development

Successfully merging this pull request may close these issues.

페이징 DTO 분리 모임 리스트 조회 시 페이징 적용 batch size 전역 설정
4 participants