RequestDto
public record PostCreateRequestDto(
Category category,
@Size(max = 50, message = "제목은 최소 1자 이상, 최대 50자 까지 입력 할 수 있습니다.")
@NotBlank(message = "제목은 필수 입력란입니다.")
String title,
@Size(max = 1000, message = "글 내용은 최소 1자 이상, 최대 1000자 까지 입력 할 수 있습니다.")
@NotBlank(message = "글 내용은 필수 입력란입니다.")
String content,
List<MultipartFile> imageUrlList
) {
}
PostService
public Long createPost(Long memberId, PostCreateRequestDto requestDto) {
Member member = getMember(memberId);
imageUrlListSizeCheck(requestDto);
List<String> imageUrlList = s3ImageServiceImplV1.saveImageUrlList(
requestDto.imageUrlList());
Map<Integer, Object> imageUrlMap = new HashMap<>(); // json 형식으로 저장 하기 위한 Map
for (int i = 0; i < imageUrlList.size(); i++) {
imageUrlMap.put(i, imageUrlList.get(i));
}
Post post = PostMapper.createPost(requestDto, imageUrlMap, member);
postRepository.save(post);
return post.getId();
}
private void imageUrlListSizeCheck(PostCreateRequestDto requestDto) {
if (requestDto.imageUrlList().size() < PostConstant.IMAGE_MIN_SIZE) {
throw new BusinessException(ErrorCode.POST_IMAGE_MIN_SIZE);
}
if (requestDto.imageUrlList().get(0).isEmpty()) {
throw new BusinessException(ErrorCode.POST_IMAGE_MIN_SIZE);
} // html input으로 submit 했을 때 input이 비어있으면 ""이라는 빈 문자열로 자동 업로드 된다.
// 그래서 이걸 방지하기 위해 위 if문 추가
if (requestDto.imageUrlList().size() > PostConstant.IMAGE_MAX_SIZE) {
throw new BusinessException(ErrorCode.POST_IMAGE_MAX_SIZE);
}
}
S3Service
public List<String> saveImageUrlList(List<MultipartFile> multipartFileList) {
List<String> imageUrlList = new ArrayList<>();
for(MultipartFile multipartFile : multipartFileList) {
if(!multipartFile.getContentType().startsWith("image")) {
throw new BusinessException(ErrorCode.IS_NOT_IMAGE);
}
}
for(MultipartFile multipartFile : multipartFileList) {
String uuidName = UUID.randomUUID().toString();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());
try {
amazonS3.putObject(bucket, uuidName, multipartFile.getInputStream(), metadata);
} catch (Exception e) {
throw new BusinessException(ErrorCode.FAIL_UPLOAD);
}
imageUrlList.add(amazonS3.getUrl(bucket, uuidName).toString());
}
return imageUrlList;
}
S3 버킷에서 동일한 이미지 이름이 들어왔을 때 위에다 덮어씌어버려서 파일 이름을 UUID로 생성하게끔 했다.
json 저장 하는 법, S3 사용법 등은 나중에 글 수정으로 자세히 적어놓겠습니다... 지금은 새벽 2시 30분ㅋ 2시 20분까지 작업하니 힘드네요 허허
'TIL' 카테고리의 다른 글
TIL 2024-01-10 AWS S3 객체 삭제~~ (0) | 2024.01.11 |
---|---|
TIL 2024-01-09 쿼리최적화란 (0) | 2024.01.10 |
TIL 2024-01-07 엔티티에서 Dto 종속성을 갖게 하는 게 맞을까? (2) | 2024.01.07 |
TIL 2024-01-05 cicd는 왜 생겼을까 (0) | 2024.01.06 |
TIL 2024-01-04 SQL에 배열을 어떻게 저장할까? (0) | 2024.01.05 |