Internship

Dependency? 의존성은 무엇일까?

Jay_J 2024. 6. 27. 08:49

이번 여름 인턴을 진행하던 중, cybersecurity 팀과 frontend팀이 협력하여 현재 개발중인 애플리케이션의 보안등 문제를 개발하는 단계에 이르렀다. 제일 첫번째 스텝은 팀 내에서 역할을 세분화 하여 의존성 패키지 코드를 작성하는것인데, 개발을 진행하며 의존성, dependency에 관한 얘기를 수없이 들어봤지만, 내가 여지껏 개발했던 애플리케이션들의 개발 규모가 작았기 때문에 의존성에 관련된 문제들은 구글을 검색해 코드를 가져오거나 GPT한테 물어봤다. 하지만, 이렇게 실제로 나에게 dependency에 관련한 코드를 작성하라니 정말 아무것도 모르겠어서 오늘은 의존성이 뭔지 정도만 확인하고 다음 포스팅에서는 실제 코드로 의존성이 어떻게 동작하는지 알아 볼 예정이다.

 

※Dependency(의존성)이란 프로그래밍에서 무엇일까?

아래는 GPT를 통해 얻은 답변이다.

더보기

프로그래밍에서 "의존성(Dependency)"이란, 특정 소프트웨어가 제대로 작동하기 위해 필요로 하는 외부 소프트웨어, 라이브러리, 프레임워크 또는 모듈을 의미합니다. 의존성은 개발자가 기존의 잘 검증된 코드를 재사용하여 개발 시간을 절약하고 코드의 신뢰성을 높이는 데 중요한 역할을 합니다.

의존성의 장점

1. 재사용성:
   - 이미 개발되고 검증된 코드를 재사용함으로써 개발 시간을 단축하고 오류를 줄일 수 있습니다. 예를 들어, HTTP 요청을 쉽게 처리하기 위해 `axios` 같은 라이브러리를 사용할 수 있습니다.

2. 유지보수성:
   - 외부 라이브러리나 모듈을 사용하면 버그 수정이나 기능 개선이 해당 라이브러리의 업데이트를 통해 자동으로 적용될 수 있습니다. 이는 유지보수 비용을 줄이고 코드의 품질을 유지하는 데 도움이 됩니다.

3. 협업:
   - 여러 개발자가 참여하는 프로젝트에서 동일한 라이브러리와 버전을 사용하여 일관된 개발 환경을 유지할 수 있습니다.

의존성의 유형

1. 직접 의존성(Direct Dependency):
   - 프로젝트에서 직접적으로 사용하는 라이브러리나 모듈입니다. 예를 들어, 웹 서버를 구축하기 위해 `express`를 사용하는 경우, `express`는 직접 의존성입니다.

2. 간접 의존성(Indirect Dependency):
   - 직접 의존성에서 다시 필요로 하는 의존성입니다. 예를 들어, `express`가 내부적으로 사용하는 여러 라이브러리가 간접 의존성이 됩니다.

의존성 관리 도구

NPM (Node Package Manager)은 Node.js 애플리케이션에서 가장 널리 사용되는 의존성 관리 도구입니다. NPM을 사용하면 패키지 설치, 버전 관리, 패키지 업데이트 등을 쉽게 할 수 있습니다.

 

`package.json` 파일

`package.json` 파일은 NPM 프로젝트의 메타데이터와 의존성을 정의하는 파일입니다. 이 파일에는 프로젝트 이름, 버전, 설명, 스크립트, 의존성 등이 포함됩니다. 다음은 `package.json` 파일의 예입니다:

{
  "name": "my-project",
  "version": "1.0.0",
  "description": "A sample project",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "jest"
  },
  "dependencies": {
    "express": "^4.17.1",
    "axios": "^0.21.1"
  },
  "devDependencies": {
    "jest": "^26.6.3"
  }
}

 주요 NPM 명령어

1. `npm install`:
   - `package.json` 파일에 정의된 모든 dependencies와 devDependencies를 설치합니다. 이 명령어는 `node_modules` 디렉토리에 모든 패키지를 다운로드하고 설치합니다.

2. `npm install <package>`:
   - 특정 패키지를 설치하고, 자동으로 `package.json` 파일의 dependencies 섹션에 추가합니다.
   - 예: `npm install express`

3. `npm install <package> --save-dev`:
   - 특정 패키지를 devDependencies 섹션에 추가합니다.
   - 예: `npm install jest --save-dev`

4. `npm update`:
   - 현재 설치된 패키지들을 최신 버전으로 업데이트합니다.

5. `npm uninstall <package>`:
   - 특정 패키지를 제거하고, `package.json` 파일에서 해당 패키지를 제거합니다.
   - 예: `npm uninstall axios`

의존성 관리의 모범 사례

1. 버전 관리:
   - 특정 버전 범위를 지정하여 예기치 않은 변경으로부터 프로젝트를 보호합니다. 예를 들어, `^1.0.0`은 1.x.x 버전에 대해서만 업데이트를 허용합니다.

2. 의존성 정리:
   - 더 이상 필요하지 않은 의존성을 제거하여 프로젝트를 간소화하고 유지보수를 용이하게 합니다.

3. 보안 검사:
   - 정기적으로 의존성의 보안 취약점을 검사하고, 발견된 취약점을 신속히 해결합니다. NPM의 `npm audit` 명령어를 사용하여 보안 문제를 확인할 수 있습니다.

4. 잠금 파일 사용:
   - `package-lock.json` 파일을 사용하여 설치된 패키지의 정확한 버전을 기록합니다. 이는 팀 내의 일관된 개발 환경을 유지하는 데 도움이 됩니다.

5. 의존성 업데이트 주기 관리:
   - 정기적으로 의존성을 업데이트하여 최신 기능과 보안 패치를 받을 수 있도록 합니다. 그러나 주요 버전 업데이트는 신중하게 검토하고 테스트해야 합니다.

이와 같은 의존성 관리 방법을 통해 프로젝트의 안정성, 보안성, 유지보수성을 높일 수 있습니다.

내가 이번 학부 연구를 진행하며 써왔던 모든것들, npm, axios, express 등등이 모두 의존성과 관련되어 있었다. 

 

예를들어, 내가 frontend 디렉토리에서 npm i cookie_parser 같은 패키지를 설치한다면, pack.json 파일의 dependencies에서 내가 방금 설치한 패키지를 확인 할 수 있다.