파일 아카이빙은 현대 사회에서 흔히 볼 수 있는 일이며, 많은 사람들이 압축을 통해 데이터의 크기와 이동성을 줄임으로써 얻을 수 있는 이점을 인식하고 있습니다.

ZIP 파일 형식은 컴퓨터 과학 분야에서 탁월한 아카이빙 표준으로 널리 인정받고 있으며, 저장 용량 향상, 효율적인 전송 또는 기타 목적을 위해 데이터 파일을 체계적인 아카이브로 통합하려는 사람들에게 최적의 선택으로 평가받고 있습니다.

파일 압축의 목적은 저장 공간을 절약하고 데이터 전송을 단순화하며 데이터 액세스를 가속화하기 위해 파일 또는 파일 그룹의 크기를 줄이는 것입니다. 이러한 맥락에서 ZIP 형식을 사용하여 파일을 압축한 다음 Node.js를 사용하여 원래 상태로 다시 추출하는 방법을 아는 것이 유용할 수 있습니다.

왜 파일을 압축해야 할까요?

특정 파일과 폴더의 크기는 저장 장치나 클라우드 스토리지 용량의 한계를 초과하는 경우가 많아 부피가 커서 전송이나 저장에 어려움을 겪는 경우가 많습니다.

특정 파일이나 디렉토리의 크기를 줄이는 것은 전송을 원활하게 하기 위한 목적뿐만 아니라 그러한 조치가 필요할 수 있는 다양한 다른 목적을 위해 권장되는 경우가 많습니다.

효율적인 스토리지의 개념은 잠재적인 오류나 정보 손실을 최소화하면서 접근성, 구성 및 검색을 최적화하는 방식으로 데이터를 저장하고 관리하는 기능을 말합니다.

파일 구조화 및 분류를 개선하면 시스템 내에서 정보에 대한 액세스, 관리 및 검색의 효율성이 향상될 수 있습니다.

파일 암호화 및 비밀번호 보호와 같은 강력한 보안 조치의 구현은 데이터 안전 및 개인정보 보호의 중요한 측면입니다.

파일 무결성 모니터링을 통해 파일 콘텐츠의 진실성과 진본성을 보장합니다. 이 프로세스에는 파일이 악의적으로 변조되거나 손상되지 않고 원본 그대로 유지되는지 확인하기 위해 파일을 지속적으로 검사하고 검증하는 작업이 포함됩니다. 중요한 정보의 정확성과 신뢰성을 손상시킬 수 있는 무단 변경을 방지하여 데이터 신뢰성을 유지하는 것이 목표입니다.

시간 경과에 따른 변경 사항을 추적하고 이전 반복에 쉽게 액세스할 수 있도록 파일의 여러 버전을 유지하는 프로세스를 파일 버전 관리라고 합니다.

Node.js 아카이버 및 압축 해제 패키지란 무엇인가요?

Archiver 패키지의 공식 문서에서는 이 패키지를 “아카이브 생성을 위한 스트리밍 인터페이스”로 설명합니다.이는 아카이버 패키지가 압축 파일 아카이브를 생성하기 위해 Node.js 스트림을 활용하는 함수 라이브러리를 제공한다는 것을 의미합니다.

이 글도 확인해 보세요:  Axios로 작업하기 위한 완벽한 가이드

Archiver 패키지는 ZIP, GZIP, TAR 등 다양한 아카이브 형식을 처리할 수 있으며, 사용자가 개별 파일과 전체 디렉터리를 모두 압축할 수 있습니다. 또한 대용량 아카이브를 더 작은 세그먼트로 분할하여 여러 볼륨의 아카이브를 만들 수 있습니다. 또한 이 애플리케이션은 사용자가 압축 프로세스에서 특정 파일을 선택적으로 제외하거나 생략할 수 있는 기능을 제공합니다.

Unzipper 패키지는 Node.js에서 ZIP 아카이브를 추출하는 데 매우 효율적인 패키지입니다. 이 패키지는 개발자가 몇 줄의 코드만으로 ZIP 파일을 추출할 수 있는 사용하기 쉬운 API를 제공합니다.

이 튜토리얼에서는 아카이버와 압축 해제 패키지를 모두 선택했는데, 두 패키지는 Node.js fs 모듈과 조화롭게 협력하여 간소화되고 복잡하지 않은 통합을 가능하게 합니다.

Node.js에서 파일을 ZIP 형식으로 압축하는 방법

Node.js를 사용하여 파일을 ZIP 형식으로 압축하는 프로세스는 간단하며 Archiver 패키지가 이를 위한 손쉬운 솔루션을 제공하기 때문에 전문 지식이 필요하지 않습니다. 이 섹션을 탐색하는 동안 ZIP 아카이브를 생성하려면 컴퓨팅 장치에 Node.js 개발 환경이 설치되어 있어야 합니다.

현재 당면한 과제는 널리 사용되는 Node.js용 gzip 라이브러리를 사용하여 단일 파일 또는 전체 폴더를 ZIP 아카이브로 압축할 수 있는 Node.js 애플리케이션을 개발하는 것입니다. 이 작업을 시작하려면 다음 명령줄 지침에 따라 컴퓨팅 장치에서 새 Node.js 프로젝트를 초기화해야 합니다:

 mkdir node-zip-archiver
cd node-zip-archiver
npm init -y

프로젝트 내에 Archiver 패키지를 설치하려면 터미널을 통해 “npm install archiver –save” 명령을 실행합니다. 설치가 완료되면 프로젝트 디렉터리 내에 새 파일을 생성하고 “app.js” 또는 “archiver.js”와 같은 적절한 이름을 선택합니다.

FS 모듈은 파일 시스템 작업을 관리하는 반면, 아카이버 패키지는 파일과 디렉터리를 ZIP 아카이브로 압축하도록 설계되었습니다. 따라서 스크립트에는 앞서 언급한 두 가지 구성 요소를 모두 활용해야 합니다.

파일에서 ZIP 아카이브 생성

다음 코드는 파일을 파라미터로 받아 압축된 ZIP 아카이브를 생성하는 함수를 구현합니다.

 const archiver = require('archiver')
const fs = require('fs')

// create ZIP from file
const createZipFromFile = (file) => {
    const filePath = __dirname + '/' + file
    const output = fs.createWriteStream(filePath + '.zip')
    const archive = archiver('zip', {
        zlib: { level: 9 } // set compression level to the highest
    })

    archive.pipe(output);
    archive.file(filePath, { name: file })
    archive.finalize()
}

상기 절차는 압축할 파일의 식별자를 입력으로 받은 후 .ZIP 파일 확장자를 추가하는 것을 제외하고는 소스 파일과 유사한 지정의 출력 파일을 생성합니다.

이 글도 확인해 보세요:  JES에서 사운드를 임포트하고 재생하는 방법

다음으로, 이 함수는 최대 압축 수준을 9(가능한 최고 값)로 설정하여 아카이브 레코드를 구성한 다음 파이프 메커니즘을 사용하여 생성된 아카이브에서 입력 파일로 정보의 흐름을 유도합니다.

파일과 관련된 함수는 문서를 아카이브에 추가합니다. 이 함수는 파일의 경로와 원하는 경우 아카이브 내에서 파일의 속성을 지정할 수 있는 대체 옵션을 입력으로 받습니다.

‘이름’ 옵션을 지정하지 않고 아카이버를 사용하여 아카이브에 파일을 추가하면 소프트웨어가 디렉토리 구조를 유지하면서 원래 경로를 기준으로 아카이브된 파일에 파일 이름을 자동으로 할당합니다.

특정 파일 이름과 경로를 지정하면 아카이버가 문서를 아카이브된 컬렉션에 추가하여 아카이브 내에서 의도한 명명법과 배열을 유지하므로 이 과정에서 수동으로 개입하거나 파일 이름을 조정할 필요가 없습니다.

폴더에서 ZIP 아카이브 만들기

폴더 모음에서 ZIP 아카이브를 만들 때는 개별 파일의 경우와 절차가 약간 다릅니다. 함수의 파일 매개변수를 사용하는 대신 아카이버 패키지의 디렉토리 함수를 사용하여 전체 디렉토리를 쉽게 압축할 수 있습니다.

다음은 지정된 폴더를 ZIP 아카이브로 쉽게 압축하는 함수를 구현한 것입니다:

 // create ZIP from folder
const createZipFromFolder = (folder) => {
    const folderPath = __dirname + '/' + folder
    const output = fs.createWriteStream(folderPath + '.zip')

    const archive = archiver('zip', {
        zlib: { level: 9 } // set compression level to the highest
    })

    archive.pipe(output)
    archive.directory(folderPath, false)
    archive.finalize()
}

디렉터리와 관련된 함수는 파일 경로를 나타내는 문자열을 초기 입력으로 받고 그 뒤에 표시기를 후속 입력으로 받습니다. 이 표시기는 디렉토리를 배치해야 하는 아카이브 내 위치를 지정하는 역할을 합니다.

플래그가 거짓으로 설정되어 있으면 아카이브된 콘텐츠는 폴더 자체를 제외한 폴더의 구성 요소로만 구성됩니다. 반대로 플래그를 true로 설정하면 아카이브 프로세스에 폴더도 포함됩니다.

압축 해제된 사이트가 추출된 아카이브로 인해 오염되는 것을 방지하려면 플래그 옵션을 true 상태로 활성화하는 것을 고려하세요. 반면에 이 구성이 목적에 맞지 않는다면 거짓으로 설정해도 됩니다.

Node.js에서 파일 압축을 푸는 방법

Node.js를 활용하여 ZIP 파일을 추출하는 데 사용할 수 있는 다양한 방법과 다양한 라이브러리가 있지만, 이 게시글에서는 Unzipper 패키지를 활용하겠습니다.

이 글도 확인해 보세요:  웹 개발을 위한 9가지 무료 온라인 코드 편집기

터미널에서 다음 명령어를 실행하여 Unzipper 패키지를 프로젝트에 통합하세요.

 npm install unzipper --save

패키지를 설치하면 해당 패키지를 코드로 가져온 다음 이어지는 코드 블록에 설명된 대로 ZIP 추출 함수의 구현을 활용해야 합니다.

 const unzipper = require("unzipper")

//function to extract ZIP file
const extractZip = async (file) => {
    const filePath = __dirname + '/' + file
    const outputPath = __dirname + '/extracted'
    await fs.createReadStream(filePath)
        .pipe(unzipper.Extract({ path: outputPath }))
        .promise()
}

`extractZip` 함수는 압축된 아카이브의 내용을 얻기 위해 읽기 가능한 스트림을 생성하고 지정된 출력 디렉터리로 파일을 추출하는 비차단 작업입니다(디렉터리가 없는 경우 해당 디렉터리 생성).

압축 해제 또는 추출 과정을 고려할 때 ZIP 아카이브는 그 내용에 관계없이 단순히 파일이기 때문에 파일과 디렉터리를 처리하기 위한 별도의 함수를 만들 필요가 없습니다.

이전에 개발된 구성 요소의 유효성을 검사할 수 있는 유틸리티는 다음과 같이 애플리케이션에 통합할 수 있습니다:

 (async function () {
    const file = 'test.pdf'
    const folder = 'test_folder'
    const zipFile = 'test.pdf.zip'
    createZipFromFile(file)
    console.log('ZIP archive successfully created from file')
    createZipFromFolder(folder)
    console.log('ZIP archive successfully created from folder')
    await extractZip(zipFile)
    console.log('ZIP archive extracted successfully')
}) ()

앞서 언급한 함수는 모두 자바스크립트 화살표 함수로 구현되어 있으며, 앞서 언급한 함수는 해당 범위 내의 코드를 포함하고 즉시 실행하는 즉시 호출 함수 표현식을 구성합니다.

파일 압축은 효율적인 애플리케이션을 구축하는 데 유용합니다

주요 목표 중 하나는 애플리케이션이 최적으로 작동하여 효율성을 높이고 즐거운 사용자 경험을 제공하는 것이어야 합니다.

애플리케이션 내에서 많은 수의 파일을 전송해야 하는 경우 전송 중에 데이터 압축 기술을 사용하는 것이 유용할 수 있습니다. 많은 최신 프로그래밍 언어는 데이터 스트림을 효과적으로 압축 및 압축 해제할 수 있는 강력한 기능을 제공합니다.

By 박준영

업계에서 7년간 경력을 쌓은 숙련된 iOS 개발자인 박준영님은 원활하고 매끄러운 사용자 경험을 만드는 데 전념하고 있습니다. 애플(Apple) 생태계에 능숙한 준영님은 획기적인 솔루션을 통해 지속적으로 기술 혁신의 한계를 뛰어넘고 있습니다. 소프트웨어 엔지니어링에 대한 탄탄한 지식과 세심한 접근 방식은 독자에게 실용적이면서도 세련된 콘텐츠를 제공하는 데 기여합니다.