Stack Trace란?
● 프로그램이 예외를 던질 때 예외가 어디서 발생했고, 어떤 경로를 거쳐 호출되었는지 알려주는 로그 정보
● 어떤 메서드에서 예외가 발생했고 그 메서드를 누가 호출 했는지 계속 따라가는 호출 경로
● 최근 → 과거 호출 순서대로 쌓인다.
[Test worker] ERROR c.f.d.j.exception.basic.CheckedTest --
Internal Server Error
java.sql.SQLException: db error
at com.futuregoing.dbaccessv1.jdbc.exception.basic.CheckedTest$Repository.call(CheckedTest.java:31)
at com.futuregoing.dbaccessv1.jdbc.exception.basic.CheckedTest$Service.call(CheckedTest.java:22)
at com.futuregoing.dbaccessv1.jdbc.exception.basic.CheckedTest.test(CheckedTest.java:37)
실무에서 Stack Trace 없이 올라온 예외 때문에 디버깅 할 때 고생하는 경우가 많다.
[ERROR] Internal Server Error
● 이처럼 에러 메세지만 있고 발생 위치, 원인 등이 없다.
왜 이런 일이 발생할까?
● 원인은 예외를 전환할 때 기존 예외를 포함하지 않았기 때문이다.
● 기존 예외를 포함하지 않으면, 오류가 발생한 후 로그에 진짜 원인이 남지 않아 심각한 문제가 발생한다.
try {
Repository.call();
} catch (SQLException e) {
throw new SQLRuntimeException("Internal Server Error");
}
● 예외를 전환할 때는 반드시 기존 예외를 포함해야 스택 트레이스를 확인할 수 있다.
catch (SQLException e) {
throw new SQLRuntimeException("Internal Server Error", e);
}
static class SQLRuntimeException extends RuntimeException {
public SQLRuntimeException(String message, Throwable cause) {
super(message, cause);
}
}
● 로그를 출력할 때도 마찬가지로, 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.
try {
Repository.call();
} catch (SQLException e) {
log.error("Internal Server Error", e);
}
e.printStackTrace()를 사용하면 어떨까?
● e.printStackTrace()는 System.out에 스택 트레이스를 출력한다.
● 실무에서는 로그를 사용 하는 것이 좋다.
'java > basic' 카테고리의 다른 글
자바 예외 이해하기 (체크 예외, 런타임 예외) (1) | 2025.06.09 |
---|---|
자바 메모리 구조 (스택, 힙, 메서드 ...) (0) | 2024.05.05 |
생성자 (0) | 2024.04.13 |
자바 클래스, 객체, 인스턴스 (0) | 2024.03.31 |