From 51bd22980381380a9d89034652125b9cf5606bc5 Mon Sep 17 00:00:00 2001 From: jjongwa Date: Thu, 16 Nov 2023 13:11:13 +0900 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20=EA=B3=B5=EA=B0=9C=EB=90=9C=20?= =?UTF-8?q?=EC=97=AC=ED=96=89=20=EB=8B=A8=EA=B1=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hanglog/community/service/CommunityService.java | 12 +++++------- .../java/hanglog/like/repository/LikeRepository.java | 11 +++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/hanglog/community/service/CommunityService.java b/backend/src/main/java/hanglog/community/service/CommunityService.java index cd7454a97..2f3fc0661 100644 --- a/backend/src/main/java/hanglog/community/service/CommunityService.java +++ b/backend/src/main/java/hanglog/community/service/CommunityService.java @@ -15,6 +15,7 @@ import hanglog.community.dto.response.RecommendTripListResponse; import hanglog.global.exception.BadRequestException; import hanglog.like.domain.LikeInfo; +import hanglog.like.dto.LikeElement; import hanglog.like.dto.LikeElements; import hanglog.like.repository.LikeRepository; import hanglog.trip.domain.Trip; @@ -119,19 +120,16 @@ public TripDetailResponse getTripDetail(final Accessor accessor, final Long trip final LocalDateTime publishedDate = publishedTripRepository.findByTripId(tripId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TRIP_ID)) .getCreatedAt(); - final LikeElements likeElements = new LikeElements(likeRepository.findLikeCountAndIsLikeByTripIds( - accessor.getMemberId(), - List.of(tripId) - )); - final Map likeInfoByTrip = likeElements.toLikeMap(); + final LikeElement likeElement = likeRepository.findLikeCountAndIsLikeByTripId(accessor.getMemberId(), tripId) + .orElseGet(() -> new LikeElement(tripId, 0, false)); final Boolean isWriter = trip.isWriter(accessor.getMemberId()); return TripDetailResponse.publishedTrip( trip, cities, isWriter, - isLike(likeInfoByTrip, tripId), - getLikeCount(likeInfoByTrip, tripId), + likeElement.isLike(), + likeElement.getLikeCount(), publishedDate ); } diff --git a/backend/src/main/java/hanglog/like/repository/LikeRepository.java b/backend/src/main/java/hanglog/like/repository/LikeRepository.java index f2762a0e7..781591a4e 100644 --- a/backend/src/main/java/hanglog/like/repository/LikeRepository.java +++ b/backend/src/main/java/hanglog/like/repository/LikeRepository.java @@ -3,6 +3,7 @@ import hanglog.like.domain.Likes; import hanglog.like.dto.LikeElement; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -22,4 +23,14 @@ public interface LikeRepository extends JpaRepository { """) List findLikeCountAndIsLikeByTripIds(@Param("memberId") final Long memberId, @Param("tripIds") final List tripIds); + + @Query(""" + SELECT new hanglog.like.dto.LikeElement + (l.tripId, COUNT(l.memberId), EXISTS(SELECT 1 FROM Likes l_1 WHERE l_1.memberId = :memberId AND l_1.tripId = l.tripId)) + FROM Likes l + WHERE l.tripId = :tripId + GROUP BY l.tripId + """) + Optional findLikeCountAndIsLikeByTripId(@Param("memberId") final Long memberId, + @Param("tripId") final Long tripId); } From 4fc0442a4ef9179b5c10a656dfac541865913aee Mon Sep 17 00:00:00 2001 From: jjongwa Date: Thu, 16 Nov 2023 13:57:06 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor:=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?redis=20=EC=82=AC=EC=9A=A9=ED=95=9C=EB=A1=9C=EC=A7=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hanglog/like/domain/MemberLike.java | 18 ++++++++++ .../like/repository/MemberLikeRepository.java | 7 ++++ .../hanglog/like/service/LikeService.java | 28 ++++++++++----- .../service/LikeServiceIntegrationTest.java | 21 +++-------- .../service/RedisServiceIntegrationTest.java | 35 +++++++++++++++++++ 5 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 backend/src/main/java/hanglog/like/domain/MemberLike.java create mode 100644 backend/src/main/java/hanglog/like/repository/MemberLikeRepository.java create mode 100644 backend/src/test/java/hanglog/integration/service/RedisServiceIntegrationTest.java diff --git a/backend/src/main/java/hanglog/like/domain/MemberLike.java b/backend/src/main/java/hanglog/like/domain/MemberLike.java new file mode 100644 index 000000000..a53b90ee5 --- /dev/null +++ b/backend/src/main/java/hanglog/like/domain/MemberLike.java @@ -0,0 +1,18 @@ +package hanglog.like.domain; + +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.data.annotation.Id; +import org.springframework.data.redis.core.RedisHash; + +@Getter +@AllArgsConstructor +@RedisHash(value = "memberLike") +public class MemberLike { + + @Id + private Long memberId; + + private Map tripLikeStatusMap; +} diff --git a/backend/src/main/java/hanglog/like/repository/MemberLikeRepository.java b/backend/src/main/java/hanglog/like/repository/MemberLikeRepository.java new file mode 100644 index 000000000..77c82d4cc --- /dev/null +++ b/backend/src/main/java/hanglog/like/repository/MemberLikeRepository.java @@ -0,0 +1,7 @@ +package hanglog.like.repository; + +import hanglog.like.domain.MemberLike; +import org.springframework.data.repository.CrudRepository; + +public interface MemberLikeRepository extends CrudRepository { +} diff --git a/backend/src/main/java/hanglog/like/service/LikeService.java b/backend/src/main/java/hanglog/like/service/LikeService.java index bfd76c50a..8e7bbfae1 100644 --- a/backend/src/main/java/hanglog/like/service/LikeService.java +++ b/backend/src/main/java/hanglog/like/service/LikeService.java @@ -1,8 +1,11 @@ package hanglog.like.service; -import hanglog.like.domain.Likes; +import hanglog.like.domain.MemberLike; import hanglog.like.dto.request.LikeRequest; -import hanglog.like.repository.LikeRepository; +import hanglog.like.repository.MemberLikeRepository; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,16 +15,23 @@ @Transactional public class LikeService { - private final LikeRepository likeRepository; + private final MemberLikeRepository memberLikeRepository; public void update(final Long memberId, final Long tripId, final LikeRequest likeRequest) { - final boolean requestStatus = likeRequest.getIsLike(); - - if (requestStatus && !likeRepository.existsByMemberIdAndTripId(memberId, tripId)) { - likeRepository.save(new Likes(tripId, memberId)); + Map tripLikeStatusMap = new HashMap<>(); + final Optional memberLike = memberLikeRepository.findById(memberId); + if (memberLike.isPresent()) { + tripLikeStatusMap = memberLike.get().getTripLikeStatusMap(); } - if (!requestStatus) { - likeRepository.deleteByMemberIdAndTripId(memberId, tripId); + tripLikeStatusMap.put(tripId, likeRequest.getIsLike()); + memberLikeRepository.save(new MemberLike(memberId, tripLikeStatusMap)); + } + + public boolean check(final Long memberId, final Long tripId) { + Optional memberLike = memberLikeRepository.findById(memberId); + if (memberLike.isPresent()) { + return memberLike.get().getTripLikeStatusMap().get(tripId); } + return false; } } diff --git a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java index 1d5b71f59..42516e050 100644 --- a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java +++ b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java @@ -4,23 +4,13 @@ import static org.assertj.core.api.SoftAssertions.assertSoftly; import hanglog.like.dto.request.LikeRequest; -import hanglog.like.repository.LikeRepository; import hanglog.like.service.LikeService; -import hanglog.trip.infrastructure.CustomDayLogRepositoryImpl; -import hanglog.trip.infrastructure.CustomTripCityRepositoryImpl; import hanglog.trip.service.TripService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -@Import({ - TripService.class, - LikeService.class, - CustomDayLogRepositoryImpl.class, - CustomTripCityRepositoryImpl.class -}) -class LikeServiceIntegrationTest extends ServiceIntegrationTest { +class LikeServiceIntegrationTest extends RedisServiceIntegrationTest { @Autowired private TripService tripService; @@ -28,9 +18,6 @@ class LikeServiceIntegrationTest extends ServiceIntegrationTest { @Autowired private LikeService likeService; - @Autowired - private LikeRepository likeRepository; - @DisplayName("해당 게시물의 좋아요 여부를 변경할 수 있다.") @Test void update() { @@ -42,11 +29,11 @@ void update() { // when & then assertSoftly(softly -> { - softly.assertThat(likeRepository.existsByMemberIdAndTripId(member.getId(), tripId)).isFalse(); + softly.assertThat(likeService.check(member.getId(), tripId)).isFalse(); likeService.update(member.getId(), tripId, likeTrueRequest); - softly.assertThat(likeRepository.existsByMemberIdAndTripId(member.getId(), tripId)).isTrue(); + softly.assertThat(likeService.check(member.getId(), tripId)).isTrue(); likeService.update(member.getId(), tripId, likeFalseRequest); - softly.assertThat(likeRepository.existsByMemberIdAndTripId(member.getId(), tripId)).isFalse(); + softly.assertThat(likeService.check(member.getId(), tripId)).isFalse(); }); } } diff --git a/backend/src/test/java/hanglog/integration/service/RedisServiceIntegrationTest.java b/backend/src/test/java/hanglog/integration/service/RedisServiceIntegrationTest.java new file mode 100644 index 000000000..2c70b69f7 --- /dev/null +++ b/backend/src/test/java/hanglog/integration/service/RedisServiceIntegrationTest.java @@ -0,0 +1,35 @@ +package hanglog.integration.service; + +import hanglog.global.config.RedisTestConfig; +import hanglog.member.domain.Member; +import hanglog.member.domain.repository.MemberRepository; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.jdbc.Sql; + +@SpringBootTest +@Sql(value = { + "classpath:data/truncate.sql", + "classpath:data/currency.sql", + "classpath:data/cities.sql", + "classpath:data/categories.sql" +}) +@Import(RedisTestConfig.class) +public class RedisServiceIntegrationTest { + + @Autowired + protected MemberRepository memberRepository; + + public Member member; + + @BeforeEach + void setMember() { + this.member = memberRepository.save(new Member( + "socialLoginId", + "name", + "https://hanglog.com/img/imageName.png" + )); + } +} From c931afaddc2d7b5f12a73f191de04b418cc328fd Mon Sep 17 00:00:00 2001 From: jjongwa Date: Thu, 16 Nov 2023 14:53:33 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=94=20=EC=97=AC=EB=B6=80=20cache=20writ?= =?UTF-8?q?e=20back=20=EC=8A=A4=EC=BC=80=EC=A4=84=EB=A7=81=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hanglog/like/domain/MemberLike.java | 2 +- .../like/dto/MemberLikeCacheEvent.java | 4 ++ .../CustomLikeRepositoryImpl.java | 37 +++++++++++++++++++ .../like/repository/CustomLikeRepository.java | 9 +++++ .../like/repository/LikeRepository.java | 4 -- .../hanglog/like/service/LikeService.java | 9 +++++ .../MemberLikeCacheEventListener.java | 35 ++++++++++++++++++ 7 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java create mode 100644 backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java create mode 100644 backend/src/main/java/hanglog/like/repository/CustomLikeRepository.java create mode 100644 backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java diff --git a/backend/src/main/java/hanglog/like/domain/MemberLike.java b/backend/src/main/java/hanglog/like/domain/MemberLike.java index a53b90ee5..aefadb2a2 100644 --- a/backend/src/main/java/hanglog/like/domain/MemberLike.java +++ b/backend/src/main/java/hanglog/like/domain/MemberLike.java @@ -8,7 +8,7 @@ @Getter @AllArgsConstructor -@RedisHash(value = "memberLike") +@RedisHash(value = "memberLike", timeToLive = 5400) public class MemberLike { @Id diff --git a/backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java b/backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java new file mode 100644 index 000000000..0f3cad476 --- /dev/null +++ b/backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java @@ -0,0 +1,4 @@ +package hanglog.like.dto; + +public class MemberLikeCacheEvent { +} diff --git a/backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java b/backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java new file mode 100644 index 000000000..14778a6bc --- /dev/null +++ b/backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java @@ -0,0 +1,37 @@ +package hanglog.like.infrastrcutrue; + +import hanglog.like.domain.Likes; +import hanglog.like.repository.CustomLikeRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +@RequiredArgsConstructor +@Repository +public class CustomLikeRepositoryImpl implements CustomLikeRepository { + + private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + @Override + public void saveAll(final List likes) { + final String sql = """ + INSERT INTO likes (trip_id, member_id) + VALUES (:tripId, :memberId) + """; + namedParameterJdbcTemplate.batchUpdate(sql, getLikesToSqlParameterSources(likes)); + } + + private MapSqlParameterSource[] getLikesToSqlParameterSources(final List likes) { + return likes.stream() + .map(this::getLikeToSqlParameterSource) + .toArray(MapSqlParameterSource[]::new); + } + + private MapSqlParameterSource getLikeToSqlParameterSource(final Likes likes) { + return new MapSqlParameterSource() + .addValue("tripId", likes.getTripId()) + .addValue("memberId", likes.getMemberId()); + } +} diff --git a/backend/src/main/java/hanglog/like/repository/CustomLikeRepository.java b/backend/src/main/java/hanglog/like/repository/CustomLikeRepository.java new file mode 100644 index 000000000..c3fc8ee2b --- /dev/null +++ b/backend/src/main/java/hanglog/like/repository/CustomLikeRepository.java @@ -0,0 +1,9 @@ +package hanglog.like.repository; + +import hanglog.like.domain.Likes; +import java.util.List; + +public interface CustomLikeRepository { + + void saveAll(final List likes); +} diff --git a/backend/src/main/java/hanglog/like/repository/LikeRepository.java b/backend/src/main/java/hanglog/like/repository/LikeRepository.java index 781591a4e..5f26f72fd 100644 --- a/backend/src/main/java/hanglog/like/repository/LikeRepository.java +++ b/backend/src/main/java/hanglog/like/repository/LikeRepository.java @@ -10,10 +10,6 @@ public interface LikeRepository extends JpaRepository { - boolean existsByMemberIdAndTripId(final Long memberId, final Long tripId); - - void deleteByMemberIdAndTripId(final Long memberId, final Long tripId); - @Query(""" SELECT new hanglog.like.dto.LikeElement (l.tripId, COUNT(l.memberId), EXISTS(SELECT 1 FROM Likes l_1 WHERE l_1.memberId = :memberId AND l_1.tripId = l.tripId)) diff --git a/backend/src/main/java/hanglog/like/service/LikeService.java b/backend/src/main/java/hanglog/like/service/LikeService.java index 8e7bbfae1..d9fb80dcc 100644 --- a/backend/src/main/java/hanglog/like/service/LikeService.java +++ b/backend/src/main/java/hanglog/like/service/LikeService.java @@ -1,12 +1,15 @@ package hanglog.like.service; import hanglog.like.domain.MemberLike; +import hanglog.like.dto.MemberLikeCacheEvent; import hanglog.like.dto.request.LikeRequest; import hanglog.like.repository.MemberLikeRepository; import java.util.HashMap; import java.util.Map; import java.util.Optional; import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,6 +19,7 @@ public class LikeService { private final MemberLikeRepository memberLikeRepository; + private final ApplicationEventPublisher publisher; public void update(final Long memberId, final Long tripId, final LikeRequest likeRequest) { Map tripLikeStatusMap = new HashMap<>(); @@ -34,4 +38,9 @@ public boolean check(final Long memberId, final Long tripId) { } return false; } + + @Scheduled(fixedRate = 3600000) + public void writeBackMemberLikeCache() { + publisher.publishEvent(new MemberLikeCacheEvent()); + } } diff --git a/backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java b/backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java new file mode 100644 index 000000000..28cd83ac8 --- /dev/null +++ b/backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java @@ -0,0 +1,35 @@ +package hanglog.listener; + +import hanglog.like.domain.Likes; +import hanglog.like.dto.MemberLikeCacheEvent; +import hanglog.like.repository.CustomLikeRepository; +import hanglog.like.repository.MemberLikeRepository; +import hanglog.member.domain.repository.MemberRepository; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class MemberLikeCacheEventListener { + + private final MemberRepository memberRepository; + private final CustomLikeRepository customLikeRepository; + private final MemberLikeRepository memberLikeRepository; + + @EventListener + public void writeBack(final MemberLikeCacheEvent event) { + final List likes = memberRepository.findAll().stream() + .flatMap(member -> memberLikeRepository.findById(member.getId()) + .map(memberLike -> memberLike.getTripLikeStatusMap() + .entrySet().stream() + .filter(Map.Entry::getValue) + .map(entry -> new Likes(entry.getKey(), member.getId()))) + .orElseGet(Stream::empty)) + .toList(); + customLikeRepository.saveAll(likes); + } +} From 392c5f807ad5b67581e7ef7bdea6cf22d2144b04 Mon Sep 17 00:00:00 2001 From: jjongwa Date: Thu, 16 Nov 2023 16:28:35 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=94=20=EC=88=98=20=EC=BA=90=EC=8B=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=8A=A4=EC=BC=80=EC=A4=84=EB=A7=81=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/service/CommunityService.java | 25 +++++++++++-- .../java/hanglog/like/domain/LikeCount.java | 17 +++++++++ .../like/dto/MemberLikeCacheEvent.java | 4 --- .../java/hanglog/like/dto/TripLikeCount.java | 12 +++++++ .../like/repository/LikeCountRepository.java | 10 ++++++ .../like/repository/LikeRepository.java | 8 +++++ .../hanglog/like/service/LikeService.java | 36 ++++++++++++++++--- .../MemberLikeCacheEventListener.java | 35 ------------------ .../CommunityServiceIntegrationTest.java | 11 +----- 9 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 backend/src/main/java/hanglog/like/domain/LikeCount.java delete mode 100644 backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java create mode 100644 backend/src/main/java/hanglog/like/dto/TripLikeCount.java create mode 100644 backend/src/main/java/hanglog/like/repository/LikeCountRepository.java delete mode 100644 backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java diff --git a/backend/src/main/java/hanglog/community/service/CommunityService.java b/backend/src/main/java/hanglog/community/service/CommunityService.java index 2f3fc0661..5544e73a3 100644 --- a/backend/src/main/java/hanglog/community/service/CommunityService.java +++ b/backend/src/main/java/hanglog/community/service/CommunityService.java @@ -14,10 +14,14 @@ import hanglog.community.dto.response.CommunityTripResponse; import hanglog.community.dto.response.RecommendTripListResponse; import hanglog.global.exception.BadRequestException; +import hanglog.like.domain.LikeCount; import hanglog.like.domain.LikeInfo; +import hanglog.like.domain.MemberLike; import hanglog.like.dto.LikeElement; import hanglog.like.dto.LikeElements; +import hanglog.like.repository.LikeCountRepository; import hanglog.like.repository.LikeRepository; +import hanglog.like.repository.MemberLikeRepository; import hanglog.trip.domain.Trip; import hanglog.trip.domain.repository.TripCityRepository; import hanglog.trip.domain.repository.TripRepository; @@ -26,6 +30,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Map; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; @@ -46,6 +51,8 @@ public class CommunityService { private final CityRepository cityRepository; private final RecommendStrategies recommendStrategies; private final PublishedTripRepository publishedTripRepository; + private final LikeCountRepository likeCountRepository; + private final MemberLikeRepository memberLikeRepository; @Transactional(readOnly = true) public CommunityTripListResponse getCommunityTripsByPage(final Accessor accessor, final Pageable pageable) { @@ -120,8 +127,8 @@ public TripDetailResponse getTripDetail(final Accessor accessor, final Long trip final LocalDateTime publishedDate = publishedTripRepository.findByTripId(tripId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TRIP_ID)) .getCreatedAt(); - final LikeElement likeElement = likeRepository.findLikeCountAndIsLikeByTripId(accessor.getMemberId(), tripId) - .orElseGet(() -> new LikeElement(tripId, 0, false)); + + final LikeElement likeElement = getLikeElement(accessor.getMemberId(), tripId); final Boolean isWriter = trip.isWriter(accessor.getMemberId()); return TripDetailResponse.publishedTrip( @@ -133,4 +140,18 @@ public TripDetailResponse getTripDetail(final Accessor accessor, final Long trip publishedDate ); } + + private LikeElement getLikeElement(final Long memberId, final Long tripId) { + final Optional likeCount = likeCountRepository.findById(tripId); + final Optional memberLike = memberLikeRepository.findById(memberId); + if (likeCount.isPresent() && memberLike.isPresent()) { + final Map tripLikeStatusMap = memberLike.get().getTripLikeStatusMap(); + if (tripLikeStatusMap.containsKey(tripId)) { + return new LikeElement(tripId, likeCount.get().getCount(), tripLikeStatusMap.get(tripId)); + } + return new LikeElement(tripId, likeCount.get().getCount(), false); + } + return likeRepository.findLikeCountAndIsLikeByTripId(memberId, tripId) + .orElseGet(() -> new LikeElement(tripId, 0, false)); + } } diff --git a/backend/src/main/java/hanglog/like/domain/LikeCount.java b/backend/src/main/java/hanglog/like/domain/LikeCount.java new file mode 100644 index 000000000..62730449f --- /dev/null +++ b/backend/src/main/java/hanglog/like/domain/LikeCount.java @@ -0,0 +1,17 @@ +package hanglog.like.domain; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.data.annotation.Id; +import org.springframework.data.redis.core.RedisHash; + +@Getter +@AllArgsConstructor +@RedisHash(value = "likeCount") +public class LikeCount { + + @Id + private Long tripId; + + private Long count; +} diff --git a/backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java b/backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java deleted file mode 100644 index 0f3cad476..000000000 --- a/backend/src/main/java/hanglog/like/dto/MemberLikeCacheEvent.java +++ /dev/null @@ -1,4 +0,0 @@ -package hanglog.like.dto; - -public class MemberLikeCacheEvent { -} diff --git a/backend/src/main/java/hanglog/like/dto/TripLikeCount.java b/backend/src/main/java/hanglog/like/dto/TripLikeCount.java new file mode 100644 index 000000000..5f43296c9 --- /dev/null +++ b/backend/src/main/java/hanglog/like/dto/TripLikeCount.java @@ -0,0 +1,12 @@ +package hanglog.like.dto; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class TripLikeCount { + + private final long tripId; + private final long count; +} diff --git a/backend/src/main/java/hanglog/like/repository/LikeCountRepository.java b/backend/src/main/java/hanglog/like/repository/LikeCountRepository.java new file mode 100644 index 000000000..8ecfb1f1b --- /dev/null +++ b/backend/src/main/java/hanglog/like/repository/LikeCountRepository.java @@ -0,0 +1,10 @@ +package hanglog.like.repository; + +import hanglog.like.domain.LikeCount; +import java.util.List; +import org.springframework.data.repository.CrudRepository; + +public interface LikeCountRepository extends CrudRepository { + + List findLikeCountsByTripIdIn(final List tripIds); +} diff --git a/backend/src/main/java/hanglog/like/repository/LikeRepository.java b/backend/src/main/java/hanglog/like/repository/LikeRepository.java index 5f26f72fd..011f312f5 100644 --- a/backend/src/main/java/hanglog/like/repository/LikeRepository.java +++ b/backend/src/main/java/hanglog/like/repository/LikeRepository.java @@ -2,6 +2,7 @@ import hanglog.like.domain.Likes; import hanglog.like.dto.LikeElement; +import hanglog.like.dto.TripLikeCount; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; @@ -29,4 +30,11 @@ List findLikeCountAndIsLikeByTripIds(@Param("memberId") final Long """) Optional findLikeCountAndIsLikeByTripId(@Param("memberId") final Long memberId, @Param("tripId") final Long tripId); + + @Query(""" + SELECT new hanglog.like.dto.TripLikeCount(l.tripId, COUNT(l.memberId)) + FROM Likes l + GROUP BY l.tripId + """) + List findCountByAllTrips(); } diff --git a/backend/src/main/java/hanglog/like/service/LikeService.java b/backend/src/main/java/hanglog/like/service/LikeService.java index d9fb80dcc..e45cce439 100644 --- a/backend/src/main/java/hanglog/like/service/LikeService.java +++ b/backend/src/main/java/hanglog/like/service/LikeService.java @@ -1,14 +1,21 @@ package hanglog.like.service; +import hanglog.like.domain.LikeCount; +import hanglog.like.domain.Likes; import hanglog.like.domain.MemberLike; -import hanglog.like.dto.MemberLikeCacheEvent; +import hanglog.like.dto.TripLikeCount; import hanglog.like.dto.request.LikeRequest; +import hanglog.like.repository.CustomLikeRepository; +import hanglog.like.repository.LikeCountRepository; +import hanglog.like.repository.LikeRepository; import hanglog.like.repository.MemberLikeRepository; +import hanglog.member.domain.repository.MemberRepository; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Stream; import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,8 +25,11 @@ @Transactional public class LikeService { + private final LikeRepository likeRepository; private final MemberLikeRepository memberLikeRepository; - private final ApplicationEventPublisher publisher; + private final LikeCountRepository likeCountRepository; + private final MemberRepository memberRepository; + private final CustomLikeRepository customLikeRepository; public void update(final Long memberId, final Long tripId, final LikeRequest likeRequest) { Map tripLikeStatusMap = new HashMap<>(); @@ -39,8 +49,24 @@ public boolean check(final Long memberId, final Long tripId) { return false; } - @Scheduled(fixedRate = 3600000) + @Scheduled(cron = "0 0 * * * *") public void writeBackMemberLikeCache() { - publisher.publishEvent(new MemberLikeCacheEvent()); + final List likes = memberRepository.findAll().stream() + .flatMap(member -> memberLikeRepository.findById(member.getId()) + .map(memberLike -> memberLike.getTripLikeStatusMap() + .entrySet().stream() + .filter(Map.Entry::getValue) + .map(entry -> new Likes(entry.getKey(), member.getId()))) + .orElseGet(Stream::empty)) + .toList(); + customLikeRepository.saveAll(likes); + } + + @Scheduled(cron = "0 0 0 * * *") + public void cacheLikeCount() { + final List tripLikeCounts = likeRepository.findCountByAllTrips(); + for (final TripLikeCount tripLikeCount : tripLikeCounts) { + likeCountRepository.save(new LikeCount(tripLikeCount.getTripId(), tripLikeCount.getCount())); + } } } diff --git a/backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java b/backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java deleted file mode 100644 index 28cd83ac8..000000000 --- a/backend/src/main/java/hanglog/listener/MemberLikeCacheEventListener.java +++ /dev/null @@ -1,35 +0,0 @@ -package hanglog.listener; - -import hanglog.like.domain.Likes; -import hanglog.like.dto.MemberLikeCacheEvent; -import hanglog.like.repository.CustomLikeRepository; -import hanglog.like.repository.MemberLikeRepository; -import hanglog.member.domain.repository.MemberRepository; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class MemberLikeCacheEventListener { - - private final MemberRepository memberRepository; - private final CustomLikeRepository customLikeRepository; - private final MemberLikeRepository memberLikeRepository; - - @EventListener - public void writeBack(final MemberLikeCacheEvent event) { - final List likes = memberRepository.findAll().stream() - .flatMap(member -> memberLikeRepository.findById(member.getId()) - .map(memberLike -> memberLike.getTripLikeStatusMap() - .entrySet().stream() - .filter(Map.Entry::getValue) - .map(entry -> new Likes(entry.getKey(), member.getId()))) - .orElseGet(Stream::empty)) - .toList(); - customLikeRepository.saveAll(likes); - } -} diff --git a/backend/src/test/java/hanglog/integration/service/CommunityServiceIntegrationTest.java b/backend/src/test/java/hanglog/integration/service/CommunityServiceIntegrationTest.java index 70fbc81d6..f3f706bb3 100644 --- a/backend/src/test/java/hanglog/integration/service/CommunityServiceIntegrationTest.java +++ b/backend/src/test/java/hanglog/integration/service/CommunityServiceIntegrationTest.java @@ -26,16 +26,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -@Import({ - TripService.class, - CommunityService.class, - LedgerService.class, - RecommendStrategies.class, - CustomDayLogRepositoryImpl.class, - CustomTripCityRepositoryImpl.class, - EventListenerTestConfig.class -}) -class CommunityServiceIntegrationTest extends ServiceIntegrationTest { +class CommunityServiceIntegrationTest extends RedisServiceIntegrationTest { @Autowired private TripService tripService; From b8499f7320fb4a75586237bb1b97478eb700338f Mon Sep 17 00:00:00 2001 From: jjongwa Date: Thu, 16 Nov 2023 16:55:36 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=94=20=EB=B3=80=EA=B2=BD=20=EC=8B=9C=20?= =?UTF-8?q?=EC=BA=90=EC=8B=B1=EB=90=9C=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=88=98=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hanglog/like/service/LikeService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/backend/src/main/java/hanglog/like/service/LikeService.java b/backend/src/main/java/hanglog/like/service/LikeService.java index e45cce439..2e7e82e23 100644 --- a/backend/src/main/java/hanglog/like/service/LikeService.java +++ b/backend/src/main/java/hanglog/like/service/LikeService.java @@ -39,6 +39,16 @@ public void update(final Long memberId, final Long tripId, final LikeRequest lik } tripLikeStatusMap.put(tripId, likeRequest.getIsLike()); memberLikeRepository.save(new MemberLike(memberId, tripLikeStatusMap)); + updateLikeCountCache(tripId, likeRequest); + } + + private void updateLikeCountCache(final Long tripId, final LikeRequest likeRequest) { + final Optional likeCount = likeCountRepository.findById(tripId); + if (Boolean.TRUE.equals(likeRequest.getIsLike())) { + likeCount.ifPresent(count -> likeCountRepository.save(new LikeCount(tripId, count.getCount() + 1))); + return; + } + likeCount.ifPresent(count -> likeCountRepository.save(new LikeCount(tripId, count.getCount() - 1))); } public boolean check(final Long memberId, final Long tripId) { From 9db56c3af491b9cb2455a8ccf014ac41cda4ca0d Mon Sep 17 00:00:00 2001 From: jjongwa Date: Thu, 16 Nov 2023 17:00:05 +0900 Subject: [PATCH 6/8] =?UTF-8?q?test:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=9A=94=20=EB=B3=80=EA=B2=BD=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hanglog/like/service/LikeService.java | 8 -------- .../service/LikeServiceIntegrationTest.java | 20 ++++++++++++++++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/hanglog/like/service/LikeService.java b/backend/src/main/java/hanglog/like/service/LikeService.java index 2e7e82e23..726b5c1be 100644 --- a/backend/src/main/java/hanglog/like/service/LikeService.java +++ b/backend/src/main/java/hanglog/like/service/LikeService.java @@ -51,14 +51,6 @@ private void updateLikeCountCache(final Long tripId, final LikeRequest likeReque likeCount.ifPresent(count -> likeCountRepository.save(new LikeCount(tripId, count.getCount() - 1))); } - public boolean check(final Long memberId, final Long tripId) { - Optional memberLike = memberLikeRepository.findById(memberId); - if (memberLike.isPresent()) { - return memberLike.get().getTripLikeStatusMap().get(tripId); - } - return false; - } - @Scheduled(cron = "0 0 * * * *") public void writeBackMemberLikeCache() { final List likes = memberRepository.findAll().stream() diff --git a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java index 42516e050..a53b431a5 100644 --- a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java +++ b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.SoftAssertions.assertSoftly; import hanglog.like.dto.request.LikeRequest; +import hanglog.like.repository.MemberLikeRepository; import hanglog.like.service.LikeService; import hanglog.trip.service.TripService; import org.junit.jupiter.api.DisplayName; @@ -18,6 +19,9 @@ class LikeServiceIntegrationTest extends RedisServiceIntegrationTest { @Autowired private LikeService likeService; + @Autowired + private MemberLikeRepository memberLikeRepository; + @DisplayName("해당 게시물의 좋아요 여부를 변경할 수 있다.") @Test void update() { @@ -29,11 +33,21 @@ void update() { // when & then assertSoftly(softly -> { - softly.assertThat(likeService.check(member.getId(), tripId)).isFalse(); + softly.assertThat(memberLikeRepository.findById(member.getId())).isEmpty(); + likeService.update(member.getId(), tripId, likeTrueRequest); - softly.assertThat(likeService.check(member.getId(), tripId)).isTrue(); + softly.assertThat(memberLikeRepository.findById(member.getId())).isPresent(); + softly.assertThat(memberLikeRepository.findById(member.getId()) + .get() + .getTripLikeStatusMap() + .get(tripId)).isTrue(); + likeService.update(member.getId(), tripId, likeFalseRequest); - softly.assertThat(likeService.check(member.getId(), tripId)).isFalse(); + softly.assertThat(memberLikeRepository.findById(member.getId())).isPresent(); + softly.assertThat(memberLikeRepository.findById(member.getId()) + .get() + .getTripLikeStatusMap() + .get(tripId)).isFalse(); }); } } From ca1aed56c61bc4ddd89563f4cb73b9abe3cf7b6e Mon Sep 17 00:00:00 2001 From: jjongwa Date: Mon, 20 Nov 2023 22:48:44 +0900 Subject: [PATCH 7/8] =?UTF-8?q?chore:=20Like=20Repository=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hanglog/community/service/CommunityService.java | 6 +++--- .../{ => domain}/repository/CustomLikeRepository.java | 2 +- .../like/{ => domain}/repository/LikeCountRepository.java | 2 +- .../like/{ => domain}/repository/LikeRepository.java | 2 +- .../{ => domain}/repository/MemberLikeRepository.java | 2 +- .../like/infrastrcutrue/CustomLikeRepositoryImpl.java | 2 +- .../src/main/java/hanglog/like/service/LikeService.java | 8 ++++---- .../integration/service/LikeServiceIntegrationTest.java | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) rename backend/src/main/java/hanglog/like/{ => domain}/repository/CustomLikeRepository.java (78%) rename backend/src/main/java/hanglog/like/{ => domain}/repository/LikeCountRepository.java (87%) rename backend/src/main/java/hanglog/like/{ => domain}/repository/LikeRepository.java (97%) rename backend/src/main/java/hanglog/like/{ => domain}/repository/MemberLikeRepository.java (82%) diff --git a/backend/src/main/java/hanglog/community/service/CommunityService.java b/backend/src/main/java/hanglog/community/service/CommunityService.java index 5544e73a3..2b1cb4c7e 100644 --- a/backend/src/main/java/hanglog/community/service/CommunityService.java +++ b/backend/src/main/java/hanglog/community/service/CommunityService.java @@ -19,9 +19,9 @@ import hanglog.like.domain.MemberLike; import hanglog.like.dto.LikeElement; import hanglog.like.dto.LikeElements; -import hanglog.like.repository.LikeCountRepository; -import hanglog.like.repository.LikeRepository; -import hanglog.like.repository.MemberLikeRepository; +import hanglog.like.domain.repository.LikeCountRepository; +import hanglog.like.domain.repository.LikeRepository; +import hanglog.like.domain.repository.MemberLikeRepository; import hanglog.trip.domain.Trip; import hanglog.trip.domain.repository.TripCityRepository; import hanglog.trip.domain.repository.TripRepository; diff --git a/backend/src/main/java/hanglog/like/repository/CustomLikeRepository.java b/backend/src/main/java/hanglog/like/domain/repository/CustomLikeRepository.java similarity index 78% rename from backend/src/main/java/hanglog/like/repository/CustomLikeRepository.java rename to backend/src/main/java/hanglog/like/domain/repository/CustomLikeRepository.java index c3fc8ee2b..32e06b818 100644 --- a/backend/src/main/java/hanglog/like/repository/CustomLikeRepository.java +++ b/backend/src/main/java/hanglog/like/domain/repository/CustomLikeRepository.java @@ -1,4 +1,4 @@ -package hanglog.like.repository; +package hanglog.like.domain.repository; import hanglog.like.domain.Likes; import java.util.List; diff --git a/backend/src/main/java/hanglog/like/repository/LikeCountRepository.java b/backend/src/main/java/hanglog/like/domain/repository/LikeCountRepository.java similarity index 87% rename from backend/src/main/java/hanglog/like/repository/LikeCountRepository.java rename to backend/src/main/java/hanglog/like/domain/repository/LikeCountRepository.java index 8ecfb1f1b..de64fea80 100644 --- a/backend/src/main/java/hanglog/like/repository/LikeCountRepository.java +++ b/backend/src/main/java/hanglog/like/domain/repository/LikeCountRepository.java @@ -1,4 +1,4 @@ -package hanglog.like.repository; +package hanglog.like.domain.repository; import hanglog.like.domain.LikeCount; import java.util.List; diff --git a/backend/src/main/java/hanglog/like/repository/LikeRepository.java b/backend/src/main/java/hanglog/like/domain/repository/LikeRepository.java similarity index 97% rename from backend/src/main/java/hanglog/like/repository/LikeRepository.java rename to backend/src/main/java/hanglog/like/domain/repository/LikeRepository.java index 011f312f5..1cdbe97e4 100644 --- a/backend/src/main/java/hanglog/like/repository/LikeRepository.java +++ b/backend/src/main/java/hanglog/like/domain/repository/LikeRepository.java @@ -1,4 +1,4 @@ -package hanglog.like.repository; +package hanglog.like.domain.repository; import hanglog.like.domain.Likes; import hanglog.like.dto.LikeElement; diff --git a/backend/src/main/java/hanglog/like/repository/MemberLikeRepository.java b/backend/src/main/java/hanglog/like/domain/repository/MemberLikeRepository.java similarity index 82% rename from backend/src/main/java/hanglog/like/repository/MemberLikeRepository.java rename to backend/src/main/java/hanglog/like/domain/repository/MemberLikeRepository.java index 77c82d4cc..f338c37cd 100644 --- a/backend/src/main/java/hanglog/like/repository/MemberLikeRepository.java +++ b/backend/src/main/java/hanglog/like/domain/repository/MemberLikeRepository.java @@ -1,4 +1,4 @@ -package hanglog.like.repository; +package hanglog.like.domain.repository; import hanglog.like.domain.MemberLike; import org.springframework.data.repository.CrudRepository; diff --git a/backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java b/backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java index 14778a6bc..98e983850 100644 --- a/backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java +++ b/backend/src/main/java/hanglog/like/infrastrcutrue/CustomLikeRepositoryImpl.java @@ -1,7 +1,7 @@ package hanglog.like.infrastrcutrue; import hanglog.like.domain.Likes; -import hanglog.like.repository.CustomLikeRepository; +import hanglog.like.domain.repository.CustomLikeRepository; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; diff --git a/backend/src/main/java/hanglog/like/service/LikeService.java b/backend/src/main/java/hanglog/like/service/LikeService.java index 726b5c1be..5d297c971 100644 --- a/backend/src/main/java/hanglog/like/service/LikeService.java +++ b/backend/src/main/java/hanglog/like/service/LikeService.java @@ -5,10 +5,10 @@ import hanglog.like.domain.MemberLike; import hanglog.like.dto.TripLikeCount; import hanglog.like.dto.request.LikeRequest; -import hanglog.like.repository.CustomLikeRepository; -import hanglog.like.repository.LikeCountRepository; -import hanglog.like.repository.LikeRepository; -import hanglog.like.repository.MemberLikeRepository; +import hanglog.like.domain.repository.CustomLikeRepository; +import hanglog.like.domain.repository.LikeCountRepository; +import hanglog.like.domain.repository.LikeRepository; +import hanglog.like.domain.repository.MemberLikeRepository; import hanglog.member.domain.repository.MemberRepository; import java.util.HashMap; import java.util.List; diff --git a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java index a53b431a5..93f69c386 100644 --- a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java +++ b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java @@ -4,7 +4,7 @@ import static org.assertj.core.api.SoftAssertions.assertSoftly; import hanglog.like.dto.request.LikeRequest; -import hanglog.like.repository.MemberLikeRepository; +import hanglog.like.domain.repository.MemberLikeRepository; import hanglog.like.service.LikeService; import hanglog.trip.service.TripService; import org.junit.jupiter.api.DisplayName; From 45d11688366cfba3809124133d6e787ea8c7f5da Mon Sep 17 00:00:00 2001 From: jjongwa Date: Mon, 20 Nov 2023 22:49:44 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hanglog/community/service/CommunityService.java | 2 +- backend/src/main/java/hanglog/like/domain/MemberLike.java | 2 +- backend/src/main/java/hanglog/like/service/LikeService.java | 4 ++-- .../integration/service/LikeServiceIntegrationTest.java | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/hanglog/community/service/CommunityService.java b/backend/src/main/java/hanglog/community/service/CommunityService.java index 2b1cb4c7e..c23bbc041 100644 --- a/backend/src/main/java/hanglog/community/service/CommunityService.java +++ b/backend/src/main/java/hanglog/community/service/CommunityService.java @@ -145,7 +145,7 @@ private LikeElement getLikeElement(final Long memberId, final Long tripId) { final Optional likeCount = likeCountRepository.findById(tripId); final Optional memberLike = memberLikeRepository.findById(memberId); if (likeCount.isPresent() && memberLike.isPresent()) { - final Map tripLikeStatusMap = memberLike.get().getTripLikeStatusMap(); + final Map tripLikeStatusMap = memberLike.get().getLikeStatusForTrip(); if (tripLikeStatusMap.containsKey(tripId)) { return new LikeElement(tripId, likeCount.get().getCount(), tripLikeStatusMap.get(tripId)); } diff --git a/backend/src/main/java/hanglog/like/domain/MemberLike.java b/backend/src/main/java/hanglog/like/domain/MemberLike.java index aefadb2a2..50101bee5 100644 --- a/backend/src/main/java/hanglog/like/domain/MemberLike.java +++ b/backend/src/main/java/hanglog/like/domain/MemberLike.java @@ -14,5 +14,5 @@ public class MemberLike { @Id private Long memberId; - private Map tripLikeStatusMap; + private Map likeStatusForTrip; } diff --git a/backend/src/main/java/hanglog/like/service/LikeService.java b/backend/src/main/java/hanglog/like/service/LikeService.java index 5d297c971..fc4799265 100644 --- a/backend/src/main/java/hanglog/like/service/LikeService.java +++ b/backend/src/main/java/hanglog/like/service/LikeService.java @@ -35,7 +35,7 @@ public void update(final Long memberId, final Long tripId, final LikeRequest lik Map tripLikeStatusMap = new HashMap<>(); final Optional memberLike = memberLikeRepository.findById(memberId); if (memberLike.isPresent()) { - tripLikeStatusMap = memberLike.get().getTripLikeStatusMap(); + tripLikeStatusMap = memberLike.get().getLikeStatusForTrip(); } tripLikeStatusMap.put(tripId, likeRequest.getIsLike()); memberLikeRepository.save(new MemberLike(memberId, tripLikeStatusMap)); @@ -55,7 +55,7 @@ private void updateLikeCountCache(final Long tripId, final LikeRequest likeReque public void writeBackMemberLikeCache() { final List likes = memberRepository.findAll().stream() .flatMap(member -> memberLikeRepository.findById(member.getId()) - .map(memberLike -> memberLike.getTripLikeStatusMap() + .map(memberLike -> memberLike.getLikeStatusForTrip() .entrySet().stream() .filter(Map.Entry::getValue) .map(entry -> new Likes(entry.getKey(), member.getId()))) diff --git a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java index 93f69c386..843d661e9 100644 --- a/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java +++ b/backend/src/test/java/hanglog/integration/service/LikeServiceIntegrationTest.java @@ -39,14 +39,14 @@ void update() { softly.assertThat(memberLikeRepository.findById(member.getId())).isPresent(); softly.assertThat(memberLikeRepository.findById(member.getId()) .get() - .getTripLikeStatusMap() + .getLikeStatusForTrip() .get(tripId)).isTrue(); likeService.update(member.getId(), tripId, likeFalseRequest); softly.assertThat(memberLikeRepository.findById(member.getId())).isPresent(); softly.assertThat(memberLikeRepository.findById(member.getId()) .get() - .getTripLikeStatusMap() + .getLikeStatusForTrip() .get(tripId)).isFalse(); }); }