PART 1. 에서 이어가도록 하겠습니다.
2022.09.28 - [개발 일지] - [개발일지] 오류를 해결하기 위한 과정 PART 1.
오류가 IndexOfOutBoundException 에러라는 것까지 확인을 했습니다. 그런데 왜 로그가 찍히지 않았던 걸까요? 원인 없는 결과는 없죠. 소스를 확인해 봤습니다.
위 코드를 보면 throws로 예외를 던지고 있습니다. 이클립스 IDE에서 search 기능으로 해당 메서드를 검색해서 호출하는 소스 코드를 찾았습니다.
위 코드에서 @Scheduled 어노테이션은 Spring 스케줄러입니다. 즉, 예외처리를 throws로 던지기만 하고 try~catch로 따로 처리하지 않았네요. 로그라도 찍어줬으면 앞의 수고를 덜 수 있었을 텐데, 덕분에 로그 파일에서도 오류를 확인할 수 없었던 것이었습니다.
개발을 하다보면 예외처리에 대한 고민을 하게 됩니다. 예외처리에 대한 명확한 프로세스가 정의되어 있다면 수월할 텐데, 그렇지 않은 프로세스도 있습니다. 단순히 메서드에서 throws로 던진다고 해결되는 것이 아닌, 호출 단에서 try~catch로 오류 로그라도 찍어주어야 유지 보수하는 데에 수월합니다.
제가 지금 보고 있는 소스코드는 Spring으로 구현되어 있습니다. Spring에서는 @ExceptionHandler 를 제공하고 있는데요. 프로젝트에서 Exception을 잡아서 공통으로 처리하고 있는지도 체크해야 합니다. 이 프로젝트에서는 공통으로 처리하고 있지 않네요.
참고 사이트로 예외처리에 대한 설명을 첨부합니다. 참고하시기 바랍니다.
07-04 예외처리 (Exception)
프로그램을 만들다 보면 수없이 많은 오류가 발생한다. 물론 오류가 발생하는 이유는 프로그램이 오동작을 하지 않기 하기 위한 자바의 배려이다. 하지만 때로는 이러한 오류를 무 ...
wikidocs.net
로그 라이브러리로 log4j를 많이 쓰죠. 해당 공식 사이트도 참고하시면 구현에 많은 도움이 되실 것입니다.
https://logging.apache.org/log4j/2.x/
Log4j – Apache Log4j 2
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apa
logging.apache.org
오류를 확인했습니다. IndexOutOfBoundException이네요. 소스 코드를 확인하겠습니다.
// 상단 생략
String accEnv = "keyName";
double[] preInput = new double[week+idx];
for(int k=0; k<week+idx; k++){
Map<String, Object> tmp;
if(k < accList.size()){
tmp = accList.get(k);
preInput[k] = Double.parseDouble(tmp.get(accEnv).toString());
} else {
// 이하 생략
}
}
오류가 난 부분의 소스코드입니다. week+idx (상단에 해당값이 할당되어 있습니다) 값과 accList (ArrayList)의 size가 동일하다는 전제로 코드가 구현이 되어 있네요.
하지만 ArrayList.size()가 10이고 week+idx가 8이라면 리스트로 선언된 length 보다 높은 인덱스에 데이터를 삽입하려 할 것이므로 IndexOutOfBoundException이 발생하는 것이었습니다.
double[] preInput = new double[8];
preInput[9] = 0.2; // length보다 높은 인덱스에 삽입하려고 하므로 오류
IndexOutOfBoundException은 리스트에서 인덱스 범위를 벗어난 값을 호출하려 하거나 삽입하려고 할 때 발생합니다.
원인을 찾았네요. 요청자에게 해당 내용을 공유해야 하겠습니다.
해당 내용을 요청자에게 공유했습니다. 어떻게 정상화할지 협의하기 시작했습니다. 하지만 상황 상, 소스 수정을 해서 배포를 하기에는 어려울 것으로 보입니다. 위의 week 값을 확인해보니 DB에서 데이터로 저장되어 있는데, 데이터를 확인해봐야겠네요. DataGrip으로 DB에 접속해봤습니다.
실무자에게 데이터를 수정한 이력이 있는지 확인했습니다. 실제 이 웹 어플리케이션을 활용하고 있는 실무자가 일부 데이터를 삭제했다고 하네요. 덕분에 데이터가 틀어져서 위의 오류가 발생했고, 차트에 데이터를 내려주지 못해 화면에도 오류가 발생한 것이었습니다.
대략 5~6개의 rows가 빠졌네요. 실무자와 협의를 통해 삭제한 데이터를 다시 추가하기로 했습니다.
JetBrain사의 DataGrip에서는 위 그림의 '+'버튼(캡쳐한 그림 상단)을 클릭하여 테이블에 간단하게 Row를 추가할 수 있습니다.
마침 제가 DataGrip을 사용하고 있지만 대부분의 DB Tool들은 이러한 기능을 지원합니다. 많은 rows들을 반영해야 해서 쿼리를 활용하지 않는 경우에는 간단하게 추가/삭제를 할 수 있습니다.
데이터를 추가하고 UI를 확인해 봤습니다. 정상으로 화면이 출력됩니다.
해결되었네요. 이 프로젝트는 앞으로 마이그레이션 일정이 있다고 하니, 해당 내용들을 담당자와 공유할 수 있도록 문서작업을 해야겠습니다.
잠깐 오류해결 과정에서 체크사항을 정리해보겠습니다.
위 항목들을 잘 지켰으면 오류가 났어도 찾기 쉬웟을 겁니다. 습관을 잘 들이면 개발과 유지보수가 편해집니다.
이상입니다. 저의 경험이 여러분에게 도움이 되셨길 바랍니다. 감사합니다.
[개발일지] 웹 애플리케이션 다국어 처리가 안되는 문제. Spring 자바에서 다국어 처리하기 (0) | 2022.11.24 |
---|---|
[개발일지] nodejs로 API 서버 만들기 PART. 2 (0) | 2022.10.28 |
[개발일지] nodejs로 API 서버 만들기 PART. 1 (0) | 2022.10.14 |
[개발일지] 화면 기능 개발하기 (1) | 2022.10.05 |
[개발일지] 오류를 해결하기 위한 과정 PART 1. (0) | 2022.09.28 |
댓글 영역