abcdedu 시스템에 데이터를 엑셀로 추출하는 기능을 추가했습니다.
Apache POI 모듈을 사용하여 구현했는데 분명 로컬에서는 잘 실행 되었던 엑셀 추출 기능이 aws 서버를 사용한 개발 환경에 배포가 되니, 동작하지 않았습니다.
이게 그 유명한 "아앗~~~ 분명 내 컴퓨터에서는 됐는데?" 현상인기 하고 곤란함에 머리를 감싸쥐었습니다. 그러곤 로그를 확인해보았습니다.
java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager] with root cause
로그에서 Font라는 단어가 힌트를 주었습니다. 데이터를 파일로 추출하는 기능이었기에 해당 파일을 만드는데 사용될 폰트 클래스가 필요한데 그것을 찾을 수 없는 것이라고 이해했습니다.
실제로 Apache POI는 파일을 export하는 과정에서 Java AWT (Abstract Window Toolkit) 라이브러리가 폰트 랜더링을 시도합니다.
로컬 환경에서는 GUI 환경이 갖춰져 있어 기본 폰트와 같은 설정이 이미 있지만 배포에 사용 중인 AWS ubuntu 서버는 GUI가 없는 헤드리스 환경이었기 때문에 AWT가 폰트 관련 설정을 찾지 못하고 초기화에 실패한 것 이었습니다.
우선 정확한 AWS 서버 사양을 알기 위해 서버가 기동중인 컨테이너에 접속해 아래와 같이 명령어를 입력해 정확한 서버 OS를 확인했습니다.
cat /etc/os-release
제가 사용 중인 AWS EC2 서버 OS는 Alpine Linux이었고, 매우 가벼운 스펙으로 이루어져 역시나 폰트 라이브러리가 포함되지 않은 서버였습니다.
따라서 명령어를 통해 폰트 라이브러리를 설치 시켜 준 다음, 실행해보니 다시 잘 작동됨을 확인할 수 있었습니다.
해당 시스템은 CI-CD를 사용하고 있었으므로 docker file에 폰트 라이브러리를 설치하는 명령어를 추가 하여 다른 컨테이너에서 띄어지더라도 같은 에러가 나타나지 않게 설정했습니다.
FROM openjdk:17-alpine
RUN apk add --no-cache fontconfig ttf-dejavu && fc-cache -fv
COPY build/libs/abcdedu-server.jar app.jar
CMD ["java", "-Djava.awt.headle
참고
'Programming > spring&java system' 카테고리의 다른 글
Springboot 3.x 와 Flyway를 쓰며 테스트/운영 DB 서버 밴더 다르게 사용하는 법 (3) | 2024.12.20 |
---|---|
Flyway 도입 후기: 장점, 문제점, 해결 과정 (2) | 2024.12.07 |
[DB] 설문 도메인을 구현하기 위한 ERD 와 JPA mapping 정의 (1) (1) | 2024.09.16 |