💻 프로그래밍

Dependency

의존성

코드가 필요로 하는 외부 라이브러리. package.json, requirements.txt로 관리.

📖 상세 설명

Dependency(의존성)는 소프트웨어가 정상적으로 동작하기 위해 필요로 하는 외부 라이브러리, 모듈, 또는 패키지를 의미합니다. 현대 소프트웨어 개발에서는 모든 기능을 직접 구현하는 대신, 검증된 외부 코드를 가져와 사용하는 것이 일반적입니다. 이러한 의존성 기반 개발 방식은 개발 속도를 크게 향상시키고 코드 품질을 높여줍니다.

의존성은 직접 의존성(Direct Dependency)과 간접 의존성(Transitive Dependency)으로 구분됩니다. 직접 의존성은 프로젝트에서 명시적으로 설치한 패키지이고, 간접 의존성은 직접 의존성이 내부적으로 사용하는 다른 패키지입니다. 예를 들어 React를 설치하면 React가 의존하는 loose-envify, js-tokens 등도 함께 설치됩니다.

각 프로그래밍 언어와 생태계는 고유한 의존성 관리 도구를 가지고 있습니다. JavaScript는 npm/yarn/pnpm과 package.json, Python은 pip와 requirements.txt, Java는 Maven/Gradle, Go는 go mod, Rust는 Cargo를 사용합니다. 이러한 패키지 매니저들은 버전 관리, 충돌 해결, 보안 취약점 검사 등의 기능을 제공합니다.

의존성 관리는 프로젝트의 안정성과 보안에 직접적인 영향을 미칩니다. 버전을 고정(lock)하지 않으면 예기치 않은 업데이트로 인해 빌드가 깨질 수 있고, 오래된 의존성은 보안 취약점을 내포할 수 있습니다. 따라서 정기적인 의존성 업데이트와 보안 스캔은 현대 DevOps 파이프라인의 필수 요소입니다.

💻 코드 예제

// === package.json (Node.js/JavaScript) ===
{
  "name": "my-project",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.18.2",      // 프로덕션 의존성
    "axios": "~1.6.0",         // API 호출 라이브러리
    "lodash": "4.17.21"        // 정확한 버전 고정
  },
  "devDependencies": {
    "jest": "^29.7.0",         // 개발 전용 (테스트)
    "eslint": "^8.56.0"        // 개발 전용 (린터)
  }
}

// === requirements.txt (Python) ===
// pip install -r requirements.txt 로 설치
Flask==2.3.3
requests>=2.31.0,<3.0.0
pandas~=2.0.0
numpy                          # 최신 버전

// === pom.xml (Java/Maven) ===
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>

// === 버전 지정 기호 의미 ===
// ^4.18.2  : 4.x.x (메이저 버전 고정)
// ~1.6.0   : 1.6.x (마이너 버전 고정)
// 4.17.21  : 정확히 이 버전만
// >=2.0.0  : 2.0.0 이상

// === 의존성 관리 명령어 ===
// npm install           # package.json 기반 설치
// npm update            # 패키지 업데이트
// npm audit             # 보안 취약점 검사
// npm audit fix         # 자동 보안 수정
// npm outdated          # 업데이트 가능한 패키지 확인

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"이번 릴리즈 전에 의존성 보안 감사를 해봤는데, lodash에서 프로토타입 오염 취약점이 발견됐습니다. 최신 버전으로 업데이트하고 package-lock.json도 다시 생성해야 합니다."
💬 면접에서
"의존성 버전 관리에서 캐럿(^)은 메이저 버전을 고정하고, 틸드(~)는 마이너 버전까지 고정합니다. 프로덕션에서는 lock 파일을 반드시 커밋하여 모든 환경에서 동일한 버전이 설치되도록 합니다. 또한 Dependabot이나 Renovate를 통해 자동으로 보안 업데이트를 관리하고 있습니다."
💬 코드 리뷰에서
"moment.js가 의존성에 추가되어 있는데, 번들 사이즈가 크고 더 이상 유지보수되지 않습니다. date-fns나 dayjs로 대체하면 번들 사이즈를 90% 이상 줄일 수 있어요. tree-shaking도 지원해서 사용하는 함수만 포함됩니다."

⚠️ 흔한 실수 & 주의사항

Lock 파일을 커밋하지 않는 실수

package-lock.json, yarn.lock, poetry.lock 파일은 반드시 버전 관리에 포함해야 합니다. 이 파일이 없으면 개발, 테스트, 프로덕션 환경에서 서로 다른 버전이 설치되어 "내 컴퓨터에서는 되는데" 문제가 발생합니다.

불필요한 의존성 방치

사용하지 않는 패키지를 그대로 두면 번들 크기가 커지고 보안 취약점 노출 위험이 증가합니다. depcheck, npm-check 같은 도구로 정기적으로 사용하지 않는 의존성을 정리하세요.

보안 취약점 자동 모니터링

GitHub Dependabot, Snyk, npm audit를 CI/CD 파이프라인에 통합하여 취약점을 자동으로 감지하고 PR을 생성하도록 설정하세요. 보안 업데이트는 가능한 빨리 적용하는 것이 중요합니다.

🔗 관련 용어

📚 더 배우기