1. 문제 해석
csv 파일을 불러와 vue에 모달창으로 사용해야 하는 업무가 있었습니다.
회사 관련 코드이기에 자세하게 알려줄 수 없으나, 코드는 다음과 같습니다.
upload.java
public class Controller {
@PostMapping("/test")
public SingleResponse<Object> upload(MultipartFile file) {
try {
csvService.saveCsv(file);
return responseService.createResponse(true);
} catch (Exception e) {
return responseService.createResponse(e.toString())
}
}
}
CsvService.java
public void saveDataFromCSV(file) throw Exception {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream(), "euc-kr"))) {
// 첫 번쨰 라인은 무시
String line = reader.readLine();
int metaTableSeq = 0;
int count = 1;
ArrayList<String> A = new ArrayList<>();
ArrayList<String> B = new ArrayList<>();
ArrayList<String> C = new ArrayList<>();
try {
while((line = reader.readLine()) != null) {
try {
// csv 파일이기에 쉼표(,)로 구분해서 불러오기
HashMap<String, Object> aMap = new HashMap<String, Object>();
aMap.put("a", values[column++]);
aMap.put("b", values[column++]);
aMap.put("c", values[column++]);
String aa = (String) aMap.get("a");
String bb = (String) aMap.get("b");
String cc = (String) aMap.get("c");
if (aa == null) {
throw new Exception();
} else {
A.add(aa);
B.add(bb);
C.add(cc);
}
} catch (Exception e) {
log.error("{}", line, e.toString());
throw e;
}
}
for (int i = 0; i < count; i++) {
HashMap<String, Object> bMap = new HashMap<String, Object>();
bMap.put("a", aa);
bMap.put("b", bb);
bMap.put("c", cc);
abc.insert_set_list(bMap);
}
} catch (Exception e) {
log.error("{}", line, e.toString());
throw e;
}
}
}
여기서 저는 열의 값을 읽어오다가 오류가 발생하였을 때, 모달 창에 `${count}번 째 열에 오류가 발생했습니다.` 라는 느낌으로 제작하고 싶었어요.
2. 해결 시도
그래서 처음엔 java 코드에 alert를 넣어 알림창이 뜨게 끔 해보기로 했습니다.
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<script language='javascript'>');
out.println("alert('알림창')");
out.println("</script>");
out.flush();
하지만 이 방법은 어째서 인지 반응을 하지 않았습니다..
JOptionPane나 Alert의 방법은 제가 원하는 방식과 거리가 멀기에 이 두가지는 시도하지 않았습니다.
3. 해결 방법
그래서 제가 생각한 방법은 count라는 변수를 vue 파일에서 사용할 수 있게끔 하는 것입니다!
처음에 변수를 불러오는 것이 쉽지 않았으나 드디어 방법을 찾았습니다.
#1. count를 오류 발생 시, throw new Exception()에 넣습니다.
count 변수는 int 자료형이기에 valueOf()를 사용해서 String 자료형으로 변환해 주었습니다.
이렇게 하면, 예외 처리로 count가 upload 파일로 넘어가게 됩니다.
throw new Exception(String.valueOf(count));
#2. 넘어간 e는 upload 메서드의 예외처리인 responseService.createSingleResponse(e.toString());에 담기게 됩니다.
이 것은 자세히 말 못하지만, response의 result로 넘어가게 됩니다.
#3. vue 파일에서 다음과 같이 입력하여 이를 불러와 줍니다.
try {
await axios.post(`${...}/upload`, formData, {
// ...
})
.then(response => {
this.errorCol = response.data.result;
})
this.$alert(`${this.errorCol}번 째 행이 잘못 입력되었습니다.`}
하지만, result의 값이 java.language.Exception: 3으로 출력되어 java.language.Exception: 3번 째 행이 잘못 입력되었습니다. 라고 출력이 되네요..
그렇기에 저는 replace를 이용하여 replace(/\D/g, '')라고 입력해, 문제를 해결하였습니다.
이렇게 하면 문자열을 제외한 숫자만을 출력하게 됩니다.
그러면 정상적으로 3번 째 행이 잘못 입력되었습니다. 라고 나오게 됩니다!
이 문제만 해결하는데 3일 정도 걸린 것 같네요..
'Programming Language > Java' 카테고리의 다른 글
암호화 및 복호화 모듈 - 대칭 키 암호화 (0) | 2024.09.03 |
---|---|
try-with-resources (0) | 2024.08.02 |
BuffredReader - 엑셀 불러오기 (3) | 2024.07.23 |
네트워크(Network) (0) | 2022.07.25 |
IO (Input / Output) (입출력) 스트림 (0) | 2022.07.21 |