Skip to content

Commit

Permalink
#551 [feat] MoimPopularInfo 자료구조 Set으로 변경 및 n+1 문제 해결
Browse files Browse the repository at this point in the history
  • Loading branch information
sohyundoh committed Oct 29, 2024
1 parent 9f1a624 commit 20f81c4
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Set;

@Entity
@Getter
Expand All @@ -26,18 +27,18 @@ public class MoimPopularInfo {
private Long moimId;

@ElementCollection(fetch = FetchType.EAGER)
private List<MoimCuriousPost> posts;
private Set<MoimCuriousPost> posts;

@ElementCollection(fetch = FetchType.EAGER)
private List<MoimCuriousWriter> writers;
private Set<MoimCuriousWriter> writers;

private MoimPopularInfo(final Long moimId, final List<MoimCuriousPost> posts, final List<MoimCuriousWriter> writers) {
private MoimPopularInfo(final Long moimId, final Set<MoimCuriousPost> posts, final Set<MoimCuriousWriter> writers) {
this.moimId = moimId;
this.posts = posts;
this.writers = writers;
}

public static MoimPopularInfo of(final Long moimId, final List<MoimCuriousPost> posts, final List<MoimCuriousWriter> writers) {
public static MoimPopularInfo of(final Long moimId, final Set<MoimCuriousPost> posts, final Set<MoimCuriousWriter> writers) {
return new MoimPopularInfo(moimId, posts, writers);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import com.mile.moim.domain.popular.MoimPopularInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.Optional;

public interface MoimPopularInfoRepository extends JpaRepository<MoimPopularInfo, Long> {

@Query("select m from MoimPopularInfo m join fetch m.posts join fetch m.writers where m.moimId = :moimId")
Optional<MoimPopularInfo> findByMoimId(final long moimId);


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
Expand Down Expand Up @@ -141,7 +142,7 @@ public MoimMostCuriousWriterResponse getMostCuriousWritersOfMoim(
) {
Moim moim = moimRetriever.findById(moimId);
List<WriterName> writers = writerNameRetriever.findTop2ByCuriousCount(moim);
List<MoimCuriousWriter> curiousWriters = writers.stream().map(MoimCuriousWriter::of).toList();
Set<MoimCuriousWriter> curiousWriters = writers.stream().map(MoimCuriousWriter::of).collect(Collectors.toSet());
return MoimMostCuriousWriterResponse.of(curiousWriters);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
package com.mile.moim.service.dto.response;

import com.mile.moim.domain.popular.MoimCuriousWriter;
import com.mile.writername.domain.WriterName;

import com.mile.writername.service.dto.response.PopularWriterResponse;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public record MoimMostCuriousWriterResponse(List<PopularWriterResponse> popularWriters) {

public static MoimMostCuriousWriterResponse of(final List<MoimCuriousWriter> writers) {
public static MoimMostCuriousWriterResponse of(final Set<MoimCuriousWriter> writers) {
return new MoimMostCuriousWriterResponse(
writers
.stream()
.map(PopularWriterResponse::of)
.collect(Collectors.toList()));
.stream()
.map(PopularWriterResponse::of)
.collect(Collectors.toList()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@
import com.mile.writername.domain.WriterName;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CachePut;
import org.springframework.scheduling.concurrent.ScheduledExecutorTask;
import org.springframework.stereotype.Component;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@RequiredArgsConstructor
Expand All @@ -26,12 +28,12 @@ public class MoimPopularInfoRegister {
private final CuriousRetriever curiousRetriever;


private List<MoimCuriousPost> getMoimCuriousPost(final List<PostAndCuriousCountInLastWeek> mostCuriousPostsInLastWeek) {
private Set<MoimCuriousPost> getMoimCuriousPost(final List<PostAndCuriousCountInLastWeek> mostCuriousPostsInLastWeek) {
return mostCuriousPostsInLastWeek.stream().map(p ->
MoimCuriousPost.of(p.getPost())).limit(2).toList();
MoimCuriousPost.of(p.getPost())).limit(2).collect(Collectors.toUnmodifiableSet());
}

private List<MoimCuriousWriter> getMoimCuriousWriter(final List<PostAndCuriousCountInLastWeek> mostCuriousPostsInLastWeek) {
private Set<MoimCuriousWriter> getMoimCuriousWriter(final List<PostAndCuriousCountInLastWeek> mostCuriousPostsInLastWeek) {
Map<WriterName, Long> writerNameCount = mostCuriousPostsInLastWeek.stream()
.collect(Collectors.groupingBy(p -> p.getPost().getWriterName(), Collectors.summingLong(PostAndCuriousCountInLastWeek::getCount)));

Expand All @@ -40,17 +42,17 @@ private List<MoimCuriousWriter> getMoimCuriousWriter(final List<PostAndCuriousCo
.limit(2)
.map(Map.Entry::getKey).toList();

return topTwoWriters.stream().map(MoimCuriousWriter::of).toList();
return topTwoWriters.stream().map(MoimCuriousWriter::of).collect(Collectors.toUnmodifiableSet());
}

@CachePut(value = "moimPopularInfo", key = "#moim.id")
@AtomicValidateMoimPopulerInfo
public MoimPopularInfo setMostPopularInfoOfMoim(final Moim moim) {
List<PostAndCuriousCountInLastWeek> mostCuriousPostsInLastWeek = curiousRetriever.findMostCuriousPostsInLastWeek(moim);

List<MoimCuriousPost> moimCuriousPosts = getMoimCuriousPost(mostCuriousPostsInLastWeek);
Set<MoimCuriousPost> moimCuriousPosts = getMoimCuriousPost(mostCuriousPostsInLastWeek);

List<MoimCuriousWriter> moimCuriousWriters = getMoimCuriousWriter(mostCuriousPostsInLastWeek);
Set<MoimCuriousWriter> moimCuriousWriters = getMoimCuriousWriter(mostCuriousPostsInLastWeek);

MoimPopularInfo moimPopularInfo = MoimPopularInfo.of(moim.getId(), moimCuriousPosts, moimCuriousWriters);

Expand Down

0 comments on commit 20f81c4

Please sign in to comment.