티스토리 뷰
[SpringBoot] poi 라이브러리 버전에 따른 오류해결 (feat.ibSheet8 엑셀다운로드)
종벌🍀 2024. 11. 20. 21:25
이번에 poi 라이브러리 버전으로 이슈를 겪어 남겨본다.
내부에 ibSheet8 이라는 그리드를 사용하는데
해당기능에서 엑셀다운로드 기능이 포함되어 있어 사용하게 되었다.
ibsheet 측 개발문서에 보면
poi 3.13 버전과 poi4.1.2 버전에 대해 구분을 지어놓았다.
당연히 나는 poi 3 버전은 보안취약점이 존재하는 버전이라
자연스럽게 4.1.2 를 채택하여 디펜던시를 추가하였다.
(애초에 인텔리제이에서도 4.1.1 이상으로 업데이트 하라고 표기됨...)
인텔리제이에서 개발하고 테스트할때 까지는 문제가 없었다. 동작을 아주 잘 했기 때문.
허나 운영에 배포하자
엑셀 스타일이 적용이 안되는 것을 확인하였다.
처음엔 엑셀 요청자체가 Response 200 으로 응답되서 오류가 없는줄 알았느나
로그열어 보니 아래와 같이 스타일 관련 로그가 좌라라락 있었다.
java.lang.NoSuchMethodException: org.apache.poi.ss.usermodel.CellStyle.setFillPattern(short)
at java.lang.Class.getMethod(Class.java:1786)
at com.ibleaders.ibsheet.poi.IBCellStyle.<init>(IBCellStyle.java:30)
at com.ibleaders.ibsheet.excel.ExcelPOIHandler.getIBCellStyle(ExcelPOIHandler.java:138)
at com.ibleaders.ibsheet.excel.ExcelPOIHandler.<init>(ExcelPOIHandler.java:197)
at com.ibleaders.ibsheet.IBSheetDown.createExcel(IBSheetDown.java:624)
at com.ibleaders.ibsheet.IBSheetDown.checkCreate(IBSheetDown.java:833)
at com.ibleaders.ibsheet.IBSheetDown.downToStream(IBSheetDown.java:951)
at com.ibleaders.ibsheet.IBSheetDown.downToStream(IBSheetDown.java:973)
at com.ibleaders.ibsheet.IBSheetDown.downToBrowser(IBSheetDown.java:867)
at com.sample.common.service.ibsheet.ibsheetFileImportExportController.Down2Excel(ibsheetFileImportExportController.java:297)
... 이하 엑셀 스타일 관련 오류들...
어... IDE 에서는 동작 잘했는데 운영에선 왜이래...
운영에 배포한 jar 파일을 로컬에서 실행해봤더니 동일한 오류가 나는 것을 확인했다.
그래서 jar 배포할때 라이브러리 의존성 문제가 생긴줄 알고 별에 별 체크를 다 해봤으나
오류는 동일했고...
결국 아이비리더스에 문의를 남겼으나
내가 옵션값을 개발과 운영에 다르게 작성했을 거라 여겼으나 ㅋㅋㅋ
내가 상세하게 문의를 남기니 이상하다 싶어 원격지원까지 해줬으나 해결 실패...
나의 문제라고 생각했어서 빌드배포 과정들을 꼼꼼히 봤었으나
이젠 ibsheet 와 poi 간 문제라고 판단되어 오류코드로 되돌아가 다시 뜯어보고 바로 해결하게 되었다.
java.lang.NoSuchMethodException: org.apache.poi.ss.usermodel.CellStyle.setFillPattern(short)
at java.lang.Class.getMethod(Class.java:1786)
at com.ibleaders.ibsheet.poi.IBCellStyle.<init>(IBCellStyle.java:30)
오류를 보면 ibsheet 클래스에서 IBCellStyle 생성자로 초기화할때,
poi CellStyle 클래스의 setFillPattern 메소드를 리플렉션으로 접근하는 것을 확인하였다.
CellStyle.class.getMethod("setFillPattern", Short.TYPE);
그리고 ibsheet 라이브러리에서 setFillPattern 메소드에 Short 타입으로 초기화를 하는데
여기서가 문제였을 것으로 판단했다.
poi 4.1.2 버전은 FillPatternType 으로 변경점이 있어 Short 타입을 주면서 NoSuchMethod 오류가 났을 것이다.
void setFillPattern(FillPatternType var1);
그래서 혹여나 하고 poi 3.13 버전으로 디펜던시를 수정하였고
setFillePattern 메소드는 아래와 같이 short 로 받는 것을 확인했다.
void setFillPattern(short var1);
다운그레이드를 하니 jar 배포파일에서 발생하던 오류는 해결되었다.....😨😨😨
결국 ide에서는 확인되지 못한 런타임 오류였다...
이게 참 난감한게 인텔리제이와 같은 IDE 에서는 위와 같은 오류를 내지도 않았고 런타임시에도 별다른 이슈없이 잘 동작하여
해당 문제를 발견하는데까지 시간을 쫌 소요했다.
(엉뚱한 쪽에 포커스를 두다보니...)
인텔리제이의 런타임환경이 jar 실행 런타임과 어떤차이가 있는지는 더 알아봐야 겠으나
jar 의 런타임환경은 실제 클래스로더에 등록된 라이브러리들 관계로만 의존하다보니
관련 클래스의 메소드에 리플렉션 접근이 엄격해지는 것 같다.
인텔리제이에서는 클래스로더가 유연하게 처리를 하는 듯 싶다.
참고블로그
'Java > SpringBoot&Spring' 카테고리의 다른 글
[Springboot] redis cache 심플하게 사용해보기. (0) | 2024.10.18 |
---|---|
[Springboot] 운영서버에 로그파일 설정 (0) | 2024.08.30 |
[Thymeleaf] 주간 요일 구하기 (0) | 2024.06.28 |
[Springboot] 외부 라이브러리 추가 (feat.intelliJ) (0) | 2024.06.18 |
[Thymeleaf] preprocessing expressions; 전처리 표현식을 동적으로 사용. (1) | 2024.06.14 |