첫 경험이 두려운 나이

능력이 부족한 개발자가 두려움에 직면할 때가 있습니다. 해결하려는 문제의 답을 구글링(또는 스택오버플로우)으로 찾을 수 없을 때입니다. 경험적으로 99.9%는 구글링으로 답을 찾습니다. 검색어 조합 능력이 개발자의 큰 미덕입니다.

0.1%도 없다면 개발자의 삶은 더 행복할 겁니다. 검색어를 이리저리 바꿔도 구글이 답을 내놓지 않습니다. 하느님 맙소사. 이 세상에 별처럼 많은 개발자가 존재하는데 내가 처음이라니. 첫 경험에 심장이 두근두근 뜀박질할 나이는 지났습니다. 자칫 심장마비가 올지도 모릅니다.

그나마 0.1%의 대부분도 남이 아닌 내 문제입니다. 세상의 모든 개발자가 하지 않을 어리석기 그지없는 실수입니다. 첫사랑이 다시 찾아온 것 같은 느낌이 중년의 자가발전으로 인한 착각이 듯. 나이가 들면 기억도 쇠퇴하기에 그런 실수는 모두 잊었습니다.

최근에 경험한 진실한 0.1% 사례입니다.

톰캣 8.5.37 버전의 JspC 클래스 버그

톰캣 8.0 버전이 지원을 중단해서 8.5 버전으로 옮기는 작업을 했습니다. 몇 가지 이유(동적 에러 최소화와 코드 난독화와 간단한 업데이트)로 빌드 단계에서 JSP 파일을 클래스 파일로 컴파일합니다. 쓰리래빗츠 북 배포판에는 JSP 파일이 없습니다. JSP 파일을 자바 소스로 바꾸는 건 톰캣이 제공하는 자스퍼를 사용합니다. 그런데 빌드를 할 때 예외가 발생했습니다.

/book/chapter.jsp 파일이 있는데 /book/book/chapter.jsp 파일이 없다는 에러 로그만 계속 나옵니다. 구글링으로는 답을 찾지 못했습니다.

내 어리석음이 이유인지 확인하기 위해 톰캣 예제 파일을 이용해 빌드를 해도 마찬가지입니다. 해당 소스 코드를 직접 볼 수밖에 없습니다. org.apache.jasper.JspC.javascanFilesInternal 메소드에 작은 버그가 있었습니다.

톰캣을 사용하는 개발자가 많을 텐데 빌드 단계에서 JSP 파일을 컴파일하는 사례는 많지 않았던 모양입니다. 당분간은 해당 소스 코드를 고쳐 빌드한 톰캣을 사용해야 합니다.

버그 리포트에 있으니 진짜 처음은 아닙니다.

리눅스에서 Open JDK가 글꼴을 지원하지 않는 문제

오라클 라이선스 정책 변화로 Open JDK를 지원을 준비하고 있습니다. 글꼴 처리가 문제입니다. 리눅스에서 java.awt.FontcreateFont 메소드에서 예외가 발생합니다. 윈도우는 문제가 없습니다.

다음과 같은 예외 메시지가 나타납니다.

java.io.IOException: Problem reading font data.

앞의 문제와 달리 구글링이 몇 가지 단서를 제공하지만 마땅한 해결책은 없습니다. java.awt.Font 소스를 보니 아쉬움이 있습니다.

catch (Throwable t) {
    if (t instanceof FontFormatException) {
        throw (FontFormatException)t;
    }
    if (t instanceof IOException) {
        throw (IOException)t;
    }
    Throwable cause = t.getCause();
    if (cause instanceof FontFormatException) {
        throw (FontFormatException)cause;
    }
    throw new IOException("Problem reading font data.");
}

12번째 줄에서 실제 발생한 예외를 숨기고 있습니다. 꽤 나쁜 코드입니다. 12번째 줄을 다음과 같이 바꿨습니다.

throw new IOException(t, "Problem reading font data.");

바꿔 테스트하니 예외 메시지가 구체적입니다.

java.lang.NullPointerException
        at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)

구글링도 정답을 알려줍니다. 리눅스에서 JDK_HOME/lib 디렉터리에 fontconfig.properties 파일을 만들고 다음 내용으로 채웠습니다.

version=1
sequence.allfonts=default

나이가 들었습니다. 깊이 파고들 생각은 없습니다. OpenJDK 리눅스 배포판에 fontconfig.properties 파일이 없는 아주 중요한 이유가 있겠죠.