Memo API (4)
Get Memos
이번 포스트에서는 메모 목록을 조회하는 기능을 구현한다.
MemoController
@GetMapping
@ResponseStatus(HttpStatus.OK)
fun getMemos(
@RequestParam(required = false, defaultValue = "0") page: Int,
@RequestParam(required = false, defaultValue = "10") size: Int,
@RequestParam(required = false) title: String?,
@RequestParam(required = false) content: String?
): GetMemosResponse {
val pageable = PageRequest.of(page, size)
val memos = memoService.getMemos(pageable, title, content)
return GetMemosResponse(memos)
}
class GetMemosResponse(
val memos: Page<GetMemosDto>
)
페이징을 통해 조회할 page와 size를 설정할 수 있고 제목이나 내용을 통해 메모를 조회할 수 있도록 구현했다.
memoService.getMemos()의 리턴값을 GetMemoResponse로 감싸서 리턴했다.
MemoService
@Transactional(readOnly = true)
fun getMemos(pageable: PageRequest, title: String?, content: String?): Page<GetMemosDto> {
val memos =
if (!title.isNullOrEmpty() && !content.isNullOrEmpty())
memoRepository.findAllByIsDeletedIsFalseAndTitleContainingOrContentContaining(title, content, pageable)
else if (!title.isNullOrEmpty())
memoRepository.findAllByIsDeletedIsFalseAndTitleContaining(title, pageable)
else if (!content.isNullOrEmpty())
memoRepository.findAllByIsDeletedIsFalseAndContentContaining(content, pageable)
else
memoRepository.findAllByIsDeletedIsFalse(pageable)
return memos.map { memo ->
val tagSize = tagRepository.countByMemo(memo)
val imageSize = imageRepository.countByMemo(memo)
GetMemosDto(memo, tagSize, imageSize)
}
}
class GetMemosDto(
memo: Memo,
val tagSize: Int,
val imageSize: Int
) {
val id = memo.id!!
val title = memo.title
val content = memo.content
val updatedAt = memo.updatedAt
}
검색 조건인 title과 content의 상태에 따라 조회 쿼리를 다르게 호출하고 각각의 memo에 대해 GetMemoDto로 변환하여 리턴한다.
tagSize와 imageSize를 조회할 때 countByMemo() 메서드를 호출했는데
val tagSize = memo.tags.size
val imageSize = memo.images.size
로 조회하면 모든 tag와 image를 select하는 쿼리문을 호출하여 size를 구하기 때문에 countByMemo()가 성능이 더 좋다고 판단했다.
MemoRepository
fun findAllByIsDeletedIsFalse(pageable: Pageable): Page<Memo>
fun findAllByIsDeletedIsFalseAndTitleContainingOrContentContaining(
title: String,
content: String,
pageable: Pageable
): Page<Memo>
fun findAllByIsDeletedIsFalseAndTitleContaining(title: String, pageable: Pageable): Page<Memo>
fun findAllByIsDeletedIsFalseAndContentContaining(content: String, pageable: Pageable): Page<Memo>
Request & Response
Author And Source
이 문제에 관하여(Memo API (4)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@morningstar/memo-4저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)