-
Notifications
You must be signed in to change notification settings - Fork 3
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] refactor: Club 매핑 테이블 엔티티 연관 관계 개선 #165
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.woowacourse.friendogly.club.repository; | ||
|
||
import com.woowacourse.friendogly.club.domain.ClubPet; | ||
import java.util.List; | ||
import org.springframework.data.jpa.repository.EntityGraph; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface ClubPetRepository extends JpaRepository<ClubPet, Long> { | ||
|
||
@EntityGraph(attributePaths = {"club", "pet"}) | ||
List<ClubPet> findAllByClubId(Long id); | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,14 +1,19 @@ | ||||||||||||||||||||||||||||||||||||||
package com.woowacourse.friendogly.club.service; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
import static java.util.stream.Collectors.toList; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.domain.Club; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.domain.ClubMember; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.domain.ClubPet; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.dto.request.FindSearchingClubRequest; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.dto.response.FindSearchingClubResponse; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.repository.ClubMemberPetRepository; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.repository.ClubMemberRepository; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.repository.ClubPetRepository; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.repository.ClubRepository; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.club.repository.ClubSpecification; | ||||||||||||||||||||||||||||||||||||||
import com.woowacourse.friendogly.pet.domain.Pet; | ||||||||||||||||||||||||||||||||||||||
import java.util.List; | ||||||||||||||||||||||||||||||||||||||
import java.util.Map; | ||||||||||||||||||||||||||||||||||||||
import java.util.stream.Collectors; | ||||||||||||||||||||||||||||||||||||||
import org.springframework.data.jpa.domain.Specification; | ||||||||||||||||||||||||||||||||||||||
import org.springframework.stereotype.Service; | ||||||||||||||||||||||||||||||||||||||
import org.springframework.transaction.annotation.Transactional; | ||||||||||||||||||||||||||||||||||||||
|
@@ -19,16 +24,16 @@ public class ClubQueryService { | |||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private final ClubRepository clubRepository; | ||||||||||||||||||||||||||||||||||||||
private final ClubMemberRepository clubMemberRepository; | ||||||||||||||||||||||||||||||||||||||
private final ClubMemberPetRepository clubMemberPetRepository; | ||||||||||||||||||||||||||||||||||||||
private final ClubPetRepository clubPetRepository; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
public ClubQueryService( | ||||||||||||||||||||||||||||||||||||||
ClubRepository clubRepository, | ||||||||||||||||||||||||||||||||||||||
ClubMemberRepository clubMemberRepository, | ||||||||||||||||||||||||||||||||||||||
ClubMemberPetRepository clubMemberPetRepository | ||||||||||||||||||||||||||||||||||||||
ClubPetRepository clubPetRepository | ||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||
this.clubRepository = clubRepository; | ||||||||||||||||||||||||||||||||||||||
this.clubMemberRepository = clubMemberRepository; | ||||||||||||||||||||||||||||||||||||||
this.clubMemberPetRepository = clubMemberPetRepository; | ||||||||||||||||||||||||||||||||||||||
this.clubPetRepository = clubPetRepository; | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
public List<FindSearchingClubResponse> findSearching(FindSearchingClubRequest request) { | ||||||||||||||||||||||||||||||||||||||
|
@@ -39,18 +44,23 @@ public List<FindSearchingClubResponse> findSearching(FindSearchingClubRequest re | |||||||||||||||||||||||||||||||||||||
.build(); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
return clubRepository.findAll(spec).stream() | ||||||||||||||||||||||||||||||||||||||
.map(club -> { | ||||||||||||||||||||||||||||||||||||||
List<String> overviewPetImages = clubMemberRepository.findAllByClubId(club.getId()).stream() | ||||||||||||||||||||||||||||||||||||||
.map(ClubMember::findOverviewPetImage) | ||||||||||||||||||||||||||||||||||||||
.toList(); | ||||||||||||||||||||||||||||||||||||||
return new FindSearchingClubResponse( | ||||||||||||||||||||||||||||||||||||||
club, | ||||||||||||||||||||||||||||||||||||||
clubMemberRepository.countByClubId(club.getId()), | ||||||||||||||||||||||||||||||||||||||
overviewPetImages | ||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||
.map(club -> new FindSearchingClubResponse( | ||||||||||||||||||||||||||||||||||||||
club, | ||||||||||||||||||||||||||||||||||||||
clubMemberRepository.countByClubId(club.getId()), | ||||||||||||||||||||||||||||||||||||||
collectOverviewPetImages(club) | ||||||||||||||||||||||||||||||||||||||
)) | ||||||||||||||||||||||||||||||||||||||
.toList(); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private List<String> collectOverviewPetImages(Club club) { | ||||||||||||||||||||||||||||||||||||||
Map<Long, List<Pet>> groupPetsByMemberId = clubPetRepository.findAllByClubId(club.getId()).stream() | ||||||||||||||||||||||||||||||||||||||
.map(ClubPet::getPet) | ||||||||||||||||||||||||||||||||||||||
.collect(Collectors.groupingBy(pet -> pet.getMember().getId())); | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 굳굳 이렇게 해결됐구나..! |
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
return groupPetsByMemberId.values().stream() | ||||||||||||||||||||||||||||||||||||||
.map(petList -> petList.get(0).getImageUrl().getValue()) | ||||||||||||||||||||||||||||||||||||||
.collect(toList()); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
Comment on lines
+55
to
+63
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -23,8 +23,7 @@ class ClubQueryServiceTest extends ClubServiceTest { | |||||
@DisplayName("필터링된 모임을 정보를 조회한다.") | ||||||
@Test | ||||||
void findSearching() { | ||||||
//서울특별시 송파구 신청동, (암컷, 중성화 암컷), 크기는 소형견이 조건인 club | ||||||
Club club = saveNewClub(); | ||||||
Club club = getSavedClub(Set.of(Gender.FEMALE, Gender.FEMALE_NEUTERED), Set.of(SizeType.SMALL)); | ||||||
|
||||||
FindSearchingClubRequest request = new FindSearchingClubRequest( | ||||||
address, | ||||||
|
@@ -54,4 +53,20 @@ void findSearching() { | |||||
() -> assertThat(actual.petImageUrls()).containsExactlyInAnyOrderElementsOf(expected.petImageUrls()) | ||||||
); | ||||||
} | ||||||
|
||||||
@DisplayName("필터링된 모임을 정보가 없으면 빈 리스트를 반환한다.") | ||||||
@Test | ||||||
void findSearching_Nothing() { | ||||||
Club club = getSavedClub(Set.of(Gender.FEMALE, Gender.FEMALE_NEUTERED), Set.of(SizeType.SMALL)); | ||||||
|
||||||
FindSearchingClubRequest request = new FindSearchingClubRequest( | ||||||
address, | ||||||
Set.of(Gender.MALE), | ||||||
Set.of(SizeType.SMALL) | ||||||
); | ||||||
|
||||||
List<FindSearchingClubResponse> responses = clubQueryService.findSearching(request); | ||||||
|
||||||
assertThat(responses.isEmpty()).isTrue(); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
} | ||||||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -2,7 +2,7 @@ | |||||
|
||||||
import com.woowacourse.friendogly.club.domain.Club; | ||||||
import com.woowacourse.friendogly.club.domain.ClubMember; | ||||||
import com.woowacourse.friendogly.club.domain.ClubMemberPet; | ||||||
import com.woowacourse.friendogly.club.domain.ClubPet; | ||||||
import com.woowacourse.friendogly.member.domain.Member; | ||||||
import com.woowacourse.friendogly.pet.domain.Gender; | ||||||
import com.woowacourse.friendogly.pet.domain.Pet; | ||||||
|
@@ -33,31 +33,32 @@ public abstract class ClubServiceTest extends ServiceTest { | |||||
.sizeType(SizeType.SMALL) | ||||||
.build(); | ||||||
|
||||||
private final Club club = Club.create( | ||||||
"강아지 산책시키실 분 모아요.", | ||||||
"매주 주말에 정기적으로 산책 모임하실분만", | ||||||
address, | ||||||
5, | ||||||
member, | ||||||
allowedGenders, | ||||||
allowedSizes, | ||||||
"https://image.com"); | ||||||
|
||||||
protected Club saveNewClub() { | ||||||
protected Club getSavedClub(Set<Gender> genders, Set<SizeType> sizes) { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
메서드명은 get으로 되어 있지만 내부적으로는 생성도 하고 있네요. |
||||||
memberRepository.save(member); | ||||||
petRepository.save(pet); | ||||||
|
||||||
Club club = Club.create( | ||||||
"강아지 산책시키실 분 모아요.", | ||||||
"매주 주말에 정기적으로 산책 모임하실분만", | ||||||
address, | ||||||
5, | ||||||
member, | ||||||
genders, | ||||||
sizes, | ||||||
"https://image.com"); | ||||||
|
||||||
Club savedClub = clubRepository.save(club); | ||||||
ClubMember clubMember = ClubMember.builder() | ||||||
.member(member) | ||||||
.club(club) | ||||||
.build(); | ||||||
|
||||||
Comment on lines
51
to
55
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. clubMember는 member, club 순으로 생성하고 |
||||||
ClubMemberPet clubMemberPet = ClubMemberPet.builder() | ||||||
.clubMember(clubMember) | ||||||
ClubPet clubPet = ClubPet.builder() | ||||||
.club(club) | ||||||
.pet(pet) | ||||||
.build(); | ||||||
clubMemberRepository.save(clubMember); | ||||||
clubMemberPetRepository.save(clubMemberPet); | ||||||
clubPetRepository.save(clubPet); | ||||||
|
||||||
return savedClub; | ||||||
} | ||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍