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
'실무 프로젝트로 배우는 Kotlin & Spring > 회원 인증 서비스 개발하기' 카테고리의 다른 글
| 서비스 연동 & 프론트 연동 (0) | 2022.12.16 |
|---|---|
| 내정보 조회 (0) | 2022.12.16 |
| 로그인과 로그아웃 (0) | 2022.12.15 |
| 회원가입 (0) | 2022.12.14 |
| JWT 기반 인증 구현 (0) | 2022.12.13 |