diff --git a/backend/src/main/java/mouda/backend/moim/implement/finder/MoimFinder.java b/backend/src/main/java/mouda/backend/moim/implement/finder/MoimFinder.java index d3b91db6..a0b638ce 100644 --- a/backend/src/main/java/mouda/backend/moim/implement/finder/MoimFinder.java +++ b/backend/src/main/java/mouda/backend/moim/implement/finder/MoimFinder.java @@ -1,8 +1,12 @@ package mouda.backend.moim.implement.finder; import java.util.List; +import java.util.Map; import java.util.function.Predicate; +import mouda.backend.moim.infrastructure.dto.ChamyoCountResponse; +import mouda.backend.moim.presentation.response.moim.MoimFindAllResponse; +import mouda.backend.moim.presentation.response.moim.MoimFindAllResponses; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @@ -20,6 +24,8 @@ import mouda.backend.moim.infrastructure.MoimRepository; import mouda.backend.moim.infrastructure.ZzimRepository; +import static java.util.stream.Collectors.toMap; + @Component @RequiredArgsConstructor public class MoimFinder { @@ -28,9 +34,6 @@ public class MoimFinder { private final ChamyoRepository chamyoRepository; private final ZzimFinder zzimFinder; private final ZzimRepository zzimRepository; - private final ChatRoomRepository chatRoomRepository; - private final ChatRoomFinder chatRoomFinder; - private final ChamyoFinder chamyoFinder; public Moim read(long moimId, long currentDarakbangId) { return moimRepository.findByIdAndDarakbangId(moimId, currentDarakbangId) @@ -38,9 +41,22 @@ public Moim read(long moimId, long currentDarakbangId) { } public List readAll(long darakbangId, DarakbangMember darakbangMember) { - return moimRepository.findAllByDarakbangIdOrderByIdDesc(darakbangId).stream() - .map(moim -> createMoimOverview(moim, darakbangMember)) - .toList(); + List moims = moimRepository.findAllByDarakbangIdOrderByIdDesc(darakbangId); + List moimIds = moims.stream() + .map(Moim::getId) + .toList(); + Map counts = chamyoRepository.countByMoimIds(moimIds) + .stream() + .collect(toMap(ChamyoCountResponse::getMoimId, ChamyoCountResponse::getCount)); + List zzims = zzimRepository.findZzimedMoimByMoimIdsAndDarakbangMemberId(moimIds, darakbangMember.getId()); + + return moims.stream() + .map(moim -> { + int currentPeople = counts.getOrDefault(moim.getId(), 0); + boolean isZzimed = zzims.contains(moim.getId()); + return new MoimOverview(moim, currentPeople, isZzimed); + }) + .toList(); } public List readAllMyMoim(DarakbangMember darakbangMember, FilterType filterType) { diff --git a/backend/src/main/java/mouda/backend/moim/infrastructure/ChamyoRepository.java b/backend/src/main/java/mouda/backend/moim/infrastructure/ChamyoRepository.java index fcf345e8..59bc6144 100644 --- a/backend/src/main/java/mouda/backend/moim/infrastructure/ChamyoRepository.java +++ b/backend/src/main/java/mouda/backend/moim/infrastructure/ChamyoRepository.java @@ -1,8 +1,10 @@ package mouda.backend.moim.infrastructure; +import java.util.Collection; import java.util.List; import java.util.Optional; +import mouda.backend.moim.infrastructure.dto.ChamyoCountResponse; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -36,4 +38,8 @@ public interface ChamyoRepository extends JpaRepository { @Query("SELECT c FROM Chamyo c WHERE c.moim.id = :moimId AND c.moimRole = 'MOIMER'") Optional findMoimerByMoimId(@Param("moimId") Long moimId); + + @Query("SELECT new mouda.backend.moim.infrastructure.dto.ChamyoCountResponse(c.moim.id, COUNT(c)) FROM Chamyo c WHERE c.moim.id IN :moimIds GROUP BY c.moim.id") + List countByMoimIds(@Param("moimIds") List moimIds); + } diff --git a/backend/src/main/java/mouda/backend/moim/infrastructure/ZzimRepository.java b/backend/src/main/java/mouda/backend/moim/infrastructure/ZzimRepository.java index 018e8f6f..790b5387 100644 --- a/backend/src/main/java/mouda/backend/moim/infrastructure/ZzimRepository.java +++ b/backend/src/main/java/mouda/backend/moim/infrastructure/ZzimRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import mouda.backend.moim.domain.Zzim; +import org.springframework.data.jpa.repository.Query; public interface ZzimRepository extends JpaRepository { @@ -14,4 +15,7 @@ public interface ZzimRepository extends JpaRepository { Optional findByMoimIdAndDarakbangMemberId(Long moimId, Long darakbangMemberId); List findAllByDarakbangMemberIdOrderByIdDesc(Long darakbangMemberId); + + @Query("SELECT z.moim.id FROM Zzim z WHERE z.darakbangMember.id = :darakbangMemberId AND z.moim.id IN :moimIds") + List findZzimedMoimByMoimIdsAndDarakbangMemberId(List moimIds, Long darakbangMemberId); } diff --git a/backend/src/main/java/mouda/backend/moim/infrastructure/dto/ChamyoCountResponse.java b/backend/src/main/java/mouda/backend/moim/infrastructure/dto/ChamyoCountResponse.java new file mode 100644 index 00000000..ce0e7afc --- /dev/null +++ b/backend/src/main/java/mouda/backend/moim/infrastructure/dto/ChamyoCountResponse.java @@ -0,0 +1,15 @@ +package mouda.backend.moim.infrastructure.dto; + +import lombok.Getter; + +@Getter +public class ChamyoCountResponse { + + private final Long moimId; + private final Integer count; + + public ChamyoCountResponse(Long moimId, Long count) { + this.moimId = moimId; + this.count = count.intValue(); + } +}