자주 묻는 질문(이하 게시판)에서 글 등록시, 그냥 제목이랑 내용만 등록하면 faqRepo.save()만 진행하고, 만약에 List<MultipartFile>
에 파일이 하나라도 존재한다면 = 빈 리스트가 아니라면 S3에도 업로드하면서 DB에 있는 FaqImage 테이블에도 업로드가 되는 로직이었다.
FaqApplicationService
- save 메서드
@Transactional(rollbackFor = Exception.class) public void saveFaq(FaqRegistRequest request, List<MultipartFile> files) throws NotFoundDataException, UnauthorizedException, IOException, NoSuchAlgorithmException, InvalidKeyException { // 관리자 확인 Integer adminId = systemLogApplicationService.getServletRequestLoginAdminInfo().getUserAdminId(); if(request.getFaqId() == null) { //등록 Faq faqSave = Faq.builder() .adminId(adminId) .faqTitle(request.getFaqTitle()) .faqContent(request.getFaqContent()) .build(); faqJpaRepository.save(faqSave); if(files.size() != 0) { fileUpload(faqSave, files); } } }
- S3 업로드 & DB에 저장
private void fileUpload(Faq faq, List<MultipartFile> files) throws IOException, NoSuchAlgorithmException, InvalidKeyException { if(files.size() >= 6) throw new BadRequestException("파일은 최대 5개까지만 첨부 가능합니다."); int sort = 0; for(MultipartFile file : files) { String uploadPath = "faqImage/" + faq.getFaqId(); FileInfoDTO fileInfoDTO = FileUtil.getFileInfoDTO(file, uploadPath); if(fileInfoDTO != null) { String fileUrl = awss3Service.upload(file.getBytes(), fileInfoDTO.getPath(), fileInfoDTO.getContentType()); FaqImage faqImageSave = FaqImage.builder() .faq(faq) .faqFileOriginName(fileInfoDTO.getOriginFileName()) .faqFileUrl(fileUrl) .sort(sort + 1) .build(); faqImageJpaRepository.save(faqImageSave); sort++; } } }
이렇게 해서 포스트맨에서 files를 빼놓고 테스트를 진행했는데,
NullPointerException
에러가 발생했다! 오랜만 ㅎ
혹시나 해서 코드를 한부분 바꿔봤는데, 잘 동작했다
문제는
- save
if(files.size() != 0) { // 이부분 이었다! fileUpload(faqSave, files); }
여기서 List의 size가 0인걸 비교하는게 아니라 CollectionUtils.isEmpty()
을 사용해서 확인을 했어야했다.
따라서
FaqApplicationService
- save 메서드
@Transactional(rollbackFor = Exception.class) public void saveFaq(FaqRegistRequest request, List<MultipartFile> files) throws NotFoundDataException, UnauthorizedException, IOException, NoSuchAlgorithmException, InvalidKeyException { // 관리자 확인 Integer adminId = systemLogApplicationService.getServletRequestLoginAdminInfo().getUserAdminId(); if(request.getFaqId() == null) { //등록 Faq faqSave = Faq.builder() .adminId(adminId) .faqTitle(request.getFaqTitle()) .faqContent(request.getFaqContent()) .build(); faqJpaRepository.save(faqSave); if(!CollectionUtils.isEmpty(files)) { fileUpload(faqSave, files); } } }
짜란~~~