Memo API (4)

12440 단어 memo-apimemo-api

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

좋은 웹페이지 즐겨찾기