티스토리 뷰
이번에 발생한 이슈에 대해 정리해본다.
POI라이브러리는 오피스 파일들을 자바에서 사용하기 위해 사용하는 라이브러리로, 이 경우 엑셀을 다루기 위해 사용되었다.
MS Excel은 기본적으로 저장할 때 .xlsx나 .xls의 확장자를 이용하는데, .xls은 2003 이전버전을, 이후는 .xlsx를 사용한다.
문제가 된 부분은 업로드한 엑셀파일을 서버 임시경로에 저장하는 부분에서 발생했다. 업로드하기 위해 작성이 필요한 양식을 다운로드받는 기능이 있는데, 이때도 .xslx로 다운로드되기 때문에 .xls까지는 테스트가 되지 않았던 모양이었다.(레거시코드인데, 개발 당시에 원래 테스트가 이루어졌어야 맞다고 본다...) 원래대로라면 업로드한 파일 그대로 임시경로에 저장되어서 읽어서 사용하는데, 이때 파일을 .xslx로 저장하도록 하드코딩이 되어 있었다.(하드코딩이 이렇게 무섭다...) 그렇다보니 .xls 파일을 업로드하더라도 서버에는 .xslx로 저장이 되었다. 그래도 별 문제가 없었으면 좋았을텐데, .xlsx와 .xls는 POI 하위 컴포넌트를 다르게 사용했다. HSSF(Horrible SpeadSheet Format)은 2003 이전 버전까지의 파일(.xls)을, XSSF(XML SpreadSheet Format)는 그 이후 버전의 파일(.xlsx)을 다루는 데 사용되었다. 그래서 임시경로에 저장하고 파일을 읽어들이는 부분에서 확장자에 따라 다른 컴포넌트를 사용하도록 분기를 줬는데, 데이터는 xls로 되어 있더라도 임시경로의 확장자가 xslx로 하드코딩되어 문제가 된 것이었다. (이 과정에서 문서가 망가진 게 아닐까 싶은데 내일 출근해서 확인해봐야겠다.) 하드코딩된 부분을 확장자를 읽어 저장하는 부분으로 변경하고 실행해보니 잘됐다.
원래는 이런 메세지를 볼 수 있었다. (일부가 잘린 메시지)
~XmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Document
org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI to process this data (eg HSSF instead of XSSF)
그래서 본 이슈를 통해 느낀 점은... 역시나 1. 테스트를 빡시게 하자 2. 하드코딩 금지!
'공부흔적' 카테고리의 다른 글
인프런 장애 부검 참고사항 정리 (0) | 2022.02.02 |
---|---|
DRM과 파일 업로드 (0) | 2022.01.27 |
로그와 보안 (0) | 2022.01.27 |
코드리뷰 정리 (0) | 2021.08.06 |
VM Redis 클러스터 구축부터 Jedis를 이용한 자바 연동까지 (1) | 2021.06.29 |