티스토리 뷰

공부흔적/자바

dead code 원인 찾기

주디 𝙹𝚞𝚍𝚢 2022. 1. 18. 10:45

 최근에 성능 개선을 하면서 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나 쓸데없이 중복되는 코드가 나오지 않도록 코드를 꼼꼼히 작성해야겠다고 생각했다.

300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함