특정 메소드를 여러 곳에서 호출하여 사용하는 경우가 많이 있다. 디버깅을 하고 싶은데 intellij에서 디버깅을 하면 호출하는 곳이 많아서 많아서 파악하기 힘들고 로그로 출력하여 확인하고 싶은 경우가 있다.
예를 들면 register를 호출하는 메소드가 여러군데가 있다고 하자. 디버깅을 통해 확인하면 되지만 호출하는 곳이 많이 있다면 보기가 힘들 것이다.
public void register(User user) {
userRepository.save(new UserJpo(user));
}
그래서 호출되는 StackTrace를 로그로 출력하는 방법을 아래와 같이 하면 쉽게 확인할 수 있다.
public void register(User user) {
userRepository.save(new UserJpo(user));
StackTraceUtil.printCaller(); // 출력하고 싶은 곳에 해당 로직을 추가
}
로그에서 아래와 같이 표시된다.
2023-01-08 21:02:13.017 INFO 16060 --- [nio-8080-exec-1] com.example.share.util.StackTraceUtil :
########################### caller stackTrace ###########################
com.example.service.UserService#register:33
com.example.controller.UserController#register:23
#################################################################
[StackTraceUtil 소스]
@Slf4j
public class StackTraceUtil {
private static final String START_PACKAGE = "com.example"; // 출력할 패키지
public static void printCaller() {
List<String> elements = new ArrayList<>();
StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();
for (int i=2; i<stackTraces.length; i++) {
StackTraceElement stackTrace = stackTraces[i];
if (stackTrace.getClassName().startsWith(START_PACKAGE) && stackTrace.getLineNumber() > 0) {
String caller = stackTrace.getClassName() + "#" + stackTrace.getMethodName() + ":" + stackTrace.getLineNumber();
elements.add(caller);
}
}
if (elements.size() > 0) {
String stackTrace = "\n";
stackTrace += "########################### caller stackTrace ###########################\n";
stackTrace += elements.stream().collect(Collectors.joining("\n"));
stackTrace += "\n#################################################################################";
log.info(stackTrace);
} else {
log.info("[caller not defined]");
}
}
}
위의 소스를 공통 util 패키지에 두고
START_PACKAGE
부분만 필요한 패키지로 수정하여 사용하면 된다.
반응형