Deno와 Node.js: 패키지 관리 방법을 비교해보자
기존 Node.js 패키지 관리
기존 Node.js에서는 패키지를 npm (Node Package Manager) 레지스트리를 사용하여 관리합니다. 개발자는 npm install 명령을 사용하여 패키지와 해당 종속성을 npm 레지스트리에서 다운로드하고 로컬로 설치할 수 있습니다.
Node.js는 package.json 파일을 사용하여 종속성을 관리합니다. 이 파일에는 애플리케이션이 필요로하는 모든 종속성과 버전 번호가 나열됩니다. 개발자가 npm install을 실행하면 Node.js는 package.json 파일을 확인하고 필요한 종속성을 설치합니다.
Deno 패키지 관리는?
Deno는 독특한 패키지 관리 방법을 사용합니다. npm과 같은 중앙 집중식 패키지 레지스트리를 사용하는 대신 Deno는 개발자가 URL에서 직접 패키지를 가져올 수 있도록 합니다.
예를 들어, Deno에서 oak 모듈을 가져오려면 다음 문장을 사용할 수 있습니다.
import { Application } from "https://deno.land/x/oak/mod.ts";
TypeScript
복사
Deno는 또한 로컬 파일이나 디렉토리에서 모듈을 가져오는 것도 지원합니다. 이것은 모듈을 로컬에서 개발하고 테스트하는 데 유용할 수 있습니다.
Deno는 종속성을 관리하기 위해 package.json 파일을 사용하지 않습니다. 대신, 개발자는 import map을 사용하여 애플리케이션에서 사용되는 모듈의 URL을 지정할 수 있습니다. import map은 모듈 지정자를 URL로 매핑하는 JSON 파일입니다.
{
"imports": {
"oak": "https://deno.land/x/oak/mod.ts"
}
}
TypeScript
복사
장단점
Node.js 패키지 관리 장점
•
npm은 수많은 패키지 저장소를 가지고 있으며 npm 명령을 사용하여 쉽게 설치하고 관리할 수 있습니다.
•
package.json 파일은 종속성과 그 버전을 명확하고 간결하게 관리할 수 있는 방법을 제공합니다.유 및 제어 문제가 발생할 수 있습니다.
•
npm install 명령은 대규모 프로젝트와 많은 종속성을 가진 프로젝트의 경우 느릴 수 있습니다.
Deno 패키지 관리 장점
•
URL에서 직접 패키지를 가져올 수 있기 때문에 로컬에 설치하지 않고도 타사 패키지를 쉽게 사용할 수 있습니다.
•
import map을 사용하여 package.json 파일 없이 종속성을 관리할 수 있습니다.
Deno 패키지 관리 단점
•
URL에서 패키지를 가져오는 것은 신뢰할 수 있는 소스에서 가져와야하기 때문에 위험할 수 있습니다.
•
중앙 집중식 패키지 레지스트리가 없어 패키지를 찾고 발견하기 어려울 수 있습니다.
Deno 패키지 관리를 위한 방법
Deno 프로젝트가 잘 관리되고 안전하게 유지되도록 하려면 다음과 같은 Best Practices를 따르는걸 추천 합니다.
•
import map을 사용하여 종속성을 관리하세요. 이렇게 하면 애플리케이션이 사용하는 모듈을 추적하기 쉬워집니다.
•
모듈의 버전화된 URL을 사용하세요. 이렇게 하면 모듈이 미래에 업데이트되더라도 항상 특정 버전을 사용하게 됩니다.
예) https://deno.land/<namespace>/<module_name>@<version>/<file_path>
외부 모듈을 관리하기 위한 전용 import 파일을 작성하려면, 다음과 같이 진행할 수 있습니다.
예를 들어, deps.ts라는 파일을 만들어 프로젝트의 루트 디렉토리에 넣습니다. 이 파일에는 프로젝트에서 사용하는 모든 외부 패키지를 불러옵니다. 이렇게 하면 외부 패키지의 URL과 버전을 한 곳에서 관리할 수 있어 편리합니다.
•
deps.ts
// 라이브러리의 주소와 버전을 명시적으로 지정합니다.
export { default as oak } from "https://deno.land/x/oak@v8.1.0/mod.ts";
export {
Application,
Router,
Context,
} from "https://deno.land/x/oak@v8.1.0/mod.ts";
export {
config as dotenvConfig,
} from "https://deno.land/x/dotenv@v0.3.0/mod.ts";
TypeScript
복사
이제 다른 파일에서 필요한 외부 패키지를 사용하려면 deps.ts 파일에서 불러올 수 있습니다.
import { Application, Router, oak } from "./deps.ts";
import { dotenvConfig } from "./deps.ts";
// dotenvConfig 사용하여 환경 변수 설정
dotenvConfig();
const app = new Application();
const router = new Router();
// oak 라이브러리를 사용한 라우팅 및 미들웨어 설정
router.get("/", (ctx) => {
ctx.response.body = "Hello World!";
});
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8000 });
TypeScript
복사
이 방식을 사용하면 외부 의존성을 한 곳에서 관리할 수 있으며, 필요한 경우 쉽게 버전을 업데이트하거나 다른 패키지로 교체할 수 있습니다.
Package.json 을 활용하는 방법
Deno 1.31 버전에서는 package.json을 사용하여 외부 패키지를 관리할 수 있게 되었습니다. 이를 통해 기존의 Node.js 프로젝트에서 Deno로 전환하기가 더욱 쉬워졌습니다. 이제 Deno는 package.json을 자동으로 감지하고, 이를 사용하여 의존성을 설치하고 해석할 수 있습니다.
먼저 package.json을 사용하여 외부 패키지를 관리하는 방식을 살펴보겠습니다.
•
package.json
jsonCopy code
{
"name": "@deno/my-example-app",
"description": "An example app created with Deno",
"type": "module",
"scripts": {
"say-hello": "cowsay 'Hello from deno!'"
},
"dependencies": {
"chalk": "^5.2"
},
"devDependencies": {
"cowsay": "^1.5"
}
}
Plain Text
복사
이제 deps.ts 대신 package.json을 사용하여 의존성을 관리할 수 있습니다.
장점:
1.
Node.js 개발자들에게 친숙한 방식입니다.
2.
npm을 사용하여 패키지를 관리하므로, 기존의 Node.js 생태계와 호환성이 높습니다.
3.
package.json을 사용하면 프로젝트 스크립트를 정의하고 실행할 수 있습니다.
단점:
1.
Deno의 원래 철학과는 다소 거리가 있습니다. Deno는 웹 표준과 호환되는 방식을 추구하기 때문에, 웹 표준 import map을 사용하는 것이 더 바람직합니다.
2.
외부 패키지의 URL과 버전을 직접 확인하기 어렵습니다. 이는 deps.ts를 사용할 때와 달리 package.json에서 외부 패키지의 정확한 URL과 버전을 확인할 수 없기 때문입니다.
결론적으로, Deno 1.31 버전의 package.json 지원은 Node.js 개발자들 Deno로의 전환을 용이하게 만들어주며, 기존 Node.js 프로젝트와의 호환성을 향상시킵니다. 그러나 Deno의 원래 철학과 웹 표준에 부합하는 방식을 사용하려면 여전히 deps.ts와 import map을 사용하는 것이 바람직합니다.
어떤 방식을 선택할지는 프로젝트의 필요에 따라 결정하시면 됩니다. 기존 Node.js 프로젝트를 가져오거나 Node.js 생태계와 호환성이 높은 프로젝트를 원한다면 package.json을 사용하는 것이 좋습니다.
Deno를 사용하면서 시간이 지남에 따라 package.json 지원이 개선되고, 더 많은 Node.js 프로그램들이 호환되기 시작하면, 두 방식 간의 차이가 줄어들 것이라고 기대할 수 있습니다. 그러나 현재로서는 개발자와 프로젝트의 요구에 따라 적합한 방식을 선택하여 사용하는 것이 중요합니다.