# 패키지 및 의존성 관리

Python 프로젝트를 진행할 때, 패키지와 의존성을 효과적으로 관리하는 것은 매우 중요하다. 이를 통해 코드의 재사용성을 높이고, 프로젝트 간의 충돌을 방지할 수 있다. 이 섹션에서는 Python 환경에서 패키지와 의존성을 관리하는 방법에 대해 다룬다.

#### 1. 패키지 관리의 중요성

패키지 관리란 프로젝트에서 사용하는 외부 라이브러리나 모듈들을 관리하는 것을 의미한다. 패키지 관리가 중요한 이유는 다음과 같다:

* **일관된 개발 환경 유지**: 개발자 간의 환경 차이로 인해 발생할 수 있는 오류를 줄여준다.
* **의존성 충돌 방지**: 다양한 라이브러리를 사용할 때, 버전 간 충돌을 방지할 수 있다.
* **재현성**: 동일한 의존성을 유지함으로써 프로젝트의 재현성을 보장한다.

#### 2. 가상 환경 설정

가상 환경은 프로젝트별로 독립적인 Python 환경을 설정하여, 패키지와 의존성 충돌을 방지하는 방법이다. Python 표준 라이브러리인 `venv` 모듈을 사용하면 간단히 가상 환경을 설정할 수 있다.

**2.1 가상 환경 생성**

가상 환경을 생성하려면, 다음 명령어를 사용한다:

```bash
python -m venv myenv
```

위 명령어는 `myenv`라는 이름의 디렉토리에 가상 환경을 생성한다.

**2.2 가상 환경 활성화**

가상 환경을 활성화하려면, 운영 체제에 따라 다음 명령어를 사용한다:

* **Windows**:

  ```bash
  myenv\Scripts\activate
  ```
* **macOS/Linux**:

  ```bash
  source myenv/bin/activate
  ```

활성화된 가상 환경에서는 `python` 명령어가 가상 환경 내의 Python을 가리키며, 외부 패키지를 설치할 때도 가상 환경 내에 설치된다.

**2.3 가상 환경 비활성화**

가상 환경을 비활성화하려면, 다음 명령어를 사용한다:

```bash
deactivate
```

이 명령어를 실행하면, 시스템의 기본 Python 환경으로 돌아간다.

#### 3. 패키지 설치 및 관리

Python에서는 `pip`이라는 패키지 관리 도구를 사용하여 패키지를 설치하고 관리한다.

**3.1 패키지 설치**

패키지를 설치하려면 `pip install` 명령어를 사용한다:

```bash
pip install package_name
```

예를 들어, `requests` 패키지를 설치하려면 다음과 같이 입력한다:

```bash
pip install requests
```

**3.2 특정 버전의 패키지 설치**

특정 버전의 패키지를 설치하려면 패키지 이름 뒤에 `==`와 버전을 명시한다:

```bash
pip install requests==2.25.1
```

**3.3 패키지 업그레이드**

설치된 패키지를 최신 버전으로 업그레이드하려면 `--upgrade` 옵션을 사용한다:

```bash
pip install --upgrade requests
```

#### 4. `requirements.txt` 파일 사용

`requirements.txt` 파일은 프로젝트에서 필요한 패키지와 그 버전 정보를 기록한 파일이다. 이 파일을 사용하면 다른 개발자나 서버에서 동일한 환경을 쉽게 재현할 수 있다.

**4.1 `requirements.txt` 생성**

현재 가상 환경에 설치된 모든 패키지를 `requirements.txt` 파일로 저장하려면 다음 명령어를 사용한다:

```bash
pip freeze > requirements.txt
```

이 파일에는 설치된 패키지와 그 버전 정보가 포함된다:

```
requests==2.25.1
numpy==1.19.5
```

**4.2 `requirements.txt`에서 패키지 설치**

다른 개발자나 서버에서 동일한 환경을 설정하려면, `requirements.txt` 파일을 기반으로 패키지를 설치할 수 있다:

```bash
pip install -r requirements.txt
```

이 명령어는 `requirements.txt` 파일에 명시된 모든 패키지를 설치한다.

#### 5. 의존성 관리 도구

더 큰 프로젝트에서는 패키지와 의존성을 더욱 효율적으로 관리하기 위해 추가적인 도구를 사용할 수 있다. 대표적인 도구로는 `pipenv`와 `poetry`가 있다.

**5.1 Pipenv**

`Pipenv`는 가상 환경 관리와 패키지 관리를 동시에 처리할 수 있는 도구이다. `Pipfile`과 `Pipfile.lock` 파일을 사용하여 의존성을 관리한다. 기본적인 사용 방법은 다음과 같다:

* 가상 환경 생성 및 패키지 설치:

  ```bash
  pipenv install package_name
  ```
* 가상 환경 활성화:

  ```bash
  pipenv shell
  ```
* `Pipfile`에 명시된 모든 패키지 설치:

  ```bash
  pipenv install
  ```

**5.2 Poetry**

`Poetry`는 패키지 관리와 빌드 프로세스를 단순화하기 위한 도구로, 의존성 관리를 보다 세밀하게 할 수 있다. `Poetry`는 `pyproject.toml` 파일을 사용하여 프로젝트의 메타데이터와 의존성을 관리한다.

* **Poetry 설치**:

  ```bash
  curl -sSL https://install.python-poetry.org | python3 -
  ```
* **새로운 프로젝트 생성**:

  ```bash
  poetry new myproject
  ```

  이 명령어는 `myproject` 디렉토리를 생성하고, 기본적인 파일 구조와 함께 `pyproject.toml` 파일을 포함한다.
* **기존 프로젝트에서 의존성 관리 시작**:

  ```bash
  poetry init
  ```

  이 명령어는 상호작용식 인터페이스를 통해 프로젝트 설정을 도와준다.
* **패키지 설치**:

  ```bash
  poetry add package_name
  ```

  예를 들어, `requests` 패키지를 설치하려면 다음과 같이 입력한다:

  ```bash
  poetry add requests
  ```
* **개발용 패키지 설치**: 개발 환경에서만 필요한 패키지를 설치하려면 `--dev` 옵션을 사용한다:

  ```bash
  poetry add --dev pytest
  ```
* **의존성 설치**: 프로젝트에 필요한 모든 의존성을 설치하려면 다음 명령어를 사용한다:

  ```bash
  poetry install
  ```
* **가상 환경 활성화**: Poetry는 자동으로 가상 환경을 생성한다. 가상 환경을 활성화하려면 다음 명령어를 사용한다:

  ```bash
  poetry shell
  ```

**5.3 Pipenv와 Poetry 비교**

* **가상 환경 관리**: Pipenv와 Poetry 모두 가상 환경을 자동으로 관리해준다. 두 도구 모두 `venv` 기반의 가상 환경을 생성하고 관리한다.
* **의존성 잠금 파일**: 두 도구 모두 잠금 파일을 생성하여 의존성의 정확한 버전을 기록한다. Pipenv는 `Pipfile.lock`을, Poetry는 `poetry.lock`을 사용한다.
* **커뮤니티 및 생태계**: Pipenv는 Python 커뮤니티에서 널리 사용되며, Python 공식 사이트에서도 소개되고 있다. Poetry는 좀 더 최근에 등장한 도구로, 사용자 친화적인 인터페이스와 함께 빌드 및 배포 기능을 포함하여 점차 인기를 얻고 있다.

#### 6. 패키지와 의존성 관리 모범 사례

패키지와 의존성을 관리할 때, 다음의 모범 사례를 따르면 문제 발생 가능성을 줄이고 프로젝트의 안정성을 높일 수 있다.

**6.1 의존성 최소화**

필요한 최소한의 패키지만을 설치하고 사용하는 것이 좋다. 불필요한 패키지를 설치하면 의존성 충돌 가능성이 높아지며, 보안 취약점이 증가할 수 있다.

**6.2 버전 고정**

`requirements.txt`, `Pipfile.lock`, `poetry.lock` 등 잠금 파일을 사용하여 패키지의 버전을 고정하면, 다른 환경에서 동일한 결과를 얻을 수 있다. 또한, 주요 버전 업데이트에 따른 호환성 문제를 방지할 수 있다.

**6.3 주기적인 업데이트**

패키지의 업데이트는 보안 패치나 성능 개선을 포함하고 있으므로, 주기적으로 의존성 패키지를 업데이트하는 것이 좋다. 그러나, 메이저 버전 업데이트는 신중하게 진행하고, 업데이트 후 충분한 테스트를 거쳐야 한다.

**6.4 의존성 감사**

의존성 패키지 중에는 보안 취약점이 포함된 경우가 있다. `pip`의 `pip audit` 명령어나, `Poetry`의 `poetry check`와 같은 도구를 사용해 의존성 패키지를 주기적으로 감사하고, 문제가 발견되면 즉시 조치해야 한다.
