Memo API (5)
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
}
@GetMapping("/{memoId}")
@ResponseStatus(HttpStatus.OK)
fun getMemo(
@PathVariable memoId: Int
) = GetMemoResponse(memoService.getMemo(memoId))
class GetMemoResponse(
val memo: GetMemoDto
)
@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되는 것을 확인할 수 있다.
Author And Source
이 문제에 관하여(Memo API (5)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@morningstar/memo-5저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)