현재 진행중인 프로젝트에서 마이페이지에서 UserInfo 업데이트 할 때 이미지도 받을 수 있도록 코드 구현을 하면서 사용한 코드에 대해서 아래와 같이 정리를 해보았다.
Multipart 요청에 수신된 업로드된 파일을 의미한다. 파일 내용은 메모리에 저장되거나 임시로 디스크에 저장되며, 사용자는 원하는 경우 파일 내용을 세션 수준 또는 영구 저장소에 복사할 수 있다. 요청 처리가 끝나면 임시 저장소가 지워진다.
StringUtils 클래스에는 문자열에 대한 다양한 작업을 수행하기 위한 정적 메서드들이 포함되어 있다.
.cleanPath 메소드는 경로가 root directory 및 root directory 자손에 상대적이어야 하며, 각 경로 segment의 상대 경로가 root directory 자손이어야 한다. 즉, "../"로 시작하거나 "../"경로를 포함할 수 없고, "normalized"가 되면 "../"로 시작하게 된다 (ex. "dir1/../../dir2"는 "normalized"가 되면 "../dir2"가 된다).
.getFilenameExtension 메소드는 파일의 확장자를 반환한다.
StringUtils.getFilenameExtension("mypath/myfile.txt"); // "txt" 문자열 반환
먼저 자바에서 UUID(Universally Unique Identifiers)는 범용 고유 식별자라고도 하며, 각 개체를 고유하게 식별 가능한 값을 의미한다. 여기서 UUID.randomUUID()는 UUID 값을 "랜덤"하게 생성할 수 있는데, 생성 시에는 UUID 형태로 가져오기 때문에 toString();으로 String으로 바꿔준 후 사용해주면 된다.
완성된 코드는 아래와 같이 작성하였다.
@Transactional
public ResponseEntity<?> updateUserInfo(Long userId,
UserPageRequestDto userPageRequestDto,
User user,
@RequestParam("imageFile") MultipartFile imageFile) throws IOException {
// MultipartFile imageFile input으로 사용
// userId로 업데이트할 User 개체를 db에서 가져옴
User userUpdate = userRepository.findById(userId)
.orElseThrow(() -> new ErrorException(ExceptionEnum.USER_NOT_FOUND));
// 동일 사용자인지 확인
if (!userUpdate.getId().equals(user.getId())) {
throw new ErrorException(ExceptionEnum.NOT_ALLOWED_AUTHORIZATIONS);
}
//User 클래스의 username 속석을 userPageRequestDto의 username값으로 설정
userUpdate.setUsername(userPageRequestDto.getUsername());
// Save the image file to disk
String fileName = StringUtils.cleanPath(imageFile.getOriginalFilename());
String fileExtension = StringUtils.getFilenameExtension(fileName); // StringUtils 클래스를 다시 사용하여서 정리된 파일 이름에서 파일 확장자 추출
String newFileName = UUID.randomUUID() + "." + fileExtension; // 업로드된 파일에 대한 고유한 새 파일 이름 생성. 임의의 UUID 생성 후 끝에 fileExtension 추가
String uploadDir = "./user-images/"; // directory 설정
FileUploadUtil.saveFile(uploadDir, newFileName, imageFile); //파일 저장
// Set the user's image path to the newly uploaded file name
userUpdate.setImg(newFileName);
userUpdate.setUsername(userPageRequestDto.getUsername());
userRepository.save(userUpdate);
// Return the updated user object
return ResponseEntity.ok(userUpdate);
// StringUtils 클래스를 사용하여 업로드 된 파일의 파일 이름을 정리 및 불필요한 문자나 피알 경로 정보 제거
}