파이썬을 이용한 간단한 api 프록시 서버를 만들어보기로 했다. 파이썬은 데이터를 다룰 때 아주 간단히 써본 경험이 있지만, 누군가 만들어놓은 문서를 따라 떠듬떠듬 환경설정을 마치고 사용해보기만 했다. 이번에 백엔드 서버를 처음부터 구성하려 보니 가상환경이라는 개념이 보였다. 그동안 내가 사용하던 패키지 매니저와는 다른 건가? 궁금했다. 환경설정부터 제대로 알아놓으면 뒤가 편할 것 같아 정리해보았다.

 


 

🚀 간단 요약 미리보기

도구 역할
npm, yarn, pnpm 패키지(라이브러리) 및 의존성 관리
venv, virtualenv, conda Python 가상환경 관리
nvm, pyenv, rbenv 특정 언어의 버전 관리 (Node.js, Python, Ruby 등)

 

 

 

💚 가상환경 VS 패키지 관리 개념차이

⏺️ 공통점

- 각 프로젝트별 독립적인 환경 유지

- 프로젝트 간 패키지 충돌 방지

- 운영 환경과 개발 환경의 일관성 유지

- 버전 관리 및 배포 최적화

 

1️⃣ 가상환경

- 프로젝트마다 완전히 독립된 환경을 생성

- 특정 프로젝트의 패키지가 다른 프로젝트에 영향을 주지 않음

- python, ruby, node.js(nvm) 등에서 사용되는 개념

- python의 경우, 해당 언어의 실행 환경(interpreter)까지 환경별로 관리 가능

 

2️⃣ 패키지 관리

- 프로젝트마다 필요한 패키지를 격리해서 설치

- 완전히 독립적인 환경을 만드는 것은 아님

- 의존성 충돌을 방지하고, 같은 패키지를 여러 프로젝트에서 중복 설치하는 문제를 해결

- python의 venv처럼 실행 환경을 격리하는 기능은 없음(시스템 전역 환경을 따름)

 

 

💚 패키지 매니저 - npm, yarn, pnpm 등

1️⃣ node_modules 기반 프로젝트별 패키지 격리

  • 각 프로젝트마다 node_modules 폴더를 생성하여 패키지를 저장
  • 패키지들은 해당 프로젝트에서만 사용 가능
  • venv와 다르게 Node.js 실행 환경(버전)은 공유됨
 
mkdir my-project && cd my-project
npm init -y
npm install express

➡ node_modules/express는 my-project에서만 사용됨.

 

 

2️⃣ npm install -g vs npm install (글로벌 vs 로컬)

npm install -g package 시스템 전체 (/usr/local/lib/node_modules 등) 전역 설치 (가상환경 X)
npm install package 프로젝트 node_modules 폴더 특정 프로젝트에만 적용 (venv와 유사)

📌 npm install -g(전역 설치)를 하면 다른 프로젝트에서도 같은 패키지를 공유하므로 가상환경처럼 격리되지 않음.
📌 반면, npm install(로컬 설치)을 하면 해당 프로젝트에서만 사용 가능하므로 가상환경과 유사한 효과를 낼 수 있음.

 

 

3️⃣ npm, yarn, pnpm의 lock 파일

npm package-lock.json 의존성 버전 고정
yarn yarn.lock 의존성 버전 고정 및 최적화
pnpm pnpm-lock.yaml 공유 패키지를 최적화하고 빠르게 설치

📌 Lock 파일이 있다면 같은 패키지 버전을 유지할 수 있으므로, 운영 환경과 개발 환경을 일치시키는 데 도움됨.

 

 

 

🩵 언어별 가상환경과 유사한 개념

언어 "가상환경"
개념 존재
방법
Python ✅ 있음 venv, virtualenv, conda
Node.js (JavaScript/TypeScript) ⚠️ 제한적 nvm (Node.js 버전 관리), yarn berry (PnP)
Java (Spring Boot 등) ❌ 없음 프로젝트마다 독립적인 Maven, Gradle 설정
Ruby ✅ 있음 rbenv, RVM (Ruby 버전 관리), Bundler (Gem 관리)
Go ⚠️ 제한적 go mod (의존성 관리)
PHP ❌ 없음 Composer (패키지 관리)
Rust ❌ 없음 cargo (패키지 및 빌드 관리)
.NET (C# 등) ⚠️ 제한적 .NET SDK (글로벌/로컬 설정 가능)

 

 

 

 

+ Recent posts