본문 바로가기
java/basic

스택 트레이스와 예외 포함의 중요성

by cactuslog 2025. 6. 10.

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에 스택 트레이스를 출력한다.

 

●  실무에서는 로그를 사용 하는 것이 좋다.