csv 파일 선택 후 디비에 저장하기까지

jinvicky·2023년 9월 12일
0

Spring & Java

목록 보기
2/23

쿠폰 csv 파일을 읽어서 쿠폰 저장하기

csv의 형식은 단순히 구분자 없이 개행처리만 되어 있다고 가정했다.
먼저 엑셀에 테스트용 .csv 파일을 2개 정도 만든다.

jsp에서 form을 만들어서 여러 개의 파일을 선택받도록 한다.

<form ~ enctype="multipart/form-data">
  ...
  <input name="attach" type="file" multiple>
  <button type="submit">upload</button>
</form>

controller에서는 Multipart[]로 받는다.
인터넷을 보니 file객체들이 안 올 경우 @RequestParam 붙이라는 경우도 있었다.
처음 시도할 때 수정된 부트스트랩을 가져다 썼었는데 파일 정보가 안 들어왔었다. file.getOriginalName() 등을 통해서 파일 정보를 확인하고 제대로 들어오는 지 체크가 필요하다.

이제 받아온 MultipartFile[]을 BufferReader로 한 줄씩 읽는다.
readCsv() 메서드로 처리했다.

private List<String> readCsv(MultipartFile[] attach) throws IOException {
        List<String> csvList = new ArrayList<String>();

        for (MultipartFile file : attach) {
            try {
//                FileReader reader = new FileReader("C:\\Users\\jinvi\\Downloads\\csvtest.csv"); // 이슈 : fileName을 못 가져온다.
                BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream()));
                String line;
                while ((line = br.readLine()) != null)
                    csvList.add(line);

                br.close();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        return csvList;
    }

파일을 받아오는 게 자꾸 실패해서 처음엔 컴퓨터 내부 csv 파일 경로를 복사해서 FileReader() 객체로 하드코딩해서 테스트를 먼저 했다.
FileReader() 또는 MultipartFile의 .getInputStream()을 이용할 수 있다.

다음으로 선택한 파일이 csv 형식인지 확인하는 작업이 필요하다.
img를 선택해서 한줄씩 읽기라도 하면 디비에 들어가는 데 오류가 생긴다(데이터 길이, 애초에 들어가면 안되는 값임)

public static boolean isCSVFile(String fileName) {
        String CSV_FILE_REGEX = "^.+\\.csv$";
        Pattern pattern = Pattern.compile(CSV_FILE_REGEX, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(fileName);
        return matcher.matches();
    }

최종적으로 controller에서 지정한 /read/csv 경로에서 호출한다.

@PostMapping("/read/csv")
    public void addCoupList(@RequestParam MultipartFile[] attach, @RequestParam String idOpt, HttpServletResponse response) throws IOException {
        for (MultipartFile file : attach) {
            if (!isCSVFile(file.getOriginalFilename())) {
                ScriptUT.moveBack(response, "csv 형식이 아닌 파일이 존재합니다.");
                return;
            }
        }
        try {
            List<String> csvList = readCsv(attach);
            if (csvList == null) throw new Error("csv is null or reading error");

            for (String coupon : csvList) {
                if (service.add(idOpt, coupon) != 1) throw new Error("csv coupon insert error");
            }
            ScriptUT.moveRedirect(response, "쿠폰 추가 완료", "/modu/coupon/list?opt_id=" + idOpt);

        } catch (Exception e) {
            e.printStackTrace();
            ScriptUT.moveBack(response, "쿠폰 추가 실패");
        }
    }

쿠폰 ID는 난수를 생성해서 저장하고, 옵션아이디와 쿠폰 코드를 같이 받아서 저장했다.
최종적으로 쿠폰 코드 컬럼에 한줄씩 저장된 것을 확인할 수 있다.

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글