공지사항
- QueryProjection 사용 - QueryDSL을 통해 DTO로 바로 조회
This commit is contained in:
		| @@ -6,11 +6,11 @@ import kr.co.vividnext.sodalive.content.main.banner.GetAudioContentBannerRespons | ||||
| import kr.co.vividnext.sodalive.content.series.GetSeriesListResponse | ||||
| import kr.co.vividnext.sodalive.event.GetEventResponse | ||||
| import kr.co.vividnext.sodalive.explorer.GetExplorerSectionResponse | ||||
| import kr.co.vividnext.sodalive.notice.NoticeTitleItem | ||||
| import kr.co.vividnext.sodalive.notice.NoticeItem | ||||
|  | ||||
| data class GetContentMainTabHomeResponse( | ||||
|     val tabId: Long = 1, | ||||
|     val latestNotice: NoticeTitleItem?, | ||||
|     val latestNotice: NoticeItem?, | ||||
|     val bannerList: List<GetAudioContentBannerResponse>, | ||||
|     val rankCreatorList: GetExplorerSectionResponse, | ||||
|     val rankSeriesList: List<GetSeriesListResponse.SeriesListItem>, | ||||
|   | ||||
| @@ -7,14 +7,9 @@ data class GetNoticeResponse( | ||||
|     val noticeList: List<NoticeItem> | ||||
| ) | ||||
|  | ||||
| data class NoticeItem( | ||||
| data class NoticeItem @QueryProjection constructor( | ||||
|     val id: Long, | ||||
|     val title: String, | ||||
|     val content: String, | ||||
|     val date: String | ||||
| ) | ||||
|  | ||||
| data class NoticeTitleItem @QueryProjection constructor( | ||||
|     val id: Long, | ||||
|     val title: String | ||||
| ) | ||||
|   | ||||
| @@ -5,8 +5,6 @@ import org.springframework.data.domain.Pageable | ||||
| import org.springframework.data.repository.findByIdOrNull | ||||
| import org.springframework.stereotype.Service | ||||
| import org.springframework.transaction.annotation.Transactional | ||||
| import java.time.ZoneId | ||||
| import java.time.format.DateTimeFormatter | ||||
|  | ||||
| @Service | ||||
| @Transactional(readOnly = true) | ||||
| @@ -46,25 +44,11 @@ class ServiceNoticeService(private val repository: ServiceServiceNoticeRepositor | ||||
|     fun getNoticeList(pageable: Pageable, timezone: String): GetNoticeResponse { | ||||
|         val totalCount = repository.getNoticeTotalCount() | ||||
|         val noticeList = repository.getNoticeList(pageable) | ||||
|             .asSequence() | ||||
|             .map { | ||||
|                 val createdAt = it.createdAt!! | ||||
|                     .atZone(ZoneId.of("UTC")) | ||||
|                     .withZoneSameInstant(ZoneId.of(timezone)) | ||||
|  | ||||
|                 NoticeItem( | ||||
|                     it.id!!, | ||||
|                     it.title, | ||||
|                     it.content, | ||||
|                     createdAt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) | ||||
|                 ) | ||||
|             } | ||||
|             .toList() | ||||
|  | ||||
|         return GetNoticeResponse(totalCount, noticeList) | ||||
|     } | ||||
|  | ||||
|     fun getLatestNotice(): NoticeTitleItem? { | ||||
|     fun getLatestNotice(): NoticeItem? { | ||||
|         return repository.getLatestNotice() | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,18 +1,22 @@ | ||||
| package kr.co.vividnext.sodalive.notice | ||||
|  | ||||
| import com.querydsl.core.types.dsl.DateTimePath | ||||
| import com.querydsl.core.types.dsl.Expressions | ||||
| import com.querydsl.core.types.dsl.StringTemplate | ||||
| import com.querydsl.jpa.impl.JPAQueryFactory | ||||
| import kr.co.vividnext.sodalive.notice.QServiceNotice.serviceNotice | ||||
| import org.springframework.data.domain.Pageable | ||||
| import org.springframework.data.jpa.repository.JpaRepository | ||||
| import org.springframework.stereotype.Repository | ||||
| import java.time.LocalDateTime | ||||
|  | ||||
| @Repository | ||||
| interface ServiceServiceNoticeRepository : JpaRepository<ServiceNotice, Long>, ServiceNoticeQueryRepository | ||||
|  | ||||
| interface ServiceNoticeQueryRepository { | ||||
|     fun getNoticeTotalCount(): Int | ||||
|     fun getNoticeList(pageable: Pageable): List<ServiceNotice> | ||||
|     fun getLatestNotice(): NoticeTitleItem? | ||||
|     fun getNoticeList(pageable: Pageable): List<NoticeItem> | ||||
|     fun getLatestNotice(): NoticeItem? | ||||
| } | ||||
|  | ||||
| @Repository | ||||
| @@ -26,9 +30,17 @@ class ServiceNoticeQueryRepositoryImpl(private val queryFactory: JPAQueryFactory | ||||
|             .size | ||||
|     } | ||||
|  | ||||
|     override fun getNoticeList(pageable: Pageable): List<ServiceNotice> { | ||||
|     override fun getNoticeList(pageable: Pageable): List<NoticeItem> { | ||||
|         return queryFactory | ||||
|             .selectFrom(serviceNotice) | ||||
|             .select( | ||||
|                 QNoticeItem( | ||||
|                     serviceNotice.id, | ||||
|                     serviceNotice.title, | ||||
|                     serviceNotice.content, | ||||
|                     getFormattedDate(serviceNotice.createdAt) | ||||
|                 ) | ||||
|             ) | ||||
|             .from(serviceNotice) | ||||
|             .where(serviceNotice.isActive.isTrue) | ||||
|             .offset(pageable.offset) | ||||
|             .limit(pageable.pageSize.toLong()) | ||||
| @@ -36,12 +48,14 @@ class ServiceNoticeQueryRepositoryImpl(private val queryFactory: JPAQueryFactory | ||||
|             .fetch() | ||||
|     } | ||||
|  | ||||
|     override fun getLatestNotice(): NoticeTitleItem? { | ||||
|     override fun getLatestNotice(): NoticeItem? { | ||||
|         return queryFactory | ||||
|             .select( | ||||
|                 QNoticeTitleItem( | ||||
|                 QNoticeItem( | ||||
|                     serviceNotice.id, | ||||
|                     serviceNotice.title | ||||
|                     serviceNotice.title, | ||||
|                     serviceNotice.content, | ||||
|                     getFormattedDate(serviceNotice.createdAt) | ||||
|                 ) | ||||
|             ) | ||||
|             .from(serviceNotice) | ||||
| @@ -49,4 +63,18 @@ class ServiceNoticeQueryRepositoryImpl(private val queryFactory: JPAQueryFactory | ||||
|             .orderBy(serviceNotice.id.desc()) | ||||
|             .fetchFirst() | ||||
|     } | ||||
|  | ||||
|     private fun getFormattedDate(dateTimePath: DateTimePath<LocalDateTime>): StringTemplate { | ||||
|         return Expressions.stringTemplate( | ||||
|             "DATE_FORMAT({0}, {1})", | ||||
|             Expressions.dateTimeTemplate( | ||||
|                 LocalDateTime::class.java, | ||||
|                 "CONVERT_TZ({0},{1},{2})", | ||||
|                 dateTimePath, | ||||
|                 "UTC", | ||||
|                 "Asia/Seoul" | ||||
|             ), | ||||
|             "%Y-%m-%d" | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user