[그룹웨어] 공통 기능 만들기 (파일 업로드)

yihyun·2024년 12월 14일

ERP 개발 프로젝트

목록 보기
7/11

파일을 업로드 할 때에는 기본 파일명, 확장자, 새로운 파일명이 필수로 필요하다.

하지만 연결하는 DB는 다를 수 있기 때문에 변환하는 내용만 공통 기능으로 작성해두었다.

파일 업로드 util 클래스

    public static List<FileDTO> uploadFiles(MultipartFile[] files){
    	
    	if(files == null || files.length == 0) {
    		throw new IllegalArgumentException("업로드된 파일이 없습니다.");
    	}
    	
    	List<FileDTO> results = new ArrayList<FileDTO>();
    	
    	for (MultipartFile file : files) {
			String ori_filename = file.getOriginalFilename();
			String type = ori_filename.substring(ori_filename.lastIndexOf("."));
			String new_filename =  UUID.randomUUID().toString() + type;
			
			try {
				Path path = Paths.get("C:/upload/", new_filename);
				Files.write(path, file.getBytes());
				
				results.add(new FileDTO(ori_filename, new_filename, type));
			} catch (IOException e) {
				throw new RuntimeException("파일 저장 중 오류 발생: " + new_filename, e);
			}	
		}
    	return results;
    }
  • 파일은 복수개가 들어올 수 있기 때문에 for문을 사용해 List에 결과를 담아준다.
  • FileDTO를 사용해 원 파일명, 뉴 파일명, 확장자를 저장해준다.
  • 저장한 List를 return 해준다.

이후 값을 받아 그대로 사용하거나 추가 데이터가 있을 경우 값을 추가해 사용해주면 된다.

사용 예시
controller

	@PostMapping(value="/fileWrite")
	public ResponseEntity<ResponseDTO<List<FileDTO>>> uploadFiles(@RequestParam("files") MultipartFile[] files) {
        try {
            // 1. 서비스 호출
            ResponseDTO<List<FileDTO>> response = service.saveFiles(files);

            // 2. 성공 응답 반환
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            // 3. 에러 발생 시 실패 응답 반환
            ResponseDTO<List<FileDTO>> errorResponse = new ResponseDTO<>(500, "파일 업로드 중 오류 발생: " + e.getMessage(), null);
            return ResponseEntity.status(500).body(errorResponse);
        }
    }

service

    public ResponseDTO<List<FileDTO>> saveFiles(MultipartFile[] files) {
        // 1. 유틸리티 클래스에서 파일 리스트 생성
        List<FileDTO> fileDtos = CommonUtil.uploadFiles(files);

        // 2. DB 저장
        int insertedRows = testDao.fileWrite(fileDtos);
        if (insertedRows != fileDtos.size()) {
            throw new RuntimeException("일부 파일 저장 실패");
        }

        // 3. 성공 응답 생성
        return new ResponseDTO<>(200, "파일 업로드 성공", fileDtos);
	}

mapper

	<insert id="fileWrite" parameterType="list">
	    INSERT INTO filetest (ori_filename, new_filename, type)
	    VALUES
	    <foreach collection="list" item="file" separator=",">
	        (#{file.ori_filename}, #{file.new_filename}, #{file.type})
	    </foreach>
	</insert>

여러개의 값이 들어올 수 있기 때문에 foreach를 사용해준다.

❗ 여러개의 값이 들어올 경우 어떻게 처리해야 하는지를 고민하다가
쿼리문을 반복해서 넣어주는 것으로 결정했다!

이렇게 공통 코드를 줄이고 추후 개발에 사용할 수 있는 파일 업로드 기능을 개발해보았다!

profile
개발자가 되어보자

0개의 댓글