Git에서 대용량 파일 업로드다운로드
rograming GitHub repo에서 고유한 파일을 다운로드 할 때 어떤 팁이 있나요? raw 파일을 표시하기 위한 URL은 필요 없습니다. 바이너리의 경우는 아무것도 없습니다. 다운로드 서버로서 GitHub를 활용하는 것은 가능합니까? Google Code로 전환하기로 결정했을 경우, 여기에 기록된 기능이 표시됩니까? 아니면 오픈 소스 프로젝트를 위한 무료 호스팅 및 VCS가 있습니까? Git은 저장소의 일부를 다운로드하는 것을 지원하지 않습니다.
다운받으셔야 돼요.하지만 GitHub으로 이 일을 수행할 수 있어야 합니다.
기존의 XLSX 파일 생성 구조
기존의 XLSX 파일 생성 구조는 다음과 같았습니다. MyBatis의 resultHandler에서 row 한 개씩 XLSX 파일에 기술하고 XLSX 파일 생성이 완료되면 네이버의 세션 관리, 문자 전달 사내 플랫폼인 Session.io에 이를 알려줍니다. 그러면 Session.io는 사용자의 브라우저에 푸시하여 XLSX 파일을 다운로드하게 합니다. 이 방법으로 한 요청이 Tomcat 스레드를 오래 차지하지 않게 했다.
또한 서버가 XLSX 파일을 생성하는 동안 사용자가 왜 반응이 없지?라며 한 번 더 클릭하는 일을 방지하기 위해, 네이버에서 오픈소스화한 메모리 캐쉬 클라우드 에 XLSX 파일을 생성하고 있다는 정보를 담는다. 이번 XLSX 파일 다운로드를 개편하면서 어떤 구조가 좋을지 2가지의 선택지 중 고민이 있었어요.
공유하고자 하는 파일 업로드
이제 구글 드라이브에 공유하길 요구하는 대용량파일들을 집어 넣어야 합니다. 구글에서 제공하는 클라우드망으로 저장되기 때문에 구글이 뚫리지 않는 한 안전하게 보관할 수 있습니다.
네이버 클라우드의 경우 30gb까지 무상으로 제공하긴 하지만, 저는 나누는 파일은 구글 드라이브를 통해서만 하고 있습니다. 이건 각자 편한 곳으로 이용하면 될 듯 싶습니다.
Tomcat에서 Nodjs로 데이터 주기
이제 XLSX 파일을 메모리 걱정 없이 생성할 수 있게 되었습니다. 그것도 Node.js에서. 이제 Tomcat과 Node.js 사이의 차례입니다. 가장 먼저 고려했던 것은 페이징입니다. 페이징을 사용한다면 이미 사용 중인 API가 있었기 때문에 추가로 개발을 하지 않아도 되었습니다. 또 굉장히 만들기 쉽다는 이점도 있었어요. 하지만 네이버페이는 지금 XLSX 파일 생성에 페이징을 사용하지 않고 있습니다.
이유는 단 한 가지, 페이징이 너무 느리다는 것입니다. 페이징에 필요한 ORDER BY 때문에 데이터베이스는 지속해서 전체 레코드를 정렬해야 했고 이는 느린 쿼리가 많은 XLSX 파일 생성에 적합하지 않았습니다. 따라서 다른 방법이 필요했습니다. 특히 I/O의 횟수를 줄여야 했다. 한 번의 IO로 필요한 모든 row를 가져오는 것은 말은 쉽습니다. 그리고 이야말로 쿼리 수정도 쉬웠다.
표준이 있는 파일
XLSX 파일의 형식은 OOXMLOpen Office XML입니다. PPTX, DOCX 파일도 OOXML 형식을 사용합니다. OOXML은 이름처럼 XML을 기반으로 데이터를 저장하고 표현합니다. 그렇다면 왜 XLSX 파일을 텍스트 편집기로 열면 XML 형식의 텍스트가 보이지 않을까요? 이는 XLSX 파일이 여러 XML 파일을 포함하는 폴더를 압축한 파일이기 때문입니다. 이야말로 XLSX 파일의 확장자를 .zip으로 변경한 뒤 압축을 해제하면 다음과 같은 구조를 볼 있습니다.
row 정보는 모두 sheetName.xml 파일에 저장됩니다. 이 파일에는 필요한 정보 외에 XML 오버헤드도 굉장히 많기 때문에 row 몇만 개의 정보를 모두 메모리에 올리면 무모한 상태가 됩니다. 서버가 이 XLSX 파일만 생성하는 것이 아니라면 더욱 그렇다. 따라서 {sheetName}.xml 파일은 stream 처리가 되어야 합니다.
1 좀 더 보완된 방법론 202016 기준
보완된 접근법에서 추가적으로 보완할 방법을 생각하던 중 팀장님으로부터 Nginx reverse proxy를 적용하는 것을 추천받았습니다. 관련 내용은 아래 링크를 참고해주세요. 우선, 이전 보완된 접근법의 문제점은 아래와 같습니다. 파일 인스턴스로부터 callback을 받은 WAS가 파일을 내려보낼 때 엑셀 파일을 File 객체를 통해 연 뒤 OutputStream으로 내려보내기 때문에 파일 인스턴스가 아닌 WAS에서 추가적으로 리소스를 사용합니다.
엑셀 크기가 클 경우 부하를 줄 수 있습니다. WAS끼리 RestTemplate으로 api를 호출하기 때문에 불필요한 지연이 발생합니다.
공유 중단하기
공유 중단하는 방법은 간단합니다. 방법1. 해당 파일 자체를 구글 드라이브에서 삭제합니다. 방법2. 링크 공유를 누른다음 공유 해제를 합니다. 이상으로 구글 드라이브하는 대용량 파일 나누는 방법을 알아봤습니다. 꼭 익혀서 활용하시길 바랍니다.
자주 묻는 질문
기존의 XLSX 파일 생성
기존의 XLSX 파일 생성 구조는 다음과 같았습니다. 좀 더 자세한 사항은 본문을 참고하시기 바랍니다.
공유하고자 하는 파일
이제 구글 드라이브에 공유하길 요구하는 대용량파일들을 집어 넣어야 합니다. 좀 더 자세한 사항은 본문을 참고해 주세요.
Tomcat에서 Nodjs로 데이터
이제 XLSX 파일을 메모리 걱정 없이 생성할 수 있게 되었습니다. 좀 더 자세한 사항은 본문을 참고해 주세요.