From 3ec16b50455ebf42caac126c5fcb7fadc670da7e Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 26 Oct 2023 18:42:22 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20API=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0,=20=EC=BA=90=EC=8B=9C=20=EC=A0=84=EB=9E=B5=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=9D=84=20=EC=9C=84=ED=95=B4=20@Cacheable?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/configs/RedisConfig.kt | 33 ---- .../content/AudioContentRepository.kt | 32 ---- .../main/AudioContentMainController.kt | 52 ------ .../content/main/AudioContentMainService.kt | 155 ------------------ .../vividnext/sodalive/event/EventService.kt | 5 - .../live/recommend/LiveRecommendRepository.kt | 5 - 6 files changed, 282 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index f309011..3fa5d11 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -4,16 +4,10 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.cache.annotation.EnableCaching import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.data.redis.cache.RedisCacheConfiguration -import org.springframework.data.redis.cache.RedisCacheManager import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate import org.springframework.data.redis.repository.configuration.EnableRedisRepositories -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer -import org.springframework.data.redis.serializer.RedisSerializationContext -import org.springframework.data.redis.serializer.StringRedisSerializer -import java.time.Duration @Configuration @EnableCaching @@ -35,31 +29,4 @@ class RedisConfig( redisTemplate.setConnectionFactory(redisConnectionFactory()) return redisTemplate } - - @Bean - fun cacheManager(connectionFactory: RedisConnectionFactory): RedisCacheManager { - val defaultConfig = RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofHours(1)) // Default TTL - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer( - GenericJackson2JsonRedisSerializer() - ) - ) - - val weekLivedCacheConfig = RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofDays(3)) - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer( - GenericJackson2JsonRedisSerializer() - ) - ) - - return RedisCacheManager.RedisCacheManagerBuilder - .fromConnectionFactory(connectionFactory) - .cacheDefaults(defaultConfig) - .withCacheConfiguration("weekLivedCache", weekLivedCacheConfig) - .build() - } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index 0c195ea..e7bfebe 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -17,7 +17,6 @@ import kr.co.vividnext.sodalive.content.order.QOrder.order import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme import kr.co.vividnext.sodalive.event.QEvent.event import kr.co.vividnext.sodalive.member.QMember.member -import org.springframework.cache.annotation.Cacheable import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.time.LocalDateTime @@ -77,9 +76,6 @@ interface AudioContentQueryRepository { fun getAudioContentMainBannerList(isAdult: Boolean): List fun getAudioContentCurations(isAdult: Boolean): List - - fun getAudioContentCurationList(isAdult: Boolean, offset: Long = 0, limit: Long = 10): List - fun findAudioContentByCurationId( curationId: Long, cloudfrontHost: String, @@ -390,10 +386,6 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .fetch() } - @Cacheable( - value = ["getAudioContentCurations"], - cacheManager = "cacheManager" - ) override fun getAudioContentCurations(isAdult: Boolean): List { var where = audioContentCuration.isActive.isTrue @@ -408,26 +400,6 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .fetch() } - override fun getAudioContentCurationList( - isAdult: Boolean, - offset: Long, - limit: Long - ): List { - var where = audioContentCuration.isActive.isTrue - - if (!isAdult) { - where = where.and(audioContentCuration.isAdult.isFalse) - } - - return queryFactory - .selectFrom(audioContentCuration) - .where(where) - .orderBy(audioContentCuration.orders.asc()) - .offset(offset) - .limit(limit) - .fetch() - } - override fun findAudioContentByCurationId( curationId: Long, cloudfrontHost: String, @@ -465,10 +437,6 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .fetch() } - @Cacheable( - value = ["weekLivedCache"], - cacheManager = "cacheManager" - ) override fun getAudioContentRanking( cloudfrontHost: String, isAdult: Boolean, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt index df51a73..41cee69 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt @@ -23,33 +23,6 @@ class AudioContentMainController(private val service: AudioContentMainService) { ApiResponse.ok(service.getMain(member = member)) } - @GetMapping("/new-content-upload-creator") - fun getNewContentUploadCreatorList( - @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? - ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - - ApiResponse.ok(service.getNewContentUploadCreatorList(member = member)) - } - - @GetMapping("/banner-list") - fun getAudioContentMainBannerList( - @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? - ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - - ApiResponse.ok(service.getAudioContentMainBannerList(member = member)) - } - - @GetMapping("/order-list") - fun getAudioContentMainOrderList( - @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? - ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - - ApiResponse.ok(service.getAudioContentMainOrderList(member = member)) - } - @GetMapping("/new") fun getNewContentByTheme( @RequestParam("theme") theme: String, @@ -80,29 +53,4 @@ class AudioContentMainController(private val service: AudioContentMainService) { ApiResponse.ok(service.getNewContentFor2WeeksByTheme(theme, member, pageable)) } - - @GetMapping("/curation-list") - fun getAudioContentMainCurationList( - @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, - pageable: Pageable - ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - - ApiResponse.ok( - service.getAudioContentMainCurationList( - member, - offset = pageable.offset, - limit = pageable.pageSize.toLong() - ) - ) - } - - @GetMapping("/content-ranking") - fun getAudioContentMainContentRanking( - @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? - ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - - ApiResponse.ok(service.getAudioContentMainContentRanking(member)) - } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt index 159b661..5b6b050 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt @@ -10,7 +10,6 @@ import kr.co.vividnext.sodalive.event.EventItem import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import org.springframework.beans.factory.annotation.Value -import org.springframework.cache.annotation.Cacheable import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import java.time.DayOfWeek @@ -169,87 +168,6 @@ class AudioContentMainService( ) } - @Cacheable( - value = ["getNewContentUploadCreatorList"], - cacheManager = "cacheManager" - ) - fun getNewContentUploadCreatorList(member: Member): List { - val isAdult = member.auth != null - - // 2주일 이내에 콘텐츠를 올린 크리에이터 20명 조회 - return repository.getNewContentUploadCreatorList( - cloudfrontHost = imageHost, - isAdult = isAdult - ) - .asSequence() - .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } - .toList() - } - - @Cacheable( - value = ["getAudioContentMainBannerList"], - cacheManager = "cacheManager" - ) - fun getAudioContentMainBannerList(member: Member): List { - val isAdult = member.auth != null - - return repository - .getAudioContentMainBannerList(isAdult = isAdult) - .asSequence() - .filter { - if (it.type == AudioContentBannerType.CREATOR && it.creator != null) { - !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creator!!.id!!) - } else { - true - } - } - .map { - GetAudioContentBannerResponse( - type = it.type, - thumbnailImageUrl = "$imageHost/${it.thumbnailImage}", - eventItem = if (it.type == AudioContentBannerType.EVENT && it.event != null) { - EventItem( - id = it.event!!.id!!, - thumbnailImageUrl = if (!it.event!!.thumbnailImage.startsWith("https://")) { - "$imageHost/${it.event!!.thumbnailImage}" - } else { - it.event!!.thumbnailImage - }, - detailImageUrl = if ( - it.event!!.detailImage != null && - !it.event!!.detailImage!!.startsWith("https://") - ) { - "$imageHost/${it.event!!.detailImage}" - } else { - it.event!!.detailImage - }, - popupImageUrl = null, - link = it.event!!.link, - title = it.event!!.title, - isPopup = false - ) - } else { - null - }, - creatorId = if (it.type == AudioContentBannerType.CREATOR && it.creator != null) { - it.creator!!.id - } else { - null - }, - link = it.link - ) - } - .toList() - } - - fun getAudioContentMainOrderList(member: Member): List { - return orderService - .getAudioContentMainOrderList( - member = member, - limit = 20 - ) - } - fun getThemeList(member: Member): List { return audioContentThemeRepository.getActiveThemeOfContent(isAdult = member.auth != null) } @@ -279,77 +197,4 @@ class AudioContentMainService( return GetNewContentAllResponse(totalCount, items) } - - @Cacheable( - value = ["getAudioContentMainCurationList"], - cacheManager = "cacheManager" - ) - fun getAudioContentMainCurationList( - member: Member, - offset: Long, - limit: Long - ): List { - val isAdult = member.auth != null - - return repository - .getAudioContentCurationList( - isAdult = isAdult, - offset = offset, - limit = limit - ) - .asSequence() - .map { - GetAudioContentCurationResponse( - curationId = it.id!!, - title = it.title, - description = it.description, - contents = repository.findAudioContentByCurationId( - curationId = it.id!!, - cloudfrontHost = imageHost, - isAdult = isAdult - ) - .asSequence() - .filter { content -> - !blockMemberRepository.isBlocked( - blockedMemberId = member.id!!, - memberId = content.creatorId - ) - } - .toList() - ) - } - .filter { it.contents.isNotEmpty() } - .toList() - } - - fun getAudioContentMainContentRanking(member: Member): GetAudioContentRanking { - val isAdult = member.auth != null - - val currentDateTime = LocalDateTime.now() - val startDate = currentDateTime - .minusWeeks(1) - .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) - .withHour(15) - .withMinute(0) - .withSecond(0) - val endDate = startDate - .plusDays(7) - - val startDateFormatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일") - val endDateFormatter = DateTimeFormatter.ofPattern("MM월 dd일") - - val contentRankingItemList = repository - .getAudioContentRanking( - cloudfrontHost = imageHost, - startDate = startDate.minusDays(1), - endDate = endDate.minusDays(1), - isAdult = isAdult - ) - - return GetAudioContentRanking( - startDate = startDate.format(startDateFormatter), - endDate = endDate.minusDays(1).format(endDateFormatter), - contentRankingItemList - ) - } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/event/EventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/event/EventService.kt index 2237d7b..e6ddd74 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/event/EventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/event/EventService.kt @@ -5,7 +5,6 @@ import kr.co.vividnext.sodalive.aws.s3.S3Uploader import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.utils.generateFileName import org.springframework.beans.factory.annotation.Value -import org.springframework.cache.annotation.Cacheable import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -21,10 +20,6 @@ class EventService( @Value("\${cloud.aws.cloud-front.host}") private val cloudFrontHost: String ) { - @Cacheable( - value = ["getEventList"], - cacheManager = "cacheManager" - ) fun getEventList(): GetEventResponse { val eventList = repository.getEventList() .asSequence() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt index b65eecb..e6ece32 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt @@ -9,7 +9,6 @@ import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.QMember.member import kr.co.vividnext.sodalive.member.following.QCreatorFollowing.creatorFollowing import org.springframework.beans.factory.annotation.Value -import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Repository import java.time.LocalDateTime @@ -20,10 +19,6 @@ class LiveRecommendRepository( @Value("\${cloud.aws.cloud-front.host}") private val cloudFrontHost: String ) { - @Cacheable( - value = ["getRecommendLive"], - cacheManager = "cacheManager" - ) fun getRecommendLive( memberId: Long, isBlocked: (Long) -> Boolean, From 1c7fdfac69add5bc1d9987bc81014d4c1adbd007 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 27 Oct 2023 01:08:40 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=BA=90=EC=8B=B1=20=EC=A0=84=EB=9E=B5=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20-=20repository=20=EC=97=90=20=EC=9E=88=EB=8D=98=20@?= =?UTF-8?q?Cacheable=20=EC=9D=84=20service=20=EC=BD=94=EB=93=9C=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/configs/RedisConfig.kt | 20 ++ .../content/main/AudioContentMainService.kt | 176 ++++++++++-------- .../theme/AudioContentThemeQueryRepository.kt | 2 + 3 files changed, 119 insertions(+), 79 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 3fa5d11..015324c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -4,10 +4,13 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.cache.annotation.EnableCaching import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.data.redis.cache.RedisCacheConfiguration +import org.springframework.data.redis.cache.RedisCacheManager import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate import org.springframework.data.redis.repository.configuration.EnableRedisRepositories +import java.time.Duration @Configuration @EnableCaching @@ -29,4 +32,21 @@ class RedisConfig( redisTemplate.setConnectionFactory(redisConnectionFactory()) return redisTemplate } + + @Bean + fun cacheManager(redisConnectionFactory: RedisConnectionFactory): RedisCacheManager { + val defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(30)) + + val cacheConfigMap = mutableMapOf() + cacheConfigMap["default"] = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(30)) + cacheConfigMap["cache_ttl_3_days"] = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofDays(3)) + + return RedisCacheManager.builder(redisConnectionFactory) + .cacheDefaults(defaultCacheConfig) + .withInitialCacheConfigurations(cacheConfigMap) + .build() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt index 5b6b050..c2d80d0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.event.EventItem import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import org.springframework.beans.factory.annotation.Value +import org.springframework.cache.annotation.Cacheable import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import java.time.DayOfWeek @@ -29,21 +30,103 @@ class AudioContentMainService( ) { fun getMain(member: Member): GetAudioContentMainResponse { val isAdult = member.auth != null + val memberId = member.id!! // 2주일 이내에 콘텐츠를 올린 크리에이터 20명 조회 - val newContentUploadCreatorList = repository.getNewContentUploadCreatorList( + val newContentUploadCreatorList = getNewContentUploadCreatorList(memberId = memberId, isAdult = isAdult) + + val bannerList = getAudioContentMainBannerList(memberId = memberId, isAdult = isAdult) + + // 구매목록 20개 + val orderList = orderService.getAudioContentMainOrderList( + member = member, + limit = 20 + ) + + // 콘텐츠 테마 + val themeList = audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) + + // 새 콘텐츠 20개 - 시간 내림차순 정렬 + val newContentList = repository.findByTheme( cloudfrontHost = imageHost, isAdult = isAdult ) .asSequence() - .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } + .filter { !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = it.creatorId) } .toList() - val bannerList = repository.getAudioContentMainBannerList(isAdult = isAdult) + val curationList = getAudioContentCurationList(memberId = memberId, isAdult = isAdult) + + val currentDateTime = LocalDateTime.now() + val startDate = currentDateTime + .minusWeeks(1) + .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) + .withHour(15) + .withMinute(0) + .withSecond(0) + val endDate = startDate.plusDays(7) + + val contentRanking = getContentRanking(isAdult = isAdult, startDate = startDate, endDate = endDate) + + return GetAudioContentMainResponse( + newContentUploadCreatorList = newContentUploadCreatorList, + bannerList = bannerList, + orderList = orderList, + themeList = themeList, + newContentList = newContentList, + curationList = curationList, + contentRanking = contentRanking + ) + } + + fun getThemeList(member: Member): List { + return audioContentThemeRepository.getActiveThemeOfContent(isAdult = member.auth != null) + } + + fun getNewContentByTheme(theme: String, member: Member, pageable: Pageable): List { + return repository.findByTheme( + cloudfrontHost = imageHost, + theme = theme, + isAdult = member.auth != null, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + .asSequence() + .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } + .toList() + } + + fun getNewContentFor2WeeksByTheme(theme: String, member: Member, pageable: Pageable): GetNewContentAllResponse { + val totalCount = repository.totalCountNewContentFor2Weeks(theme, isAdult = member.auth != null) + val items = repository.findByThemeFor2Weeks( + cloudfrontHost = imageHost, + theme = theme, + isAdult = member.auth != null, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + + return GetNewContentAllResponse(totalCount, items) + } + + @Cacheable(cacheNames = ["default"], key = "'getNewContentUploadCreatorList:' + #memberId + ':' + #isAdult") + fun getNewContentUploadCreatorList(memberId: Long, isAdult: Boolean): List { + return repository.getNewContentUploadCreatorList( + cloudfrontHost = imageHost, + isAdult = isAdult + ) + .asSequence() + .filter { !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = it.creatorId) } + .toList() + } + + @Cacheable(cacheNames = ["default"], key = "'getAudioContentMainBannerList:' + #memberId + ':' + #isAdult") + fun getAudioContentMainBannerList(memberId: Long, isAdult: Boolean) = + repository.getAudioContentMainBannerList(isAdult = isAdult) .asSequence() .filter { if (it.type == AudioContentBannerType.CREATOR && it.creator != null) { - !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creator!!.id!!) + !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = it.creator!!.id!!) } else { true } @@ -86,26 +169,9 @@ class AudioContentMainService( } .toList() - // 구매목록 20개 - val orderList = orderService.getAudioContentMainOrderList( - member = member, - limit = 20 - ) - - // 콘텐츠 테마 - val themeList = audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) - - // 새 콘텐츠 20개 - 시간 내림차순 정렬 - val newContentList = repository.findByTheme( - cloudfrontHost = imageHost, - isAdult = isAdult - ) - .asSequence() - .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } - .toList() - - val curationList = repository - .getAudioContentCurations(isAdult = isAdult) + @Cacheable(cacheNames = ["default"], key = "'getAudioContentCurationList:' + #memberId + ':' + #isAdult") + fun getAudioContentCurationList(memberId: Long, isAdult: Boolean) = + repository.getAudioContentCurations(isAdult = isAdult) .asSequence() .map { GetAudioContentCurationResponse( @@ -119,10 +185,7 @@ class AudioContentMainService( ) .asSequence() .filter { content -> - !blockMemberRepository.isBlocked( - blockedMemberId = member.id!!, - memberId = content.creatorId - ) + !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = content.creatorId) } .toList() ) @@ -130,16 +193,11 @@ class AudioContentMainService( .filter { it.contents.isNotEmpty() } .toList() - val currentDateTime = LocalDateTime.now() - val startDate = currentDateTime - .minusWeeks(1) - .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) - .withHour(15) - .withMinute(0) - .withSecond(0) - val endDate = startDate - .plusDays(7) - + @Cacheable( + cacheNames = ["cache_ttl_3_days"], + key = "'getAudioContentCurationList:' + ':' + #isAdult + ':' + #startDate + ':' + #endDate" + ) + fun getContentRanking(isAdult: Boolean, startDate: LocalDateTime, endDate: LocalDateTime): GetAudioContentRanking { val startDateFormatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일") val endDateFormatter = DateTimeFormatter.ofPattern("MM월 dd일") @@ -151,50 +209,10 @@ class AudioContentMainService( isAdult = isAdult ) - val contentRanking = GetAudioContentRanking( + return GetAudioContentRanking( startDate = startDate.format(startDateFormatter), endDate = endDate.minusDays(1).format(endDateFormatter), contentRankingItemList ) - - return GetAudioContentMainResponse( - newContentUploadCreatorList = newContentUploadCreatorList, - bannerList = bannerList, - orderList = orderList, - themeList = themeList, - newContentList = newContentList, - curationList = curationList, - contentRanking = contentRanking - ) - } - - fun getThemeList(member: Member): List { - return audioContentThemeRepository.getActiveThemeOfContent(isAdult = member.auth != null) - } - - fun getNewContentByTheme(theme: String, member: Member, pageable: Pageable): List { - return repository.findByTheme( - cloudfrontHost = imageHost, - theme = theme, - isAdult = member.auth != null, - offset = pageable.offset, - limit = pageable.pageSize.toLong() - ) - .asSequence() - .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } - .toList() - } - - fun getNewContentFor2WeeksByTheme(theme: String, member: Member, pageable: Pageable): GetNewContentAllResponse { - val totalCount = repository.totalCountNewContentFor2Weeks(theme, isAdult = member.auth != null) - val items = repository.findByThemeFor2Weeks( - cloudfrontHost = imageHost, - theme = theme, - isAdult = member.auth != null, - offset = pageable.offset, - limit = pageable.pageSize.toLong() - ) - - return GetNewContentAllResponse(totalCount, items) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt index e5cba07..bf7bfc1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt @@ -4,6 +4,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.content.QAudioContent.audioContent import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme import org.springframework.beans.factory.annotation.Value +import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Repository @Repository @@ -27,6 +28,7 @@ class AudioContentThemeQueryRepository( .fetch() } + @Cacheable(cacheNames = ["default"], key = "'getActiveThemeOfContent:' + ':' + #isAdult") fun getActiveThemeOfContent(isAdult: Boolean = false): List { var where = audioContent.isActive.isTrue .and(audioContentTheme.isActive.isTrue)