- 이전시간까지는 서버에 이미지를 업로드 해보았고 이번에는 데이터베이스에 이미지를 저장해보려고 합니다.
📝 Service
- 우선 이전 시간에 작성했던
upload()
함수에 코드를 추가해주었습니다.
package com.cos.photogram.service;
...
@RequiredArgsConstructor
@Service
public class ImageService {
private final ImageRepository imageRepository;
@Value("${file.path}")
private String uploadFolder;
public void upload(ImageUploadDto imageUploadDto, PrincipalDetails principalDetails) {
UUID uuid = UUID.randomUUID();
String imageFileName = uuid + "_" + imageUploadDto.getFile().getOriginalFilename();
Path imageFilePath = Paths.get(uploadFolder + imageFileName);
try {
Files.write(imageFilePath, imageUploadDto.getFile().getBytes());
} catch(Exception e) {
e.printStackTrace();
}
//추가된 부분
Image image = imageUploadDto.toEntity(principalDetails.getUser(), imageFileName);
imageRepository.save(image);
}
}
Image
객체를 생성하여 데이터베이스에 저장하고 있으며, 이를 위해서 DTO에toEntity()
함수를 따로 구현해주었습니다.
package com.cos.photogram.web.dto.image;
...
@Data
public class ImageUploadDto {
private MultipartFile file;
private String caption;
public Image toEntity(User user, String post_image_url) {
return Image.builder()
.user(user)
.post_image_url(post_image_url)
.caption(caption)
.build();
}
}
📝 Controller
- 컨트롤러 단에서는 분기를 통해 간단한 유효성 검사를 실시하였습니다.
package com.cos.photogram.web;
...
@RequiredArgsConstructor
@Controller
public class ImageController {
...
@PostMapping("/image")
public String imageUpload(ImageUploadDto imageUploadDto, @AuthenticationPrincipal PrincipalDetails principalDetails) {
if(imageUploadDto.getFile().isEmpty()) {
throw new CustomValidationException("이미지가 첨부되지 않았습니다.", null);
}
imageService.upload(imageUploadDto, principalDetails);
return "redirect:/user/" + principalDetails.getUser().getId();
}
}
@Valid
어노테이션을 사용하지 않은 이유는 현재 View 단에서 데이터를 받아오는 방식이multipart/form-data
타입이므로@NotBlank
와 같은 Validation 어노테이션이 지원되지 않기 때문입니다.
📝 Exception Handler
- 위의 예외처리 구문을 보면
CustomValidationException
의 매개변수로message
만 보내고ErrorMap
은null
값을 보내고 있습니다. 따라서 Exception Handler 또한 조금의 수정이 필요하였습니다.
package com.cos.photogram.handler;
...
@RestController
@ControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(CustomValidationException.class)
public String validationException(CustomValidationException e) {
if(e.getErorrMap() == null) {
return Script.back(e.getMessage());
} else {
return Script.back(e.getErorrMap().toString());
}
}
...
}
- 위 처럼 분기시키지 않으면 NPE가 발생합니다.
📝 Result
- 이후 결과를 살펴보면 이미지 파일을 첨부하지 않을 경우 사용자에게 메시지가 보여지면서 다시 이미지 업로드 페이지로 돌아가게 되며, 정상적으로 이미지 파일을 첨부할 경우 데이터베이스에 이미지 객체가 저장되는 것을 확인할 수 있습니다.
'🚗 Backend Toy Project > Photogram' 카테고리의 다른 글
[Photogram] 구독하기 - 뷰 렌더링 (0) | 2022.07.12 |
---|---|
[Photogram] 프로필 페이지 - 뷰 렌더링 (0) | 2022.07.11 |
[Photogram] 프로필 페이지 - 서버에 이미지 업로드 (0) | 2022.07.10 |
[Photogram] 구독하기 (0) | 2022.07.10 |
[Photogram] 회원정보 수정 (0) | 2022.07.09 |