티스토리 뷰
최근에 성능 개선을 하면서 dead code를 발견했는데 처음엔 왜 dead code인지 모르겠다가 원인을 찾았다. 아래는 내가 발견했던 코드를 최대한 단순화해서 표현한 예시이다.
MultipartFile excelFile = request.getFile("excelFile");
List<Map<String, String>> excelContent = null;
...
try {
// 파일 업로드 작업
} catch (IOException e) {
LOGGER.error("excel file error {}", e.getMessage());
if (excelFile != null) {
excelFile = null;
}
if (excelContent != null) {
excelContent.clear(); // 이 부분이 dead code!
}
excelContent = null;
} finally {
...
if (excelFile != null) {
excelFile = null;
}
if (excelContent != null) {
excelContent.clear();
}
excelContent = null;
}
위 코드에 표시한 부분이 dead code로 나왔는데, 원인은 간단했다. try문 내부에 IOException이 발생할 수 있는 부분이 두 부분이 있었다. 이 중 첫번째 IOException이 발생할 당시에 excelContent가 null이기 때문에 if (excelContent != null) 이 무조건 실행되지 않는 부분이었기 때문이다. 같은 로직의 excelFile부분은 dead code로 잡히지 않은 이유는 null이 아니기 때문이다. 그렇다면 finally에서 같은 처리를 해주는데 여기는 왜 dead code가 아닌가 생각했는데, IOException이 발생하지 않고 코드가 정상적으로 수행되는 경우는 excelContent가 null이 아니기 때문이다. 그래서 finally문을 실행할 때 if (excelContent != null) 이 부분에 들어갈 수도 있다.
여기에서 더 나아가 사실 에러가 발생하면 try - catch - finally 순서로 가기 때문에 excelFile과 excelContent를 초기화해주는 코드를 catch문과 finally문에 저렇게 중복해서 넣을 필요가 없다. 그래서 아래와 같은 코드로 변경하는 것이 낫겠다.
MultipartFile excelFile = request.getFile("excelFile");
List<Map<String, String>> excelContent = null;
...
try {
// 파일 업로드 작업
} catch (IOException e) {
LOGGER.error("excel file error {}", e.getMessage());
} finally {
...
if (excelFile != null) {
excelFile = null;
}
if (excelContent != null) {
excelContent.clear();
}
excelContent = null;
}
try-catch-finally문을 조금 기계적으로 생각하고 있었는데, 이렇게 dead code나 쓸데없이 중복되는 코드가 나오지 않도록 코드를 꼼꼼히 작성해야겠다고 생각했다.
'공부흔적 > 자바' 카테고리의 다른 글
형태는 같지만 사실 다른 메서드를 사용하는 메서드 참조 (0) | 2022.03.31 |
---|---|
Logback 설정에 관하여 (0) | 2022.02.23 |
자바의 GC(Garbage Collection) (0) | 2021.12.07 |
API 응답 Json 객체로 받기 (0) | 2021.09.07 |
FileOutputStream의 close와 flush (0) | 2021.08.07 |