[Spring] List<MultipartFile> null 체크할 때 주의할 점

Walter Mitty·2023년 6월 14일
0

상황

자주 묻는 질문(이하 게시판)에서 글 등록시, 그냥 제목이랑 내용만 등록하면 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);
        }
    }
}

짜란~~~

0개의 댓글