준호씨의 블로그

Java에서 현재 함수명 구하기 본문

개발이야기

Java에서 현재 함수명 구하기

준호씨 2007. 12. 3. 13:39
반응형
요즘 자바로 서비스를 만들고 있는데 내부적으로 로그처리를 하는 경우가 많다.
로그에는 현재 서비스가 무엇인지를 알려주기 위한 ServiceId, 어느 함수에서 찍은 로그인지를 알려주기 위해  현재 함수명을 인자로 넘기고 있었다.

예를 들면 아래와 같은 방식이다.
log.sysDebug(ServiceId, "execReadList", e.toString());
execReadList라는 함수에서 로그를 남기면 두번째 인자로 "execReadList"를 직접 적어주고 있었다.
이렇게 하다보니 로그를 다른 함수로 복사할 때 부주의로 인해 실수(예를 들어 "execCreate"라 적힌 로그를 "execDelete"에 그냥 복사) 가 생기기도 하고
매번 함수명을 확인해야 되는 번거로움이 있었다.

그 단점을 보완하고자 함수 시작시
String MethodName = "execReadList";

를 선언하여 log 두번째 인자로 넘겨주는 방법을 생각해 보다가
이왕 하는김에 함수명을 알아오는 방법이 있다면 그 방법을 쓰면 더 편하겠다 싶어 방법을 알아 보기로 하였다.

하지만 클래스명을 알아오는 함수는 있었지만 함수명을 알아오는 함수는 없었다.
몇가지 검색엔진을 돌려본 결과 Exception을 강제 발생해서 거기적혀 있는 함수명을 가져오는 방법을 쓰는 방법을 사용하는 사람들이 종종 보였다.

그렇다. Exception을 발생시키면 거기 안에 함수명도 적혀 있었던 것이다.
그래서 뚝딱뚝딱 다음과 같은 함수를 만들었다.

/**
 * 현재 함수명 리턴(1.4 이후에서만 사용가능)
 *
 * @author 2007.11.27(김준호)
 * @since 1.4
 */
public static String getMethodName()
{
    StackTraceElement[] elements = null;
   
    try {throw new Exception("getMethodName");}
    catch (Exception e){elements = e.getStackTrace();}
   
    String methodName = ((StackTraceElement)elements[1]).getMethodName();
   
    return methodName;
}

Exception을 강제 발생시켜서 StackTrace를 배열에 저장해서 배열의 두번째 내용에 있는 함수명을 뽑아내는 것이다.
첫번째 내용인 배열의 0번째 인자를 뽑아내면 자기 자신의 함수명인 "getMethodName"을 리턴하게 된다.

단 주의할점은 JDK 1.4이후에서만 써야 된다.
전의 버전에서는 배열로 저장이 안되는것 같았다. 문자열을 잘 파싱하면 함수명을 구할 수 있지만 일단 개발중인 시스템이 1.4이기 때문에 생략하였다.

그리고 내가 StackTrace에 대해 꼼꼼히 검증을 하지 않아서 정상적으로 만든 함수인지 불명확하다.
일단 충분한 테스트를 해보자.

반응형
Comments