유저정보를 엑셀파일로 다운로드.
개인정보가 포함되어 있어서 암호화 필수.
평소 엑셀관련 작업할 때 사용했던 라이브러리에 암호화 기능이 없었다.
새로운 라이브러리를 찾아야 했고,
두 가지 후보가 있었다.
sheetJS는 유료, xlsx-populate는 무료였다.
https://github.com/dtjohnson/xlsx-populate
import XlsxPopulate from 'xlsx-populate'
await workbook.xlsx.writeFile(tmpFilePath) // 1
const tmpWorkbook = await XlsxPopulate.fromFileAsync(tmpFilePath) // 2
await tmpWorkbook.toFileAsync(tmpFilePath, { password: '1234' }) // 3
비밀번호가 필요없는 엑셀이면 바로 buffer로 변환해서 보내면 됐는데,
비밀번호를 설정하려면 파일이 이미 존재해야했다.
1. 그래서 tmp폴더에 엑셀파일을 저장하고
2. 해당 파일을 XlsxPopulate excel 이 확인할 수 있게 type을 맞춰줬다.
3. 그리고 해당 파일에 비밀번호를 설정했다.
코드상으로 아주 간단했다.
그런데 시간이 생각보다 많이 걸렸다.
다운로드는 2종류였다.
하나는 유저에 관한 정보만, 나머지는 유저의 활동정보를 포함.
전자는 총 1분 20초의 시간이 걸렸고,
후자는 총 3분의 시간이 걸렸다.
정보를 가져오는 쿼리문에서 시간이 많이 걸렸나 확인했더니
암호화 부분에서 시간을 각각 1분가량, 2분30초가량 걸렸다.
정리
유저정보 : 총시간 (1분20초) 중에 암호화시간(1분)
유저+활동정보: 총시간 (3분) 중에 암호화시간 (2분30초)
암호화에 걸리는 시간이 좀 선을 넘었다.
https://github.com/rf00/minizip-asm.js
엑셀을 직접 암호화하는 방식보다
zip으로 변경후 암호화하는 방법이 어떠냐는 의견이 나왔다.
그게 왜 더 빠른지 몰랐지만 일단 만들어서 더 빠른지 비교하고 싶었다.
import Minizip from 'minizip-asm.js'
const buffer = await workbook.xlsx.writeBuffer() //1
let mz = new Minizip() // 2
await mz.append(`${fileName}.xlsx`, buffer, {password: process.env.EXCEL_PASSWORD }) // 3
fs.writeFileSync(`./tmp/${fileName}.zip`, mz.zip()) //4
시간테스트
[기존방법]
유저정보 : 총시간 (1분20초) 중에 암호화시간(1분)
유저+활동정보: 총시간 (3분) 중에 암호화시간 (2분30초)
[새로운방법]
유저정보 : 총시간 (58초) 중에 암호화시간(33초)
유저+활동정보: 총시간 (1분50초) 중에 암호화시간 (1분8초)
아니근데 왜 더 빠를까?
라이브러리마다 어느정도 속도차이는 있겠지만,
절반넘게 시간이 줄어드는 걸 보니.. 단순 라이브러리 성능문제는 아닌 것 같다.
- 엑셀을 만든다 -> 비밀번호를 설정한다
- 엑셀을 만든다 -> zip에 넣는다 -> 비밀번호를 설정한다.
누가봐도 단계가 추가된 2번이 느려야하지않나?
압축을 하는 게 엄청난 효율을 이끌어내는 건가.
여러군데에 물어보니
보통 excel작업보다는 zip작업이 빠르기 때문이라는 의견도 있고,
또 다른 의견은
zip파일은 대부분 zip 2.0 알고리즘을 쓴다고 한다.
엑셀은 aes 256을 쓴다.
zip 2.0알고리즘이 더 빨라서 그런 것 같다고 하는데
이 부분에 대해서 더 찾아봐야겠다.
안녕하세요 xlsx-populate 관련해서 찾다가 이 포스트를 발견했네요.
excel을 그대로 암호화했을 때 보다 zip으로 압축했을 때 시간이 더 적게 걸리는 이유가 궁금하신거 같은데,
파일이 커질수록 압축하는 시간보다 암호화를 하는 시간이 훨씬 더 오래 걸려서 그렇습니다.
파일이 작을때는 암호화를 하나 압축을 하나 시간이 거의 비슷해서 체감이 없는데
파일이 커질수록 암호화할 때 걸리는 시간이 비하급수적으로 증가하게 되서
압축해서 용량을 줄이고 암호화를 하는게 더 시간이 적게 걸리게 됩니다.