실무 프로젝트로 배우는 Kotlin & Spring/회원 인증 서비스 개발하기

리포트 조회 / 내정보 수정

webmaster 2022. 12. 16. 15:14
728x90

리포트 조회

Controller

@GetMapping("/{userId}/username")
suspend fun getUsername(@PathVariable userId: Long): Map<String, String> {
    return mapOf("reporter" to userService.get(userId).username)
}
  • 이전에 만들었던 get메서드를 재활용했다.
  • username만 반환하면 되므로 간단하게 map을 사용했다.

내 정보 수정

Controller

@PostMapping("/{id}", consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
suspend fun edit(
    @PathVariable id: Long,
    @ModelAttribute request: UserEditRequest,
    @AuthToken token: String,
    @RequestPart("profileUrl") filePart: FilePart,
) {
    val orgFilename = filePart.filename()
    var filename: String? = null
    if (orgFilename.isNotEmpty()) {
        //확장자
        val ext = orgFilename.substring(orgFilename.lastIndexOf(".") + 1)
        filename = "${id}.${ext}"
        val file = File(ClassPathResource("/images/").file, filename)
        filePart.transferTo(file).awaitSingleOrNull() //Mono를 코루틴으로 사용
    }
    userService.edit(token, request.username, filename)
}

UserEditRequest

data class UserEditRequest(
    val username: String,
) {
}
  • FilePart를 통해 파일 정보를 읽을 수 있다.
  • 확장자 같은 경우 마지막 점 인덱스 + 1부터 끝까지 이므로 lastIndexOf로 마지막 점 위치를 구하고, 끝까지 substring 한다.
  • ClassPathResource를 사용하면, 경로를 지정해 줄 수 있고, transferTo 함수를 통해 파일 업로드를 진행한다.

UserService

suspend fun edit(token: String, username: String, profileUrl: String?): User {
    val user = getByToken(token)
    val newUser = user.copy(username = username, profileUrl = profileUrl ?: user.profileUrl)

    return userRepository.save(newUser).also {
        cacheManager.awaitPut(key = token, value = it, ttl = CACHE_TTL)
    }
}
  • copy 함수를 사용하여, 이전 값들은 그대로 사용하고, 변경할 것만 작성한다.

ImageController

@Controller
@RequestMapping("/images")
class ImageController {
    @GetMapping("{filename}")
    fun image(@PathVariable filename: String): ResponseEntity<InputStreamResource> {
        val ext = filename.substring(filename.lastIndexOf("." + 1))
        val file = File(ClassPathResource("/images/").file, filename)
        return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_TYPE, "images/$ext")
            .body(InputStreamResource(FileInputStream(file)))
    }
}
  • 이미지 값을 가지고 오는 이미지 컨트롤러를 작성한다.
  • file 같은 경우 MultipartForm으로 가지고 오기에 @Controller를 사용하였다
728x90