Memo API (3-1)
Create Memo
이번 포스트에서는 메모를 생성하는 기능을 구현한다.
MemoController
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
fun createMemo(
@ModelAttribute createMemoRequest: CreateMemoRequest
) = memoService.createMemo(createMemoRequest)
data class CreateMemoRequest(
val title: String,
val content: String,
val tags: List<String>,
val files: List<MultipartFile>?
)
Controller에서 Request으로부터 MultipartFile과 JsonData를 함께 받아서 처리하기 위해 @ModelAttribute
을 사용했다.
MemoService
fun createMemo(createMemoRequest: CreateMemoRequest) {
val memo = memoRepository.save(
Memo(
id = null,
title = createMemoRequest.title,
content = createMemoRequest.content
)
)
tagService.createTags(memo, createMemoRequest.tags)
fileService.createFiles(memo, createMemoRequest.files)
}
TagService
fun createTags(memo: Memo, tagsFromRequest: List<String>) {
val tags = mutableListOf<Tag>()
for (tagInRequest in tagsFromRequest) {
val tag = Tag(
id = null,
memo = memo,
content = tagInRequest
)
tags.add(tag)
memo.tags.add(tag)
}
tagRepository.saveAll(tags)
}
FileService
파일명 중복을 방지하기 위해 파일을 저장할 때 파일명을 UUID로 변경했다.
물론 파일이 어마무시하게 많다면 파일명이 중복되는 문제가 발생할 수 있다.
@Value("\${application.upload-path}")
lateinit var uploadPath: String
fun createFiles(memo: Memo, filesFromRequest: List<MultipartFile>?) {
if (filesFromRequest.isNullOrEmpty())
return
val files = mutableListOf<File>()
for (fileFromRequest in filesFromRequest) {
val fileName = fileFromRequest.originalFilename!!
val savedName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(fileName)
val file = File(
id = null,
memo = memo,
fileName = fileName,
savedName = savedName
)
files.add(file)
memo.files.add(file)
fileFromRequest.transferTo(java.io.File(java.io.File(uploadPath).absolutePath, savedName))
}
fileRepository.saveAll(files)
}
Request
PostMan을 통해서 Request를 보내면 201
응답이 오는 것을 확인할 수 있다.
Response
DB에도 제대로 들어간 것을 확인할 수 있다.
문제점
지금은 예외가 발생하더라도 기존에 save했던 쿼리문이 rollback되지 않고 DB에 그대로 저장된다.
다음 포스트에서는 요청 데이터에 대한 유효성 검사와 로직에 대한 예외처리에 대해 작성하겠다.
Author And Source
이 문제에 관하여(Memo API (3-1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@morningstar/Memo-3-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)