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에 그대로 저장된다.
다음 포스트에서는 요청 데이터에 대한 유효성 검사와 로직에 대한 예외처리에 대해 작성하겠다.

좋은 웹페이지 즐겨찾기