Java 코드를 작성하던 중, printStackTrace()
에 노란색 경고 줄이 생기는 것을 발견했습니다. 단순히 예외 정보를 콘솔에 출력하는 방식은 실제 서비스 코드에 적절하지 않다는 것을 의미하는 경고였습니다. 이에 따라 로깅 프레임워크를 적용하여 문제를 개선한 과정을 정리해 보았습니다.
문제 상황
다음은 기존 코드입니다:
HashMap<String, Object> thresholds = new HashMap<>();
try {
thresholds = getThresholds();
} catch (Exception e) {
e.printStackTrace(); // 여기서 경고 발생
}
이 코드는 getThresholds()
메서드에서 예외가 발생할 경우 콘솔에 에러 스택을 그대로 출력합니다. 이는 개발 단계에서는 유용할 수 있지만, 실제 운영 환경에서는 로그 파일 관리, 보안, 성능 측면에서 좋지 않은 방식입니다.
경고 원인
printStackTrace()
는 예외 정보를 표준 출력으로 직접 내보냅니다. 이는 다음과 같은 문제를 유발할 수 있습니다:
- 로그 레벨 구분 불가 (
info
,warn
,error
등) - 파일 저장 및 외부 연동이 불가능
- 운영환경에서는 출력이 누락되거나 로그 관리가 어려움
해결 방법: 로깅 프레임워크 사용
Java에서는 SLF4J, Logback, Log4j2 등의 로깅 프레임워크를 사용하는 것이 일반적인 관례입니다. 이 중에서 가장 보편적인 SLF4J를 적용하는 방식으로 코드를 리팩토링했습니다.
1. SLF4J 의존성 추가 (Maven 기준)
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
2. 로거 선언 및 사용
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ThresholdProcessor {
private static final Logger logger = LoggerFactory.getLogger(ThresholdProcessor.class);
public void process() {
HashMap<String, Object> thresholds = new HashMap<>();
try {
thresholds = getThresholds();
} catch (Exception e) {
logger.error("Failed to get thresholds", e); // 예외 로그 출력
}
if (thresholds.containsKey("health_index_threshold")) {
double health_index_threshold = (double) thresholds.get("health_index_threshold");
// 이후 처리...
}
}
}
이제 로그는 콘솔뿐 아니라 파일, 외부 로깅 시스템 등으로도 출력이 가능하며, 로그 레벨에 따라 관리가 수월해졌습니다.
마무리
예외 처리를 할 때 단순히 printStackTrace()
를 사용하는 것보다는, 로깅 프레임워크를 통해 체계적으로 로그를 남기는 것이 훨씬 바람직합니다. SLF4J를 사용하면 유지보수성과 가독성, 확장성을 모두 확보할 수 있습니다.
핵심 요약
printStackTrace()
는 개발용 콘솔 출력일 뿐, 운영용 코드에는 부적합- SLF4J 같은 로깅 프레임워크로 대체 필요
logger.error("메시지", 예외);
형식을 활용하여 로그 출력
반응형