본문으로 건너뛰기
Previous
Next
C++ 패키지 관리 완벽 가이드 | vcpkg·Conan·시스템 패키지·프로덕션 패턴 [#55-6]

C++ 패키지 관리 완벽 가이드 | vcpkg·Conan·시스템 패키지·프로덕션 패턴 [#55-6]

C++ 패키지 관리 완벽 가이드 | vcpkg·Conan·시스템 패키지·프로덕션 패턴 [#55-6]

이 글의 핵심

C++ 의존성 지옥, 빌드 실패, 버전 충돌 해결. vcpkg·Conan·시스템 패키지 완전 예제, 흔한 에러, 모범 사례, 프로덕션 패턴까지 실전 코드로 다룹니다. C++에는 Python의 pip, Node.js의 npm처럼 표준 패키지 관리자가 없었습니다. 프로젝트마다 수동으로 소스 다운로드, CMake 설정, 링크 옵션을 맞추다 보면 의존성 지옥, 버전 충돌, 팀원마다 다른 빌드 결과가 발생합니다.

들어가며: “라이브러리 하나 추가하는데 하루가 걸려요"

"Boost 설치하다가 의존성 지옥에 빠졌어요”

C++에는 Python의 pip, Node.js의 npm처럼 표준 패키지 관리자가 없었습니다. 프로젝트마다 수동으로 소스 다운로드, CMake 설정, 링크 옵션을 맞추다 보면 의존성 지옥, 버전 충돌, 팀원마다 다른 빌드 결과가 발생합니다. “내 PC에서는 되는데요”는 C++ 개발자의 대표 멘트입니다. 비유하면 “창고에서 부품을 하나씩 찾아 조립하는 것”이 수동 관리라면, vcpkg·Conan은 “부품 목록만 주면 자동으로 맞는 버전을 가져와 조립해 주는 것”입니다.

flowchart LR
  subgraph problem[문제 상황]
    P1[의존성 지옥]
    P2[버전 충돌]
    P3[빌드 환경 불일치]
    P4[CI 실패]
  end
  subgraph solution[해결 방향]
    S1[vcpkg]
    S2[Conan]
    S3[시스템 패키지]
    S4[manifest 모드]
  end
  P1 --> S1
  P2 --> S2
  P3 --> S3
  P4 --> S4

이 글을 읽으면:

  • vcpkg, Conan, 시스템 패키지의 완전한 사용 예제를 익힐 수 있습니다.
  • 자주 발생하는 에러와 해결법을 알 수 있습니다.
  • 프로덕션 환경에서의 패턴과 체크리스트를 활용할 수 있습니다.

실무 적용 경험: 이 글은 대규모 C++ 프로젝트에서 실제로 겪은 문제와 해결 과정을 바탕으로 작성되었습니다. 책이나 문서에서 다루지 않는 실전 함정과 디버깅 팁을 포함합니다.

추가 문제 시나리오

시나리오 1: 팀원마다 다른 빌드 결과

새 팀원이 git clonecmake ...&& make를 실행했는데 OpenSSL을 찾을 수 없습니다 에러가 납니다. 수동으로 설치한 경로가 다르고, 버전도 제각각입니다. 시나리오 2: 라이브러리 A와 B가 충돌

프로젝트에서 libA(1.2)와 libB(2.0)를 둘 다 쓰는데, libB가 내부적으로 libA(1.0)를 요구합니다. 전이 의존성 충돌로 링크 에러가 납니다. 시나리오 3: CI에서만 실패

로컬에서는 빌드가 되는데, GitHub Actions에서 vcpkg 패키지를 찾을 수 없습니다 에러가 납니다. 캐시 설정·경로 설정이 로컬과 다릅니다. 시나리오 4: 프로덕션 빌드 재현 불가

6개월 전에 빌드한 바이너리와 동일한 결과를 내려고 하는데, vcpkg/Conan이 최신 버전을 가져와 ABI가 달라져 크래시가 납니다. 시나리오 5: 헤더만 있는 라이브러리 vs 바이너리

header-only 라이브러리는 빌드 없이 include만 하면 되는데, 빌드가 필요한 라이브러리와 섞여 있어 CMake 설정이 복잡해집니다.

시나리오특징권장 도구
팀 빌드 통일환경 동일화 필요vcpkg manifest, Conan
전이 의존성버전 충돌Conan (lockfile)
CI 재현성캐시·버전 고정vcpkg baseline, Conan lockfile
장기 재현성6개월+ 동일 빌드Conan revision, vcpkg overlay
헤더만빌드 불필요vcpkg/Conan 모두 지원

1. 패키지 관리 도구 비교

도구별 특징

도구장점단점적합한 프로젝트
vcpkgMicrosoft 지원, VS 통합, manifest 모드바이너리 캐시 제한적Windows/VS 중심, 팀 규모 중소
Conan버전·바이너리 캐시 강력, lockfile학습 곡선, 설정 복잡크로스 플랫폼, CI/CD, 대규모
시스템 패키지OS 패키지와 통합, 재배포 용이버전 고정 어려움Linux 서버, 배포 환경 고정

의사결정 흐름

flowchart TB
  subgraph input[입력]
    Q1[Windows 중심?]
    Q2[버전 고정 필수?]
    Q3[배포 환경 고정?]
  end
  subgraph decision[의사결정]
    D1{Visual Studio?}
    D2{lockfile 필요?}
    D3{apt/yum 사용?}
  end
  subgraph result[선택]
    R1[vcpkg]
    R2[Conan]
    R3[시스템 패키지]
  end
  Q1 --> D1
  Q2 --> D2
  Q3 --> D3
  D1 -->|Yes| R1
  D2 -->|Yes| R2
  D3 -->|Yes| R3

2. vcpkg 완전 예제

vcpkg 설치

# 1. vcpkg 클론
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
# 2. 부트스트랩 (Windows: bootstrap-vcpkg.bat, Unix: bash)
./bootstrap-vcpkg.sh
# 3. 환경 변수 (선택)
export VCPKG_ROOT=/path/to/vcpkg

Manifest 모드 (권장)

Manifest 모드는 프로젝트 루트에 vcpkg.json을 두고, 의존성을 선언하는 방식입니다. 프로젝트가 의존성을 소유합니다.

{
  "name": "my-project",
  "version": "1.0.0",
  "dependencies": [
    "boost-asio",
    "openssl",
    "spdlog",
    "nlohmann-json"
  ],
  "builtin-baseline": "2024.01.25"
}

설명:

  • builtin-baseline: vcpkg 버전 기준일. 이 날짜의 포트로 해시가 고정되어 재현 가능한 빌드가 됩니다.
  • dependencies: 필요한 패키지 목록. vcpkg가 자동으로 전이 의존성을 해결합니다.

CMake 연동 (Manifest 모드)

# CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 17)
# vcpkg 툴체인 파일 지정 (manifest 모드)
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
    CACHE STRING "VCPKG toolchain file")
# 또는 환경 변수로
# set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
find_package(PkgConfig REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(Boost REQUIRED COMPONENTS system)
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE
    spdlog::spdlog
    nlohmann_json::nlohmann_json
    OpenSSL::SSL
    Boost::Boost
)

vcpkg 버전 고정 (baseline)

{
  "name": "my-project",
  "version": "1.0.0",
  "dependencies": [
    {
      "name": "boost-asio",
      "version>=": "1.84.0"
    },
    {
      "name": "spdlog",
      "version>=": "1.12.0"
    }
  ],
  "builtin-baseline": "2024.01.25",
  "overrides": [
    {
      "name": "openssl",
      "version": "3.2.0"
    }
  ]
}

설명:

  • version>=: 최소 버전 요구
  • overrides: 전이 의존성 버전을 강제로 덮어씁니다. boost-asioopenssl 1.x를 요구해도 overrides로 3.2.0을 고정할 수 있습니다.

vcpkg 빌드 예제

# 프로젝트 루트에서
mkdir build && cd build
cmake ...-DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build .

vcpkg 오버레이 (커스텀 포트)

# CMakeLists.txt
set(VCPKG_OVERLAY_PORTS "${CMAKE_CURRENT_SOURCE_DIR}/custom-ports")
custom-ports/
  my-lib/
    portfile.cmake
    vcpkg.json
# custom-ports/my-lib/vcpkg.json
{
  "name": "my-lib",
  "version": "1.0.0",
  "description": "내부 라이브러리",
  "homepage": "https://github.com/myorg/my-lib",
  "license": "MIT",
  "supports": "windows | linux | osx"
}

3. Conan 완전 예제

Conan 설치

# pip로 설치
pip install conan
# 또는 pipx (격리)
pipx install conan
# 버전 확인
conan --version

conanfile.txt (레거시 방식)

[requires]
boost/1.84.0
openssl/3.2.0
spdlog/1.12.3
nlohmann_json/3.11.3
[generators]
CMakeDeps
CMakeToolchain
[options]
boost:shared=False
openssl:shared=False

conanfile.py (권장)

from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMakeDeps, cmake_layout
from conan.tools.scm import GitVersion
class MyProjectConan(ConanFile):
    name = "my-project"
    version = "1.0.0"
    settings = "os", "compiler", "build_type", "arch"
    generators = "CMakeDeps", "CMakeToolchain"
    def layout(self):
        cmake_layout(self)
    def requirements(self):
        self.requires("boost/1.84.0")
        self.requires("openssl/3.2.0")
        self.requires("spdlog/1.12.3")
        self.requires("nlohmann_json/3.11.3")
    def generate(self):
        tc = CMakeToolchain(self)
        tc.generate()
        deps = CMakeDeps(self)
        deps.generate()

프로젝트 구조 (Conan 2.x)

my-project/
  conanfile.py
  CMakeLists.txt
  src/
    main.cpp

Conan 설치 및 빌드

# 1. Conan 프로필 생성 (최초 1회)
conan profile detect
# 2. 의존성 설치 (conanfile.txt 사용 시)
conan install . --output-folder=build --build=missing
# 3. conanfile.py 사용 시
conan install . --output-folder=build --build=missing
# 4. CMake 빌드
cd build
cmake ...-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
cmake --build .

Conan lockfile (재현 가능 빌드)

# lockfile 생성
conan lock create .
# lockfile로 설치 (동일한 버전 보장)
conan install . --lockfile=conan.lock --output-folder=build

Conan CMakeLists.txt 연동

# CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 17)
# Conan이 생성한 파일들
find_package(spdlog CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(Boost REQUIRED COMPONENTS system)
add_executable(my_app src/main.cpp)
target_link_libraries(my_app PRIVATE
    spdlog::spdlog
    nlohmann_json::nlohmann_json
    OpenSSL::SSL
    Boost::Boost
)

Conan 옵션: 정적/동적 링크

# conanfile.py
def configure(self):
    self.options[boost].shared = False
    self.options[openssl].shared = False
# 설치 시 옵션 지정
conan install . -s build_type=Release -o boost:shared=False

Conan 원격 저장소

# 기본 원격 확인
conan remote list
# Conan Center (기본)
conan remote add conancenter https://center.conan.io
# 사내 저장소
conan remote add mycompany https://artifactory.mycompany.com/conan

4. 시스템 패키지 활용

apt (Ubuntu/Debian)

# 개발 패키지 설치 (헤더 + lib)
sudo apt update
sudo apt install -y libssl-dev libboost-all-dev
# CMake에서 찾기
# find_package(OpenSSL REQUIRED)
# find_package(Boost REQUIRED COMPONENTS system)

pkg-config 연동

# CMakeLists.txt
find_package(PkgConfig REQUIRED)
pkg_check_modules(OPENSSL REQUIRED openssl)
pkg_check_modules(SPDLOG REQUIRED spdlog)
target_include_directories(my_app PRIVATE ${OPENSSL_INCLUDE_DIRS})
target_link_libraries(my_app PRIVATE ${OPENSSL_LIBRARIES})

system 패키지와 vcpkg 혼용

# 시스템에 OpenSSL이 있으면 사용, 없으면 vcpkg
find_package(OpenSSL QUIET)
if(NOT OpenSSL_FOUND)
    find_package(OpenSSL REQUIRED)  # vcpkg에서
endif()

Dockerfile 예제 (시스템 패키지)

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
    build-essential \
    cmake \
    libssl-dev \
    libboost-all-dev \
    libspdlog-dev \
    nlohmann-json3-dev \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
RUN mkdir build && cd build && cmake ...&& cmake --build .

vcpkg in Docker

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
    build-essential \
    cmake \
    git \
    && rm -rf /var/lib/apt/lists/*
# vcpkg 설치
RUN git clone https://github.com/Microsoft/vcpkg.git /opt/vcpkg \
    && /opt/vcpkg/bootstrap-vcpkg.sh
ENV VCPKG_ROOT=/opt/vcpkg
ENV PATH="${VCPKG_ROOT}:${PATH}"
WORKDIR /app
COPY . .
RUN mkdir build && cd build \
    && cmake ...-DCMAKE_TOOLCHAIN_FILE=${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake \
    && cmake --build .

5. 자주 발생하는 에러와 해결법

에러 1: “Could not find a package configuration file”

증상: find_package(spdlog CONFIG REQUIRED) 에러 원인: vcpkg/Conan이 설치한 패키지 경로를 CMake가 찾지 못함

# ❌ 잘못된 예 — 툴체인 파일 없이 실행
cmake ..

해결법:

# ✅ vcpkg — 툴체인 파일 지정
cmake ...-DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake
# ✅ Conan — conan install 후 CMake
conan install . --output-folder=build
cd build && cmake ...-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake

에러 2: vcpkg “portfile failed”

증상: Error: vcpkg package installation failed 원인: 포트 빌드 실패, 의존성 누락, 플랫폼 미지원

# 해결 1: 빌드 로그 확인
vcpkg install spdlog --debug
# 해결 2: baseline 업데이트
# vcpkg.json의 builtin-baseline을 더 최신으로
# 해결 3: 특정 패키지 제외 후 수동 설치
# vcpkg.json에서 해당 패키지 제거, 시스템 패키지 사용

에러 3: Conan “version not found”

증상: ERROR: boost/1.99.0: not found in remote 원인: Conan Center에 해당 버전이 없음

# 해결: 사용 가능한 버전 확인
conan search boost --remote=conancenter
# 또는 conanfile.py에서 버전 수정
# self.requires("boost/1.84.0")  # 존재하는 버전으로

에러 4: ABI 충돌 (mixed compiler)

증상: 링크 시 undefined reference 또는 런타임 크래시 원인: vcpkg/Conan으로 빌드한 라이브러리와 앱의 컴파일러·버전이 다름

# ❌ 위험한 조합
# vcpkg: gcc-9로 빌드
# 앱: gcc-11로 빌드
# → 링크는 되지만 std::string ABI 등 불일치
# ✅ 해결: 동일 툴체인
# vcpkg와 앱 모두 같은 gcc 버전 사용
export CXX=g++-11
export CC=gcc-11

에러 5: “cannot open shared object file” (런타임)

증상: 빌드는 성공했는데 실행 시 libfoo.so: cannot open shared object file 원인: 동적 라이브러리 경로가 없음

# 해결 1: LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/path/to/vcpkg/installed/x64-linux/lib:$LD_LIBRARY_PATH
./my_app
# 해결 2: RPATH 빌드 시 설정
# CMakeLists.txt
set(CMAKE_INSTALL_RPATH "$ORIGIN")
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
# 해결 3: 정적 링크
# vcpkg: -DCMAKE_BUILD_TYPE=Release 사용 시 기본적으로 정적
# Conan: -o shared=False

에러 6: vcpkg manifest 모드에서 패키지 없음

증상: vcpkg.json을 두었는데 CMake가 패키지를 찾지 못함 원인: CMAKE_TOOLCHAIN_FILE이 vcpkg를 가리키지 않거나, vcpkg.json 경로가 잘못됨

# ✅ 올바른 설정
# vcpkg.json은 프로젝트 루트(CMakeLists.txt와 같은 위치)
# 프로젝트 루트에서 cmake -B build
# vcpkg/ 가 서브디렉터리면:
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
    CACHE STRING "VCPKG toolchain")

에러 7: Conan “lockfile out of date”

증상: conan.lock is out of date 원인: conanfile.py 또는 의존성 버전이 변경됨

# 해결: lockfile 재생성
conan lock create .
conan install . --lockfile=conan.lock --output-folder=build

증상: cannot open file 'libssl.lib' 원인: OpenSSL 등이 동적 링크로 빌드되었는데, 정적 링크를 시도하는 경우

# vcpkg: triplet 사용
# x64-windows-static
cmake ...-DCMAKE_TOOLCHAIN_FILE=....-DVCPKG_TARGET_TRIPLET=x64-windows-static
# vcpkg.json
"dependencies": [
    {"name": "openssl", "default-features": false, "features": [crypto]}
]

에러 9: 헤더 충돌 (multiple definitions)

증상: redefinition of 'struct foo' 또는 multiple definition 원인: vcpkg/Conan 패키지와 시스템 패키지가 동시에 include됨

# ❌ 위험: 시스템 경로가 먼저
include_directories(/usr/include)  # 시스템
target_link_libraries(my_app vcpkg::spdlog)  # vcpkg
# ✅ 해결: vcpkg/Conan 경로만 사용
# CMAKE_TOOLCHAIN_FILE 사용 시 vcpkg 경로가 우선
# target_link_libraries에만 의존하면 include 경로는 자동
target_link_libraries(my_app PRIVATE spdlog::spdlog)

에러 10: CI에서 vcpkg 빌드 타임아웃

증상: GitHub Actions에서 vcpkg 설치가 30분 넘게 걸림 해결: 캐시

# .github/workflows/build.yml
- name: Cache vcpkg
  uses: actions/cache@v4
  with:
    path: build/vcpkg_installed
    key: vcpkg-${{ runner.os }}-${{ hashFiles('vcpkg.json') }}
- name: Configure
  run: cmake -B build -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake

6. 모범 사례

1. Manifest / Lockfile 사용

원칙: 의존성을 코드로 선언하고, 버전을 고정합니다.

// vcpkg.json — builtin-baseline 필수
{
  "builtin-baseline": "2024.01.25",
  "dependencies": [spdlog]
}
# Conan — lockfile 커밋
conan lock create .
git add conan.lock

2. 프로젝트별 격리

원칙: 전역 설치보다 프로젝트별 설치를 사용합니다.

# vcpkg: manifest 모드 (프로젝트별)
# vcpkg.json이 프로젝트에 있음
# Conan: --output-folder=build (프로젝트별)
conan install . --output-folder=build

3. CI에서 재현 가능 빌드

# vcpkg: baseline 고정
# Conan: lockfile 사용
- run: conan install . --lockfile=conan.lock --output-folder=build

4. 의존성 최소화

// ❌ 나쁜 예 — 전체 Boost
"dependencies": [boost]
// ✅ 좋은 예 — 필요한 컴포넌트만
"dependencies": ["boost-asio", "boost-system"]

5. private vs public 의존성

# 라이브러리: PRIVATE — 내부 구현만 사용
target_link_libraries(my_lib PRIVATE spdlog::spdlog)
# 인터페이스 노출 시: PUBLIC
target_link_libraries(my_lib PUBLIC nlohmann_json::nlohmann_json)

6. 헤더 전용 라이브러리

# vcpkg/Conan 모두 header-only 지원
# find_package 후 target_link_libraries만 하면 include 경로 자동
find_package(nlohmann_json CONFIG REQUIRED)
target_link_libraries(my_app PRIVATE nlohmann_json::nlohmann_json)

7. 크로스 컴파일

# vcpkg: triplet
vcpkg install spdlog --triplet=arm64-linux
# Conan: profile
conan profile new arm
conan profile update settings.os=Linux arm
conan profile update settings.arch=armv8 arm
conan install . --profile=arm

7. 프로덕션 패턴

패턴 1: vcpkg + CMake Presets

// CMakePresets.json
{
  "version": 3,
  "configurePresets": [
    {
      "name": "vcpkg",
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake"
      }
    }
  ]
}
cmake --preset vcpkg

패턴 2: Conan + CMake FetchContent 대체

# CMakeLists.txt
# Conan이 의존성을 해결하므로 FetchContent 불필요
find_package(spdlog CONFIG REQUIRED)
# ...

패턴 3: 계층적 의존성 (라이브러리 → 앱)

my-project/
  libs/
    core/           # conanfile.py, vcpkg.json
    network/        # core 의존
  apps/
    server/         # core, network 의존
# libs/network/conanfile.py
def requirements(self):
    self.requires("core/1.0.0")  # 내부 패키지
    self.requires("boost/1.84.0")

패턴 4: Docker 멀티스테이지 (vcpkg)

# Stage 1: vcpkg로 의존성 빌드
FROM ubuntu:22.04 AS vcpkg
RUN apt-get update && apt-get install -y git cmake build-essential
RUN git clone https://github.com/Microsoft/vcpkg.git /vcpkg
WORKDIR /vcpkg
RUN ./bootstrap-vcpkg.sh
COPY vcpkg.json .
RUN ./vcpkg install --x-install-root=installed
# Stage 2: 앱 빌드
FROM ubuntu:22.04 AS build
COPY --from=vcpkg /vcpkg/installed /vcpkg_installed
COPY . /app
WORKDIR /app/build
RUN cmake ...-DCMAKE_TOOLCHAIN_FILE=/vcpkg_installed/scripts/buildsystems/vcpkg.cmake
RUN cmake --build .
# Stage 3: 최종 이미지
FROM ubuntu:22.04
COPY --from=build /app/build/my_app /usr/local/bin/

패턴 5: 버전 매트릭스 (CI)

# .github/workflows/build.yml
strategy:
  matrix:
    vcpkg_baseline: ["2024.01.25", "2024.06.20"]
    compiler: [gcc-11, clang-14]

패턴 6: 빌드 시나리오 시퀀스

sequenceDiagram
    participant Dev as 개발자
    participant CMake as CMake
    participant vcpkg as vcpkg
    participant Build as 빌드
    Dev->>CMake: cmake -B build
    CMake->>vcpkg: vcpkg.json 읽기
    vcpkg->>vcpkg: 설치/캐시 확인
    vcpkg->>CMake: 툴체인 파일 제공
    CMake->>CMake: find_package
    CMake->>Build: 구성 완료
    Dev->>Build: cmake --build

프로덕션 체크리스트

- [ ] vcpkg.json 또는 conanfile.py로 의존성 선언
- [ ] builtin-baseline 또는 conan.lock로 버전 고정
- [ ] CI에서 캐시 사용 (vcpkg_installed, Conan cache)
- [ ] 동일 툴체인으로 빌드 (컴파일러·버전)
- [ ] 정적 링크 고려 (배포 환경에 lib 없을 때)
- [ ] Dockerfile에 멀티스테이지 적용
- [ ] 의존성 업데이트 시 ABI 검증

8. 정리

도구핵심 명령버전 고정CI 적합
vcpkgvcpkg.json + manifestbuiltin-baseline, overrides
Conanconanfile.py, conan installlockfile
시스템apt/yum install패키지 버전제한적

선택 가이드

  • Windows + Visual Studio: vcpkg
  • 크로스 플랫폼 + lockfile: Conan
  • Linux 서버 배포: 시스템 패키지 또는 vcpkg/Conan

핵심 원칙

  1. 의존성을 코드로 선언 — vcpkg.json, conanfile.py
  2. 버전 고정 — baseline, lockfile, overrides
  3. 동일 툴체인 — ABI 충돌 방지
  4. CI 캐시 — 빌드 시간 단축
  5. 의존성 최소화 — 필요한 패키지만

자주 묻는 질문 (FAQ)

Q. vcpkg와 Conan을 같이 쓸 수 있나요?

A. 권장하지 않습니다. 같은 프로젝트에서 둘을 혼용하면 include 경로·라이브러리 경로가 충돌할 수 있습니다. 하나를 선택해 일관되게 사용하세요.

Q. 사내 프라이빗 라이브러리는 어떻게 하나요?

A. vcpkg: overlay-ports로 커스텀 포트 추가. Conan: 사내 Artifactory 등에 Conan 원격 저장소 추가 후 conan install--remote 지정.

Q. 헤더 전용 라이브러리만 쓸 때도 vcpkg/Conan이 필요한가요?

A. 단순히 include만 하면 된다면 Git submodule이나 FetchContent로도 가능합니다. 다만 vcpkg/Conan을 쓰면 버전 관리·팀 통일이 일관됩니다.

Q. 선행으로 읽으면 좋은 글은?

A. ABI 호환성(#55-4), 동적 로딩(#55-2), 크로스 플랫폼(#55-4)을 먼저 읽으면 이해가 쉽습니다. 한 줄 요약: vcpkg·Conan·시스템 패키지로 의존성 지옥을 벗어나고, 재현 가능한 빌드를 구축할 수 있습니다.

참고 자료


관련 글

심화 부록: 구현·운영 관점

이 부록은 앞선 본문에서 다룬 주제(「C++ 패키지 관리 완벽 가이드 | vcpkg·Conan·시스템 패키지·프로덕션 패턴 [#55-6]」)를 구현·런타임·운영 관점에서 다시 압축합니다. 도메인별 세부 구현은 글마다 다르지만, 입력 검증 → 핵심 연산 → 부작용(I/O·네트워크·동시성) → 관측의 흐름으로 장애를 나누면 원인 추적이 빨라집니다.

내부 동작과 핵심 메커니즘

flowchart TD
  A[입력·요청·이벤트] --> B[파싱·검증·디코딩]
  B --> C[핵심 연산·상태 전이]
  C --> D[부작용: I/O·네트워크·동시성]
  D --> E[결과·관측·저장]
sequenceDiagram
  participant C as 클라이언트/호출자
  participant B as 경계(런타임·게이트웨이·프로세스)
  participant D as 의존성(API·DB·큐·파일)
  C->>B: 요청/이벤트
  B->>D: 조회·쓰기·RPC
  D-->>B: 지연·부분 실패·재시도 가능
  B-->>C: 응답 또는 오류(코드·상관 ID)
  • 불변 조건(Invariant): 버퍼 경계, 프로토콜 상태, 트랜잭션 격리, FD 상한 등 단계별로 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
  • 결정성: 순수 층과 시간·네트워크·스케줄에 의존하는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
  • 경계 비용: 직렬화, 인코딩, syscall 횟수, 락 경합, 할당·GC, 캐시 미스를 의심 목록에 둡니다.
  • 백프레셔: 생산자가 소비자보다 빠를 때 버퍼·큐·스트림에서 속도를 줄이는 신호를 어디에 둘지 정의합니다.

프로덕션 운영 패턴

영역운영 관점 질문
관측성요청 단위 상관 ID, 에러율·지연 p95/p99, 의존성 타임아웃·재시도가 대시보드에 보이는가
안전성입력 검증·권한·비밀·감사 로그가 코드 경로마다 일관적인가
신뢰성재시도는 멱등 연산에만 적용되는가, 서킷 브레이커·백오프·DLQ가 있는가
성능캐시·배치 크기·커넥션 풀·인덱스·백프레셔가 데이터 규모에 맞는가
배포롤백 룬북, 카나리/블루그린, 마이그레이션·피처 플래그가 문서화되어 있는가
용량피크 트래픽·디스크·FD·스레드 풀 상한을 주기적으로 검증하는가

스테이징은 데이터 양·네트워크 RTT·동시성을 프로덕션에 가깝게 맞출수록 재현율이 올라갑니다.

확장 예시: 엔드투엔드 미니 시나리오

앞선 본문 주제(「C++ 패키지 관리 완벽 가이드 | vcpkg·Conan·시스템 패키지·프로덕션 패턴 [#55-6]」)를 배포·운영 흐름에 맞춰 옮긴 체크리스트입니다. 도메인에 맞게 단계 이름만 바꿔 적용할 수 있습니다.

  1. 입력 계약 고정: 스키마·버전·최대 페이로드·타임아웃·에러 코드를 경계에 둔다.
  2. 핵심 경로 계측: 요청 ID, 단계별 지연, 외부 호출 결과 코드를 로그·메트릭·트레이스에서 한 흐름으로 본다.
  3. 실패 주입: 의존성 타임아웃·5xx·부분 데이터·락 대기를 스테이징에서 재현한다.
  4. 호환·롤백: 설정/마이그레이션/클라이언트 버전을 되돌릴 수 있는지 확인한다.
  5. 부하 후 검증: 피크 대비 p95/p99, 에러율, 리소스 상한, 알림 임계값을 점검한다.
handle(request):
  ctx = newCorrelationId()
  validated = validateSchema(request)
  authorize(validated, ctx)
  result = domainCore(validated)
  persistOrEmit(result, idempotentKey)
  recordMetrics(ctx, latency, outcome)
  return result

문제 해결(Troubleshooting)

증상가능 원인조치
간헐적 실패레이스, 타임아웃, 외부 의존성, DNS최소 재현 스크립트, 분산 트레이스·로그 상관관계, 재시도·서킷 설정 점검
성능 저하N+1, 동기 I/O, 락 경합, 과도한 직렬화, 캐시 미스프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거
메모리 증가캐시 무제한, 구독/리스너 누수, 대용량 버퍼, 커넥션 미반납상한·TTL·힙/FD 스냅샷 비교
빌드·배포만 실패환경 변수, 권한, 플랫폼 차이, lockfileCI 로그와 로컬 diff, 런타임·이미지 버전 핀
설정 불일치프로필·시크릿·기본값, 리전스키마 검증된 설정 단일 소스와 배포 매트릭스 표준화
데이터 불일치비멱등 재시도, 부분 쓰기, 캐시 무효화 누락멱등 키·아웃박스·트랜잭션 경계 재검토

권장 순서: (1) 최소 재현 (2) 최근 변경 범위 축소 (3) 환경·의존성 차이 (4) 관측으로 가설 검증 (5) 수정 후 회귀·부하 테스트.

배포 전에는 git addgit commitgit pushnpm run deploy 순서를 권장합니다.


같이 보면 좋은 글 (내부 링크)

이 주제와 연결되는 다른 글입니다.


이 글에서 다루는 키워드 (관련 검색어)

C++, 패키지관리, vcpkg, Conan, CMake, 의존성관리, 빌드시스템 등으로 검색하시면 이 글이 도움이 됩니다.