Memo API (5)

12890 단어 memo-apimemo-api

Get Memo

MemoController

    @GetMapping("/{memoId}")
    @ResponseStatus(HttpStatus.OK)
    fun getMemo(
        @PathVariable memoId: Int
    ) = GetMemoResponse(memoService.getMemo(memoId))
  class GetMemoResponse(
      val memo: GetMemoDto
  )

MemoService

    @Transactional(readOnly = true)
    fun getMemo(memoId: Int): GetMemoDto {
        val memo = memoRepository.findByIdAndIsDeletedIsFalse(memoId).orElseThrow { MemoNotFoundException(memoId) }

        val tags = memo.tags.stream()
            .map {
                GetTagsDto(it)
            }.collect(Collectors.toList())

        val images = memo.images.stream()
            .map {
                GetImagesDto(it)
            }.collect(Collectors.toList())

        return GetMemoDto(memo, tags, images)
    }
  class MemoNotFoundException(memoId: Int) : RuntimeException("${memoId}번 메모가 존재하지 않습니다.")
  class GetTagsDto(tag: Tag) {
      val content = tag.content
  }
  class GetImagesDto(image: Image) {
      val id = image.id!!
      val fileName = image.fileName
  }
  class GetMemoDto(
      memo: Memo,
      val tags: List<GetTagsDto>,
      val images: List<GetImagesDto>
  ) {
      val id = memo.id!!
      val title = memo.title
      val content = memo.content
      val updatedAt = memo.updatedAt
  }

memoId를 통해 memo를 조회하고 memo가 없다면 예외를 던진다.
조회한 memo의 tags와 images를 각각 GetTagsDto와 GetImagesDto로 매핑하고 마지막에 GetMemoDto로 매핑해서 리턴한다.

MemoRepository

  fun findByIdAndIsDeletedIsFalse(memoId: Int): Optional<Memo>

MemoExceptionHandler

  @RestControllerAdvice
  @Order(Ordered.HIGHEST_PRECEDENCE)
  class MemoExceptionHandler {
      @ExceptionHandler(MemoNotFoundException::class)
      @ResponseStatus(HttpStatus.NOT_FOUND)
      fun handleMemoNotFound(exception: MemoNotFoundException): ErrorResponse {
          return ErrorResponse(HttpStatus.NOT_FOUND, "Memo-001", exception.message!!)
      }
  }
class ErrorResponse(
    val timeStamp: LocalDateTime,
    val status: Int,
    val error: String,
    val message: String
) {
    constructor(httpStatus: HttpStatus, errorCode: String, message: String) : this(
        timeStamp = LocalDateTime.now(),
        status = httpStatus.value(),
        error = errorCode,
        message = message
    )
}

Service에서 발생하는 모든 예외는 ExceptionHandler를 통해 처리한다.
ErrorResponse를 만들어 발생한 예외에 대한 정보를 저장한다.

Request & Response

존재하지 않는 memoId로 조회할 경우 ErrorResponse가 return되는 것을 확인할 수 있다.

좋은 웹페이지 즐겨찾기