์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์˜ ์ƒˆ๋กœ์šด ์‹œ๋Œ€: Conan๊ณผ vcpkg๋กœ ์˜์กด์„ฑ ๊ด€๋ฆฌ ์™„๋ฒฝ ์ •๋ณตํ•˜๊ธฐ

๐Ÿš€ C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์˜ ์ƒˆ๋กœ์šด ์‹œ๋Œ€: Conan๊ณผ vcpkg๋กœ ์˜์กด์„ฑ ๊ด€๋ฆฌ ์™„๋ฒฝ ์ •๋ณตํ•˜๊ธฐ

ํ˜„๋Œ€์ ์ธ C++ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ•„์ˆ˜ ๋„๊ตฌ๋“ค์„ ์นœ๊ตฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๐Ÿ‘‹ ์•ˆ๋…•! C++ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๋•Œ๋ฌธ์— ๋จธ๋ฆฌ ์•„ํŒ ๋˜ ๊ฒฝํ—˜ ์žˆ์ง€? ํ—ค๋” ํŒŒ์ผ ์ฐพ์•„์„œ ๋ณต์‚ฌํ•˜๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ ์„ค์ •ํ•˜๊ณ , ๋ฒ„์ „ ์ถฉ๋Œ๋กœ ๋ฐค์ƒˆ ๋””๋ฒ„๊น…ํ•˜๊ณ ... ์ •๋ง ๋”์ฐํ•˜์ง€ ์•Š์•„?

์˜ค๋Š˜์€ ๊ทธ๋Ÿฐ ๊ณ ๋ฏผ์„ ํ•œ ๋ฐฉ์— ๋‚ ๋ ค์ค„ Conan๊ณผ vcpkg๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ! ์ด ์นœ๊ตฌ๋“ค์„ ์•Œ๊ณ  ๋‚˜๋ฉด C++ ๊ฐœ๋ฐœ์ด ์ •๋ง ํŽธํ•ด์ง„๋‹ค๊ณ  ์žฅ๋‹ดํ•  ์ˆ˜ ์žˆ์–ด. ๐Ÿ˜Ž

์žฌ๋Šฅ๋„ท์—์„œ๋„ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋Ÿฐ ํ˜„๋Œ€์ ์ธ ๋„๊ตฌ ํ™œ์šฉ๋ฒ•์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์˜ค๋Š˜ ์ด ๊ธ€์„ ํ†ตํ•ด ๋„ˆ๋„ C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์˜ ๋‹ฌ์ธ์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ!

Conan ํŒŒ์ด์ฌ ๊ธฐ๋ฐ˜ vcpkg MS ๊ณต์‹ VS ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐ„ํŽธํ•œ ์„ค์น˜

๐Ÿค” ์™œ C++์—๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ํ•„์š”ํ• ๊นŒ?

๋‹ค๋ฅธ ์–ธ์–ด๋“ค์„ ๋ณด๋ฉด ์ •๋ง ๋ถ€๋Ÿฝ์ง€ ์•Š์•„? Python์—๋Š” pip๊ฐ€ ์žˆ๊ณ , JavaScript์—๋Š” npm์ด ์žˆ๊ณ , Rust์—๋Š” cargo๊ฐ€ ์žˆ์ž–์•„. ๊ทธ๋Ÿฐ๋ฐ C++๋Š”... ์Œ, ์—ญ์‚ฌ๊ฐ€ ์˜ค๋ž˜๋œ ๋งŒํผ ๋ณต์žกํ•œ ์‚ฌ์—ฐ์ด ์žˆ์–ด. ๐Ÿ“š

C++๋Š” 1980๋…„๋Œ€๋ถ€ํ„ฐ ์‚ฌ์šฉ๋˜์–ด ์˜จ ์–ธ์–ด๋ผ์„œ, ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ผ๋Š” ๊ฐœ๋…์ด ์ƒ๊ธฐ๊ธฐ ์ „๋ถ€ํ„ฐ ์กด์žฌํ–ˆ์–ด. ๊ทธ๋ž˜์„œ ์ „ํ†ต์ ์œผ๋กœ๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ–ˆ์ง€:

๐Ÿ˜ฐ ์ „ํ†ต์ ์ธ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ์˜ ๊ณ ํ†ต

1. ์ˆ˜๋™ ๋‹ค์šด๋กœ๋“œ
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์— ๊ฐ€์„œ ์†Œ์Šค์ฝ”๋“œ๋‚˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ–ˆ์–ด. ๋ฒ„์ „๋„ ์ง์ ‘ ํ™•์ธํ•˜๊ณ  ๋ง์ด์•ผ.

2. ๋นŒ๋“œ ์„ค์ • ์ง€์˜ฅ
CMakeLists.txt๋‚˜ Makefile์— include ๊ฒฝ๋กœ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ผ์ผ์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์ง€. ๊ฒฝ๋กœ ํ•˜๋‚˜ ํ‹€๋ฆฌ๋ฉด? ์ปดํŒŒ์ผ ์—๋Ÿฌ์˜ ํ–ฅ์—ฐ! ๐Ÿ”ฅ

3. ๋ฒ„์ „ ์ถฉ๋Œ
ํ”„๋กœ์ ํŠธ A๋Š” Boost 1.70์ด ํ•„์š”ํ•œ๋ฐ, ํ”„๋กœ์ ํŠธ B๋Š” Boost 1.75๊ฐ€ ํ•„์š”ํ•˜๋ฉด? ์‹œ์Šคํ…œ์— ๋‘ ๋ฒ„์ „์„ ๋™์‹œ์— ๊ด€๋ฆฌํ•˜๋Š” ๊ฑด ์ •๋ง ์•…๋ชฝ์ด์—ˆ์–ด.

4. ํ”Œ๋žซํผ ์˜์กด์„ฑ
Windows์—์„œ ์ž˜ ๋Œ์•„๊ฐ€๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ Linux๋กœ ์˜ฎ๊ธฐ๋ฉด? ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•ด์•ผ ํ–ˆ์–ด. ๐Ÿ˜ญ

์ด๋Ÿฐ ๋ฌธ์ œ๋“ค ๋•Œ๋ฌธ์— C++ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์˜ค๋žซ๋™์•ˆ "ํ‘œ์ค€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž"๋ฅผ ์›ํ–ˆ์–ด. ๊ทธ๋ฆฌ๊ณ  ๋“œ๋””์–ด 2010๋…„๋Œ€ ์ค‘๋ฐ˜๋ถ€ํ„ฐ ๋ณธ๊ฒฉ์ ์ธ ํ•ด๊ฒฐ์ฑ…๋“ค์ด ๋“ฑ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€!

๐ŸŽฏ Conan: ํŒŒ์ด์ฌ ๊ธฐ๋ฐ˜์˜ ๊ฐ•๋ ฅํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž

Conan์€ 2016๋…„์— JFrog๋ผ๋Š” ํšŒ์‚ฌ์—์„œ ๋งŒ๋“  C/C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์•ผ. ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์„œ ์„ค์น˜๋„ ์‰ฝ๊ณ , ํฌ๋กœ์Šค ํ”Œ๋žซํผ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ด. ๐Ÿ

๐Ÿ’ก Conan์˜ ํ•ต์‹ฌ ์ฒ ํ•™
Conan์€ "๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ"์— ์ง‘์ค‘ํ•ด. ์ฆ‰, ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋งค๋ฒˆ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„ ์ ˆ์•ฝ์ด์ง€!

โš™๏ธ Conan ์„ค์น˜ํ•˜๊ธฐ

Conan ์„ค์น˜๋Š” ์ •๋ง ๊ฐ„๋‹จํ•ด. Python์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด pip๋กœ ํ•œ ์ค„์ด๋ฉด ๋์ด์•ผ:

ํ„ฐ๋ฏธ๋„ / ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ
pip install conan

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฒ„์ „์„ ํ™•์ธํ•ด๋ณด์ž:

conan --version

Conan 2.0 ์ด์ƒ์ด ์„ค์น˜๋˜์—ˆ๋‹ค๋ฉด ์ค€๋น„ ์™„๋ฃŒ! โœ…

๐Ÿ“ฆ Conan์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๊ธฐ

์‹ค์ œ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ๊ฒŒ ์ œ์ผ ๋น ๋ฅด์ง€? ์œ ๋ช…ํ•œ JSON ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ nlohmann_json์„ ์„ค์น˜ํ•ด๋ณผ๊ฒŒ.

Step 1: conanfile.txt ์ž‘์„ฑ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— conanfile.txt ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด:
[requires]
nlohmann_json/3.11.2

[generators]
CMakeDeps
CMakeToolchain

[options]

[imports]

์ด ํŒŒ์ผ์ด ๋ญ˜ ์˜๋ฏธํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณผ๊นŒ? ๐Ÿ”

[requires]: ํ•„์š”ํ•œ ํŒจํ‚ค์ง€์™€ ๋ฒ„์ „์„ ๋ช…์‹œํ•ด. ์—ฌ๊ธฐ์„œ๋Š” nlohmann_json ๋ฒ„์ „ 3.11.2๋ฅผ ์š”์ฒญํ–ˆ์–ด.

[generators]: CMake์™€ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ผ๋“ค์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค˜. CMakeDeps๋Š” ์˜์กด์„ฑ ์ •๋ณด๋ฅผ, CMakeToolchain์€ ๋นŒ๋“œ ์„ค์ •์„ ๋งŒ๋“ค์–ด์ค˜.

[options]: ํŒจํ‚ค์ง€๋ณ„ ๋นŒ๋“œ ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์ง€๊ธˆ์€ ๋น„์›Œ๋’€์ง€๋งŒ, ๋‚˜์ค‘์— ํ•„์š”ํ•˜๋ฉด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด.

[imports]: ํŠน์ • ํŒŒ์ผ๋“ค์„ ํ”„๋กœ์ ํŠธ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ด.

Step 2: ํŒจํ‚ค์ง€ ์„ค์น˜

์ด์ œ ์‹ค์ œ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด๋ณด์ž:
mkdir build
cd build
conan install .. --build=missing

--build=missing ์˜ต์…˜์€ ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ์†Œ์Šค์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•˜๋ผ๋Š” ์˜๋ฏธ์•ผ. ์ฒ˜์Œ์—๋Š” ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์–ด. โฐ

Step 3: CMakeLists.txt ์ž‘์„ฑ

์ด์ œ CMake ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์ž:
cmake_minimum_required(VERSION 3.15)
project(MyProject)

set(CMAKE_CXX_STANDARD 17)

# Conan์ด ์ƒ์„ฑํ•œ ํŒŒ์ผ๋“ค์„ ์ฐพ์•„
find_package(nlohmann_json REQUIRED)

add_executable(main main.cpp)
target_link_libraries(main nlohmann_json::nlohmann_json)
Step 4: ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ๋นŒ๋“œ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž (main.cpp):
#include <nlohmann/json.hpp>
#include <iostream>

using json = nlohmann::json;

int main() {
    json j;
    j["name"] = "Conan";
    j["type"] = "Package Manager";
    j["awesome"] = true;
    
    std::cout << j.dump(4) << std::endl;
    return 0;
}

์ด์ œ ๋นŒ๋“œํ•ด๋ณด์ž:

cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
cmake --build .

์‹คํ–‰ํ•˜๋ฉด ์˜ˆ์˜๊ฒŒ ํฌ๋งท๋œ JSON์ด ์ถœ๋ ฅ๋  ๊ฑฐ์•ผ! ๐ŸŽ‰

๐Ÿ”ง Conan์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค

1. ํ”„๋กœํŒŒ์ผ ๊ด€๋ฆฌ

Conan์€ "ํ”„๋กœํŒŒ์ผ"์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ์„ค์ •์„ ๊ด€๋ฆฌํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, Debug์šฉ ํ”„๋กœํŒŒ์ผ๊ณผ Release์šฉ ํ”„๋กœํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด:

# Debug ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ
conan profile detect --force

# ํ”„๋กœํŒŒ์ผ ํ™•์ธ
conan profile show default

ํ”„๋กœํŒŒ์ผ ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•ด์„œ ์ปดํŒŒ์ผ๋Ÿฌ, ๋นŒ๋“œ ํƒ€์ž…, ์•„ํ‚คํ…์ฒ˜ ๋“ฑ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด.

2. ์›๊ฒฉ ์ €์žฅ์†Œ ๊ด€๋ฆฌ

Conan์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ConanCenter๋ผ๋Š” ๊ณต์‹ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํšŒ์‚ฌ ๋‚ด๋ถ€ ์ €์žฅ์†Œ๋‚˜ ๊ฐœ์ธ ์ €์žฅ์†Œ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด:

# ์›๊ฒฉ ์ €์žฅ์†Œ ๋ชฉ๋ก ํ™•์ธ
conan remote list

# ์ƒˆ ์ €์žฅ์†Œ ์ถ”๊ฐ€
conan remote add my-repo https://my-company.com/artifactory/api/conan/conan-local

์ด๊ฑด ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ์—„์ฒญ ์œ ์šฉํ•ด! ํšŒ์‚ฌ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ . ๐Ÿข

3. conanfile.py๋กœ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ

conanfile.txt๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ œํ•œ์ ์ด์•ผ. ๋” ๋ณต์žกํ•œ ์„ค์ •์ด ํ•„์š”ํ•˜๋ฉด conanfile.py๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด:

from conan import ConanFile
from conan.tools.cmake import CMake, cmake_layout

class MyProjectConan(ConanFile):
    name = "myproject"
    version = "1.0"
    settings = "os", "compiler", "build_type", "arch"
    
    def requirements(self):
        self.requires("nlohmann_json/3.11.2")
        self.requires("fmt/9.1.0")
        
    def build_requirements(self):
        self.tool_requires("cmake/3.25.0")
        
    def layout(self):
        cmake_layout(self)
        
    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

Python ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋‹ˆ๊นŒ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ ๋“ฑ์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์ •๋ง ๊ฐ•๋ ฅํ•˜์ง€? ๐Ÿ’ช

๐ŸชŸ vcpkg: Microsoft๊ฐ€ ๋งŒ๋“  ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž

vcpkg๋Š” Microsoft๊ฐ€ 2016๋…„์— ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœํ•œ C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์•ผ. ์ฒ˜์Œ์—๋Š” Windows ์ „์šฉ์œผ๋กœ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ Linux์™€ macOS๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ด. ๐ŸŒ

๐Ÿ’ก vcpkg์˜ ํ•ต์‹ฌ ์ฒ ํ•™
vcpkg๋Š” "์†Œ์Šค ๊ธฐ๋ฐ˜ ๋นŒ๋“œ"๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•ด. ์ฆ‰, ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์„œ ํ˜„์žฌ ์‹œ์Šคํ…œ์— ๋งž๊ฒŒ ์ปดํŒŒ์ผํ•ด. ์ด๊ฒŒ ์ข€ ๋А๋ฆด ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๊ฑฐ์˜ ์—†์–ด!

โš™๏ธ vcpkg ์„ค์น˜ํ•˜๊ธฐ

vcpkg ์„ค์น˜๋Š” Git ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด:

Windows (PowerShell)
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
Linux / macOS
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh

๋ถ€ํŠธ์ŠคํŠธ๋žฉ์ด ์™„๋ฃŒ๋˜๋ฉด vcpkg ์‹คํ–‰ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ผ. ์ด์ œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋””์„œ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด:

Windows
setx VCPKG_ROOT "C:\path\to\vcpkg"
setx PATH "%PATH%;%VCPKG_ROOT%"
Linux / macOS (bash)
export VCPKG_ROOT=/path/to/vcpkg
export PATH=$VCPKG_ROOT:$PATH

๐Ÿ“ฆ vcpkg๋กœ ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๊ธฐ

vcpkg์˜ ์‚ฌ์šฉ๋ฒ•์€ ์ •๋ง ์ง๊ด€์ ์ด์•ผ. ํŒจํ‚ค์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์„ค์น˜ํ•˜๋Š” ๊ฒŒ ํ•œ ์ค„์ด๋ฉด ๋๋‚˜๊ฑฐ๋“ !

Step 1: ํŒจํ‚ค์ง€ ๊ฒ€์ƒ‰

๋จผ์ € ์–ด๋–ค ํŒจํ‚ค์ง€๋“ค์ด ์žˆ๋Š”์ง€ ๊ฒ€์ƒ‰ํ•ด๋ณด์ž:
vcpkg search json

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด "json"์ด ํฌํ•จ๋œ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋‚˜์™€. nlohmann-json, jsoncpp, rapidjson ๋“ฑ๋“ฑ ๋งŽ์€ ์˜ต์…˜์ด ์žˆ์–ด. ๐Ÿ”Ž

Step 2: ํŒจํ‚ค์ง€ ์„ค์น˜

์›ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์•˜์œผ๋ฉด ์„ค์น˜ํ•ด๋ณด์ž:
vcpkg install nlohmann-json

์ด ๋ช…๋ น์–ด ํ•˜๋‚˜๋กœ ๋์ด์•ผ! vcpkg๊ฐ€ ์•Œ์•„์„œ ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ์ปดํŒŒ์ผํ•˜๊ณ , ์„ค์น˜ํ•ด์ค˜. ์ฒ˜์Œ์—๋Š” ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์–ด. โ˜•

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ
vcpkg๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ x86 ์•„ํ‚คํ…์ฒ˜์šฉ์œผ๋กœ ๋นŒ๋“œํ•ด. x64๊ฐ€ ํ•„์š”ํ•˜๋ฉด vcpkg install nlohmann-json:x64-windows์ฒ˜๋Ÿผ ํŠธ๋ฆฌํ”Œ๋ ›์„ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•ด!
Step 3: Visual Studio / CMake ํ†ตํ•ฉ

vcpkg๋ฅผ Visual Studio์™€ ํ†ตํ•ฉํ•˜๋ ค๋ฉด:
vcpkg integrate install

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Visual Studio๊ฐ€ ์ž๋™์œผ๋กœ vcpkg์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋“ค์„ ์ธ์‹ํ•ด. ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ๋ฐ”๋กœ #include๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด! ๐ŸŽฏ

CMake๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด toolchain ํŒŒ์ผ์„ ์ง€์ •ํ•ด์ค˜:

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]/scripts/buildsystems/vcpkg.cmake
cmake --build build

๐Ÿ“ vcpkg.json์œผ๋กœ ์˜์กด์„ฑ ๊ด€๋ฆฌํ•˜๊ธฐ

vcpkg๋„ Conan์ฒ˜๋Ÿผ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์„ ์ง€์›ํ•ด. vcpkg.json์ด๋ผ๋Š” ํŒŒ์ผ๋กœ ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์–ด:

{
  "name": "my-awesome-project",
  "version": "1.0.0",
  "dependencies": [
    "nlohmann-json",
    "fmt",
    "spdlog"
  ],
  "builtin-baseline": "2023.11.20"
}

์ด ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ๋‘๊ณ  CMake๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, vcpkg๊ฐ€ ์ž๋™์œผ๋กœ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ด์ค˜. ํŒ€์›๋“ค๊ณผ ๊ณต์œ ํ•  ๋•Œ ์—„์ฒญ ํŽธ๋ฆฌํ•˜์ง€! ๐Ÿ‘ฅ

builtin-baseline์ด ๋ญ์•ผ?

builtin-baseline์€ vcpkg ์ €์žฅ์†Œ์˜ ํŠน์ • ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌ์ผœ. ์ด๊ฑธ ๋ช…์‹œํ•˜๋ฉด ๋ชจ๋“  ํŒ€์›์ด ๋™์ผํ•œ ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ผ. ๋ฒ„์ „ ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์–ด!

์ตœ์‹  baseline์„ ํ™•์ธํ•˜๋ ค๋ฉด vcpkg GitHub ์ €์žฅ์†Œ์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋ผ.

๐Ÿ”ง vcpkg์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค

1. ํŠธ๋ฆฌํ”Œ๋ ›(Triplet) ์‹œ์Šคํ…œ

vcpkg๋Š” "ํŠธ๋ฆฌํ”Œ๋ ›"์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ๋นŒ๋“œ ํƒ€๊ฒŸ์„ ๊ด€๋ฆฌํ•ด. ํŠธ๋ฆฌํ”Œ๋ ›์€ ํ”Œ๋žซํผ, ์•„ํ‚คํ…์ฒ˜, ๋งํ‚น ๋ฐฉ์‹์„ ์กฐํ•ฉํ•œ ๊ฑฐ์•ผ:

# Windows 64๋น„ํŠธ, ๋™์  ๋งํ‚น
vcpkg install boost:x64-windows

# Windows 64๋น„ํŠธ, ์ •์  ๋งํ‚น
vcpkg install boost:x64-windows-static

# Linux 64๋น„ํŠธ
vcpkg install boost:x64-linux

# macOS ARM64
vcpkg install boost:arm64-osx

์ปค์Šคํ…€ ํŠธ๋ฆฌํ”Œ๋ ›๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. triplets/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด ๋ผ! ๐ŸŽจ

2. ๋ฐ”์ด๋„ˆ๋ฆฌ ์บ์‹ฑ

vcpkg๋Š” ์†Œ์Šค ๊ธฐ๋ฐ˜์ด๋ผ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ์บ์‹ฑ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ํ•œ ๋ฒˆ ๋นŒ๋“œํ•œ ํŒจํ‚ค์ง€๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด:

# ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ
vcpkg install boost --binarysource=clear;files,C:\vcpkg-cache,readwrite

# Azure Blob Storage ์บ์‹œ (ํŒ€ ๊ณต์œ ์šฉ)
vcpkg install boost --binarysource=clear;x-azblob,https://account.blob.core.windows.net/container,sas-token

ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ Azure๋‚˜ AWS S3 ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์บ์‹œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด, ๋ชจ๋“  ํŒ€์›์ด ๋นŒ๋“œ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด! โšก

3. ์˜ค๋ฒ„๋ ˆ์ด ํฌํŠธ

๊ณต์‹ vcpkg ์ €์žฅ์†Œ์— ์—†๋Š” ํŒจํ‚ค์ง€๋‚˜, ๊ธฐ์กด ํŒจํ‚ค์ง€๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ "์˜ค๋ฒ„๋ ˆ์ด ํฌํŠธ"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด:

# ์ปค์Šคํ…€ ํฌํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir my-ports
mkdir my-ports/my-custom-lib

# portfile.cmake ์ž‘์„ฑ
# (ํŒจํ‚ค์ง€ ๋นŒ๋“œ ๋ฐฉ๋ฒ• ์ •์˜)

# ์˜ค๋ฒ„๋ ˆ์ด ํฌํŠธ๋กœ ์„ค์น˜
vcpkg install my-custom-lib --overlay-ports=./my-ports

์ด ๊ธฐ๋Šฅ์€ ํšŒ์‚ฌ ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ •๋ง ์œ ์šฉํ•ด!

Conan vs vcpkg ๋น„๊ต Conan vcpkg ์„ค์น˜: pip install conan ์„ค์น˜: Git ํด๋ก  + ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ฐ”์ด๋„ˆ๋ฆฌ ์šฐ์„  ์†Œ์Šค ๋นŒ๋“œ ์šฐ์„  Python ๊ธฐ๋ฐ˜ C++ ๊ธฐ๋ฐ˜ ํ”„๋กœํŒŒ์ผ ์‹œ์Šคํ…œ ํŠธ๋ฆฌํ”Œ๋ › ์‹œ์Šคํ…œ conanfile.txt/py vcpkg.json JFrog ์ƒํƒœ๊ณ„ MS ์ƒํƒœ๊ณ„ ์œ ์—ฐํ•œ ์„ค์ • ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ ํ•™์Šต ๊ณก์„  ์žˆ์Œ ๋น ๋ฅธ ์‹œ์ž‘ ํŒจํ‚ค์ง€: 1000+ ํŒจํ‚ค์ง€: 2000+

โš–๏ธ Conan vs vcpkg: ์–ด๋–ค ๊ฑธ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ?

์ž, ์ด์ œ ๋‘ ๋„๊ตฌ๋ฅผ ๋ชจ๋‘ ์‚ดํŽด๋ดค์œผ๋‹ˆ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์งˆ๋ฌธ์ด ๋‚จ์•˜์–ด. "๋‚˜๋Š” ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ•˜์ง€?" ๐Ÿคท

์ •๋‹ต์€... ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฑฐ์•ผ! ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ๊ฑฐ๋“ . ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•ด๋ณผ๊ฒŒ.

๋น„๊ต ํ•ญ๋ชฉ Conan vcpkg
์„ค์น˜ ๋‚œ์ด๋„ ์‰ฌ์›€ (pip ํ•œ ์ค„) ๋ณดํ†ต (Git ํด๋ก  ํ•„์š”)
๋นŒ๋“œ ์†๋„ ๋น ๋ฆ„ (๋ฐ”์ด๋„ˆ๋ฆฌ ๋‹ค์šด๋กœ๋“œ) ๋А๋ฆผ (์†Œ์Šค ์ปดํŒŒ์ผ)
ํ˜ธํ™˜์„ฑ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜์„ฑ ์ด์Šˆ ๊ฐ€๋Šฅ ๋งค์šฐ ๋†’์Œ (ํ˜„์žฌ ํ™˜๊ฒฝ์— ๋งž์ถค)
ํŒจํ‚ค์ง€ ์ˆ˜ 1,000๊ฐœ ์ด์ƒ 2,000๊ฐœ ์ด์ƒ
ํ•™์Šต ๊ณก์„  ์ค‘๊ฐ„ (ํ”„๋กœํŒŒ์ผ ๊ฐœ๋…) ๋‚ฎ์Œ (์ง๊ด€์ )
์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋งค์šฐ ์œ ์—ฐํ•จ ์œ ์—ฐํ•จ
IDE ํ†ตํ•ฉ CMake ํ†ตํ•ฉ Visual Studio ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›
๊ธฐ์—… ์ง€์› JFrog Artifactory Azure Artifacts

โœ… Conan์„ ์„ ํƒํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ
Linux, Windows, macOS๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ด์•ผ ํ•˜๊ณ , ๊ฐ ํ”Œ๋žซํผ๋ณ„๋กœ ์ตœ์ ํ™”๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
CI/CD ํŒŒ์ดํ”„๋ผ์ธ
๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•˜๋Š” ์ž๋™ํ™” ํ™˜๊ฒฝ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์บ์‹ฑ์ด ํฐ ์žฅ์ 
๋ณต์žกํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ
์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ์„ธ๋ฐ€ํ•œ ๋นŒ๋“œ ์˜ต์…˜ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ
Python ์ƒํƒœ๊ณ„ ์นœํ™”์ 
์ด๋ฏธ Python์„ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์ด๋ผ๋ฉด ์„ค์น˜์™€ ์Šคํฌ๋ฆฝํŒ…์ด ์ž์—ฐ์Šค๋Ÿฌ์›€

โœ… vcpkg๋ฅผ ์„ ํƒํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ

Windows ์ค‘์‹ฌ ๊ฐœ๋ฐœ
Visual Studio๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , Windows ํ”Œ๋žซํผ์ด ๋ฉ”์ธ์ด๋ผ๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ํ†ตํ•ฉ์ด ๊ฐ•๋ ฅํ•จ
๋น ๋ฅธ ์‹œ์ž‘
๋ณต์žกํ•œ ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์„ ๋•Œ. ํ•™์Šต ๊ณก์„ ์ด ๋‚ฎ์•„์„œ ์ดˆ๋ณด์ž์—๊ฒŒ ์นœํ™”์ 
์ตœ์‹  ํŒจํ‚ค์ง€
vcpkg๋Š” ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋น ๋ฅธ ํŽธ์ด๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ™œ๋ฐœํ•จ
Microsoft ์ƒํƒœ๊ณ„
Azure DevOps, Visual Studio, WSL ๋“ฑ MS ๋„๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์‹œ๋„ˆ์ง€๊ฐ€ ์ข‹์Œ
๐Ÿ’ก ํ”„๋กœ ํŒ: ๋‘˜ ๋‹ค ์จ๋„ ๋ผ!
์‚ฌ์‹ค Conan๊ณผ vcpkg๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์š” ์˜์กด์„ฑ์€ Conan์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , Windows ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” vcpkg๋กœ ์„ค์น˜ํ•˜๋Š” ์‹์ด์ง€. ๋„๊ตฌ๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ตœ๊ณ ์•ผ!

๐Ÿ› ๏ธ ์‹ค์ „ ํ”„๋กœ์ ํŠธ: ๋‘ ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

์ด๋ก ๋งŒ ๋ฐฐ์šฐ๋ฉด ์žฌ๋ฏธ์—†์ง€? ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ. ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๋ฉด์„œ Conan๊ณผ vcpkg๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด๋ณด์ž! ๐Ÿš€

๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ

๋ชฉํ‘œ: HTTP ์š”์ฒญ์„ ๋ฐ›์•„์„œ JSON ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„

์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:
- cpp-httplib: ๊ฒฝ๋Ÿ‰ HTTP ์„œ๋ฒ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
- nlohmann-json: JSON ํŒŒ์‹ฑ ๋ฐ ์ƒ์„ฑ
- spdlog: ๋กœ๊น…
- fmt: ๋ฌธ์ž์—ด ํฌ๋งทํŒ…

๐ŸŽฏ ๋ฐฉ๋ฒ• 1: Conan์œผ๋กœ ๊ตฌํ˜„

Step 1: conanfile.txt ์ž‘์„ฑ
[requires]
cpp-httplib/0.14.1
nlohmann_json/3.11.2
spdlog/1.12.0
fmt/10.1.1

[generators]
CMakeDeps
CMakeToolchain

[options]
cpp-httplib/*:with_openssl=False
Step 2: CMakeLists.txt ์ž‘์„ฑ
cmake_minimum_required(VERSION 3.15)
project(WebServerConan CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(httplib REQUIRED)
find_package(nlohmann_json REQUIRED)
find_package(spdlog REQUIRED)
find_package(fmt REQUIRED)

add_executable(server_conan main.cpp)

target_link_libraries(server_conan 
    httplib::httplib
    nlohmann_json::nlohmann_json
    spdlog::spdlog
    fmt::fmt
)
Step 3: main.cpp ์ž‘์„ฑ
#include <httplib.h>
#include <nlohmann/json.hpp>
#include <spdlog/spdlog.h>
#include <fmt/core.h>

using json = nlohmann::json;

int main() {
    httplib::Server svr;
    
    spdlog::info("์„œ๋ฒ„ ์‹œ์ž‘ ์ค‘...");
    
    // GET ์—”๋“œํฌ์ธํŠธ
    svr.Get("/api/hello", [](const httplib::Request& req, httplib::Response& res) {
        json response;
        response["message"] = "Hello from Conan!";
        response["timestamp"] = std::time(nullptr);
        response["status"] = "success";
        
        res.set_content(response.dump(2), "application/json");
        spdlog::info("GET /api/hello ์š”์ฒญ ์ฒ˜๋ฆฌ๋จ");
    });
    
    // POST ์—”๋“œํฌ์ธํŠธ
    svr.Post("/api/echo", [](const httplib::Request& req, httplib::Response& res) {
        try {
            auto input = json::parse(req.body);
            
            json response;
            response["echo"] = input;
            response["received_at"] = std::time(nullptr);
            
            res.set_content(response.dump(2), "application/json");
            spdlog::info("POST /api/echo ์š”์ฒญ ์ฒ˜๋ฆฌ๋จ");
        } catch (const json::exception& e) {
            json error;
            error["error"] = "Invalid JSON";
            error["details"] = e.what();
            
            res.status = 400;
            res.set_content(error.dump(2), "application/json");
            spdlog::error("JSON ํŒŒ์‹ฑ ์˜ค๋ฅ˜: {}", e.what());
        }
    });
    
    auto port = 8080;
    spdlog::info("์„œ๋ฒ„๊ฐ€ ํฌํŠธ {}์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค", port);
    svr.listen("0.0.0.0", port);
    
    return 0;
}
Step 4: ๋นŒ๋“œ ๋ฐ ์‹คํ–‰
# ์˜์กด์„ฑ ์„ค์น˜
mkdir build && cd build
conan install .. --build=missing

# ๋นŒ๋“œ
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release

# ์‹คํ–‰
./server_conan  # Linux/macOS
# ๋˜๋Š”
.\Release\server_conan.exe  # Windows

์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋‚˜ curl๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด:

# GET ์š”์ฒญ ํ…Œ์ŠคํŠธ
curl http://localhost:8080/api/hello

# POST ์š”์ฒญ ํ…Œ์ŠคํŠธ
curl -X POST http://localhost:8080/api/echo \
  -H "Content-Type: application/json" \
  -d '{"name":"Conan","type":"Package Manager"}'

๐ŸŽฏ ๋ฐฉ๋ฒ• 2: vcpkg๋กœ ๊ตฌํ˜„

Step 1: vcpkg.json ์ž‘์„ฑ
{
  "name": "webserver-vcpkg",
  "version": "1.0.0",
  "dependencies": [
    "cpp-httplib",
    "nlohmann-json",
    "spdlog",
    "fmt"
  ],
  "builtin-baseline": "2023.11.20"
}
Step 2: CMakeLists.txt ์ž‘์„ฑ
cmake_minimum_required(VERSION 3.15)
project(WebServerVcpkg CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(httplib CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(fmt CONFIG REQUIRED)

add_executable(server_vcpkg main.cpp)

target_link_libraries(server_vcpkg 
    PRIVATE
    httplib::httplib
    nlohmann_json::nlohmann_json
    spdlog::spdlog
    fmt::fmt
)

main.cpp๋Š” ์œ„์˜ Conan ๋ฒ„์ „๊ณผ ๋™์ผํ•ด! ์ฝ”๋“œ๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์™€ ๋…๋ฆฝ์ ์ด๋‹ˆ๊นŒ. ๐Ÿ˜Š

Step 3: ๋นŒ๋“œ ๋ฐ ์‹คํ–‰
# CMake ์„ค์ • (vcpkg toolchain ์‚ฌ์šฉ)
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]/scripts/buildsystems/vcpkg.cmake

# ๋นŒ๋“œ
cmake --build build --config Release

# ์‹คํ–‰
./build/server_vcpkg  # Linux/macOS
# ๋˜๋Š”
.\build\Release\server_vcpkg.exe  # Windows
๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ
์ด ์˜ˆ์ œ์—์„œ ์ฃผ๋ชฉํ•  ์ ์€ main.cpp๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค๋Š” ๊ฑฐ์•ผ! ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€์ผ ๋ฟ, ์‹ค์ œ ์ฝ”๋“œ์™€๋Š” ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด. ์ด๊ฒŒ ๋ฐ”๋กœ ์ข‹์€ ์•„ํ‚คํ…์ฒ˜์˜ ํŠน์ง•์ด์ง€!

๐Ÿ”ฅ ๊ณ ๊ธ‰ ์ฃผ์ œ: ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

์ด์ œ ๊ธฐ๋ณธ์€ ๋งˆ์Šคํ„ฐํ–ˆ์œผ๋‹ˆ, ์‹ค๋ฌด์—์„œ ์ •๋ง ์ค‘์š”ํ•œ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋“ค์„ ์•Œ๋ ค์ค„๊ฒŒ. ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ํ”„๋กœ ๊ฐœ๋ฐœ์ž์ฒ˜๋Ÿผ ๋ณด์ผ ๊ฑฐ์•ผ! ๐Ÿ˜Ž

๐Ÿ“Œ 1. ๋ฒ„์ „ ๊ณ ์ •ํ•˜๊ธฐ (Version Pinning)

๋ฌธ์ œ: "๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋˜๋Š”๋ฐ์š”?"๋ผ๋Š” ๋ง์„ ๋“ค์–ด๋ณธ ์  ์žˆ์ง€? ์ด๊ฑด ๋Œ€๋ถ€๋ถ„ ๋ฒ„์ „ ๋ถˆ์ผ์น˜ ๋•Œ๋ฌธ์ด์•ผ.

ํ•ด๊ฒฐ์ฑ…: ํ•ญ์ƒ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ๋ช…์‹œํ•ด!

# ๋‚˜์œ ์˜ˆ (Conan)
[requires]
boost/*  # ์–ด๋–ค ๋ฒ„์ „์ด ์„ค์น˜๋ ์ง€ ๋ชจ๋ฆ„!

# ์ข‹์€ ์˜ˆ
[requires]
boost/1.82.0  # ์ •ํ™•ํ•œ ๋ฒ„์ „ ๋ช…์‹œ
// ๋‚˜์œ ์˜ˆ (vcpkg.json)
{
  "dependencies": ["boost"]  // ์ตœ์‹  ๋ฒ„์ „์ด ์ž๋™์œผ๋กœ...
}

// ์ข‹์€ ์˜ˆ
{
  "dependencies": [
    {
      "name": "boost",
      "version>=": "1.82.0"
    }
  ],
  "builtin-baseline": "2023.11.20"  // baseline์œผ๋กœ ์ „์ฒด ๋ฒ„์ „ ๊ณ ์ •
}

๐Ÿ“Œ 2. ์˜์กด์„ฑ ์ตœ์†Œํ™”ํ•˜๊ธฐ

โš ๏ธ ์˜์กด์„ฑ ์ง€์˜ฅ (Dependency Hell)
์˜์กด์„ฑ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ ธ. ํŠนํžˆ ์˜์กด์„ฑ์˜ ์˜์กด์„ฑ(transitive dependencies)๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ๋ณต์žก๋„๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ด!

์›์น™:
1. ์ •๋ง ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์ถ”๊ฐ€ํ•˜๊ธฐ
2. ํ—ค๋” ์˜จ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํ˜ธํ•˜๊ธฐ (๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•)
3. ํฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ์ž‘๊ณ  ์ง‘์ค‘๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํ˜ธํ•˜๊ธฐ

์˜ˆ์‹œ:
์ „์ฒด Boost๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋Œ€์‹ , ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ์„ค์น˜:

# Boost ์ „์ฒด (์ˆ˜ GB!)
conan install boost/1.82.0

# ํ•„์š”ํ•œ ๊ฒƒ๋งŒ (์ˆ˜์‹ญ MB)
conan install boost-filesystem/1.82.0
conan install boost-asio/1.82.0

๐Ÿ“Œ 3. ๋กœ์ปฌ ์บ์‹œ ๊ด€๋ฆฌํ•˜๊ธฐ

ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๋กœ์ปฌ ์บ์‹œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ์ปค์ ธ. ์ •๊ธฐ์ ์œผ๋กœ ์ •๋ฆฌํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹์•„! ๐Ÿงน

Conan ์บ์‹œ ๊ด€๋ฆฌ

# ์บ์‹œ ์œ„์น˜ ํ™•์ธ
conan config home

# ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€ ์ œ๊ฑฐ
conan remove "*" -c

# ํŠน์ • ํŒจํ‚ค์ง€๋งŒ ์ œ๊ฑฐ
conan remove "boost/*"

# ์บ์‹œ ํฌ๊ธฐ ํ™•์ธ (Linux/macOS)
du -sh ~/.conan2

vcpkg ์บ์‹œ ๊ด€๋ฆฌ

# ๋นŒ๋“œ ์บ์‹œ ์ •๋ฆฌ
vcpkg remove --outdated

# ์ „์ฒด ์žฌ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋ฉด
rm -rf vcpkg/buildtrees
rm -rf vcpkg/packages
rm -rf vcpkg/downloads

๐Ÿ“Œ 4. CI/CD ํ†ตํ•ฉํ•˜๊ธฐ

ํ˜„๋Œ€์ ์ธ ๊ฐœ๋ฐœ์—์„œ CI/CD๋Š” ํ•„์ˆ˜์•ผ. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž!

GitHub Actions ์˜ˆ์ œ (Conan)

name: Build with Conan

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'
    
    - name: Install Conan
      run: pip install conan
    
    - name: Install dependencies
      run: |
        mkdir build && cd build
        conan install .. --build=missing
    
    - name: Build
      run: |
        cd build
        cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
        cmake --build .
    
    - name: Test
      run: |
        cd build
        ctest --output-on-failure

GitHub Actions ์˜ˆ์ œ (vcpkg)

name: Build with vcpkg

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Install vcpkg
      run: |
        git clone https://github.com/microsoft/vcpkg.git
        ./vcpkg/bootstrap-vcpkg.sh
    
    - name: Build
      run: |
        cmake -B build -S . \
          -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake
        cmake --build build
    
    - name: Test
      run: |
        cd build
        ctest --output-on-failure
๐Ÿ’ก ํ”„๋กœ ํŒ: ์บ์‹ฑ ํ™œ์šฉํ•˜๊ธฐ
CI์—์„œ ๋งค๋ฒˆ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ค. GitHub Actions์˜ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด!

๐Ÿ“Œ 5. ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

๐Ÿ”’ ๋ณด์•ˆ์€ ์„ ํƒ์ด ์•„๋‹ˆ๋ผ ํ•„์ˆ˜!
์˜คํ”ˆ์†Œ์Šค ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๋ณด์•ˆ์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ด. ์•…์˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๊ฑฐ๋“ .

๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:

1. ๊ณต์‹ ์ €์žฅ์†Œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ
- Conan: ConanCenter (center.conan.io)
- vcpkg: ๊ณต์‹ GitHub ์ €์žฅ์†Œ

2. ํŒจํ‚ค์ง€ ๊ฒ€์ฆํ•˜๊ธฐ
- ๋‹ค์šด๋กœ๋“œ ์ˆ˜, ๋ณ„์ , ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ ๋‚ ์งœ ํ™•์ธ
- GitHub์—์„œ ์†Œ์Šค์ฝ”๋“œ ์ง์ ‘ ํ™•์ธ
- ์•Œ๋ ค์ง„ ์ทจ์•ฝ์  ๊ฒ€์ƒ‰ (CVE ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)

3. ์ •๊ธฐ์ ์ธ ์—…๋ฐ์ดํŠธ
- ๋ณด์•ˆ ํŒจ์น˜๊ฐ€ ํฌํ•จ๋œ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ
- ํ•˜์ง€๋งŒ ๋ฉ”์ด์ € ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ!

4. ์˜์กด์„ฑ ์Šค์บ” ๋„๊ตฌ ์‚ฌ์šฉ
- OWASP Dependency-Check
- Snyk
- GitHub Dependabot

ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ์›Œํฌํ”Œ๋กœ์šฐ 1. ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ 2. ํŒจํ‚ค์ง€ ์„ ํƒ 3. ์„ค์น˜ ๋ฐ ์„ค์ • 4. ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ 5. ๋ฐฐํฌ ์ค€๋น„ ์™„๋ฃŒ 6. ์œ ์ง€๋ณด์ˆ˜ ์—…๋ฐ์ดํŠธ ๋ฌธ์„œํ™” ๋ฒ„์ „๊ด€๋ฆฌ ๋ณด์•ˆ์ ๊ฒ€ CI/CD

๐Ÿšจ ํ”ํ•œ ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ์— ๋ถ€๋”ชํžˆ๊ฒŒ ๋ผ. ๋‚ด๊ฐ€ ๊ฒช์—ˆ๋˜ (๊ทธ๋ฆฌ๊ณ  ํ•ด๊ฒฐํ–ˆ๋˜!) ๋ฌธ์ œ๋“ค์„ ๊ณต์œ ํ• ๊ฒŒ. ๐Ÿ”ง

โŒ ๋ฌธ์ œ 1: "ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"

์ฆ์ƒ:
ERROR: Package 'some-library/1.0.0' not found

์›์ธ:
1. ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด๋‚˜ ๋ฒ„์ „์ด ์ž˜๋ชป๋จ
2. ์›๊ฒฉ ์ €์žฅ์†Œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์Œ
3. ํŒจํ‚ค์ง€๊ฐ€ ํ•ด๋‹น ํ”Œ๋žซํผ์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# Conan: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „ ๊ฒ€์ƒ‰
conan search "some-library*" -r=conancenter

# vcpkg: ํŒจํ‚ค์ง€ ๊ฒ€์ƒ‰
vcpkg search some-library

# ์›๊ฒฉ ์ €์žฅ์†Œ ํ™•์ธ
conan remote list  # Conan
vcpkg version      # vcpkg

โŒ ๋ฌธ์ œ 2: ๋ฒ„์ „ ์ถฉ๋Œ

์ฆ์ƒ:

ERROR: Version conflict detected: library-a requires boost/1.70.0 but library-b requires boost/1.75.0

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
1. ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ํ˜ธํ™˜๋˜๋Š” Boost ๋ฒ„์ „ ์ฐพ๊ธฐ
2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ
3. ์ตœํ›„์˜ ์ˆ˜๋‹จ: ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ๋กœ ๋ถ„๋ฆฌ

# Conan: ๋ฒ„์ „ ์˜ค๋ฒ„๋ผ์ด๋“œ
[requires]
library-a/1.0.0
library-b/2.0.0
boost/1.75.0  # ๋ช…์‹œ์ ์œผ๋กœ ๋ฒ„์ „ ์ง€์ •

[overrides]
boost/1.75.0  # ๋ชจ๋“  ์˜์กด์„ฑ์—์„œ ์ด ๋ฒ„์ „ ๊ฐ•์ œ

โŒ ๋ฌธ์ œ 3: ๋นŒ๋“œ ์‹คํŒจ

์ฆ์ƒ:
ํŒจํ‚ค์ง€๋Š” ์„ค์น˜๋˜์—ˆ๋Š”๋ฐ ๋นŒ๋“œํ•  ๋•Œ ๋งํฌ ์—๋Ÿฌ๋‚˜ ํ—ค๋”๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ

์›์ธ:
1. CMake ์„ค์ •์ด ์ž˜๋ชป๋จ
2. ํ”Œ๋žซํผ/์•„ํ‚คํ…์ฒ˜ ๋ถˆ์ผ์น˜
3. ๋นŒ๋“œ ํƒ€์ž… ๋ถˆ์ผ์น˜ (Debug vs Release)

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# Conan: ๋นŒ๋“œ ํƒ€์ž… ๋ช…์‹œ
conan install .. --build=missing -s build_type=Release

# vcpkg: ํŠธ๋ฆฌํ”Œ๋ › ๋ช…์‹œ
vcpkg install some-library:x64-windows

# CMake: ์ƒ์„ธ ๋กœ๊ทธ ํ™•์ธ
cmake .. --trace-expand

โŒ ๋ฌธ์ œ 4: ๋А๋ฆฐ ๋นŒ๋“œ ์†๋„

์ฆ์ƒ:
ํŒจํ‚ค์ง€ ์„ค์น˜๋‚˜ ๋นŒ๋“œ์— ๋„ˆ๋ฌด ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# Conan: ๋ฐ”์ด๋„ˆ๋ฆฌ ์บ์‹œ ํ™œ์„ฑํ™”
conan config set storage.download_cache="~/.conan/download_cache"

# vcpkg: ๋ฐ”์ด๋„ˆ๋ฆฌ ์บ์‹ฑ
vcpkg install boost --binarysource=clear;files,C:\vcpkg-cache,readwrite

# ๋ณ‘๋ ฌ ๋นŒ๋“œ ํ™œ์„ฑํ™”
cmake --build . -j 8  # 8๊ฐœ ์ฝ”์–ด ์‚ฌ์šฉ

๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ , ํ—ค๋” ์˜จ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋ผ!

โŒ ๋ฌธ์ œ 5: ํฌ๋กœ์Šค ์ปดํŒŒ์ผ ๋ฌธ์ œ

์ฆ์ƒ:
Windows์—์„œ Linux์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜, x86์—์„œ ARM์šฉ ๋นŒ๋“œ๋ฅผ ํ•  ๋•Œ ๋ฌธ์ œ ๋ฐœ์ƒ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# Conan: ํฌ๋กœ์Šค ์ปดํŒŒ์ผ ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ
# linux-arm64 ํ”„๋กœํŒŒ์ผ ์˜ˆ์‹œ
[settings]
os=Linux
arch=armv8
compiler=gcc
compiler.version=11
build_type=Release

[buildenv]
CC=aarch64-linux-gnu-gcc
CXX=aarch64-linux-gnu-g++

# ์‚ฌ์šฉ
conan install .. --profile=linux-arm64

# vcpkg: ์ปค์Šคํ…€ ํŠธ๋ฆฌํ”Œ๋ › ์ƒ์„ฑ
# arm64-linux.cmake ํŒŒ์ผ ์ƒ์„ฑ
set(VCPKG_TARGET_ARCHITECTURE arm64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_CMAKE_SYSTEM_NAME Linux)

# ์‚ฌ์šฉ
vcpkg install some-library:arm64-linux

๐ŸŒŸ ๋ฏธ๋ž˜์˜ C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ

C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์˜ ๋ฏธ๋ž˜๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ํŠธ๋ Œ๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž! ๐Ÿ”ฎ

๐Ÿ“ฆ C++ ํ‘œ์ค€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž?

C++ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์˜ค๋žซ๋™์•ˆ "๊ณต์‹" ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์›ํ•ด์™”์–ด. ์‹ค์ œ๋กœ C++23, C++26 ํ‘œ์ค€ํ™” ๊ณผ์ •์—์„œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์™€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ํ™œ๋ฐœํ•ด.

C++ Modules๊ฐ€ C++20์—์„œ ๋„์ž…๋˜์—ˆ๊ณ , ์ด๊ฒŒ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์˜ ๋ฏธ๋ž˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด. ๋ชจ๋“ˆ์€ ํ—ค๋” ํŒŒ์ผ์˜ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ , ๋” ๋น ๋ฅธ ์ปดํŒŒ์ผ๊ณผ ๋” ๋‚˜์€ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค˜.

โ˜๏ธ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋นŒ๋“œ

๋ฏธ๋ž˜์—๋Š” ๋กœ์ปฌ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋Œ€์‹ , ํด๋ผ์šฐ๋“œ์—์„œ ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒŒ ํ‘œ์ค€์ด ๋  ๊ฑฐ์•ผ. ์ด๋ฏธ Conan๊ณผ vcpkg ๋ชจ๋‘ ์ด ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด:

- JFrog Artifactory: Conan ํŒจํ‚ค์ง€๋ฅผ ์œ„ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ €์žฅ์†Œ
- Azure Artifacts: vcpkg ๋ฐ”์ด๋„ˆ๋ฆฌ ์บ์‹ฑ
- GitHub Packages: ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋ฌด๋ฃŒ ํ˜ธ์ŠคํŒ…

๐Ÿค– AI ๊ธฐ๋ฐ˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ

์ƒ์ƒํ•ด๋ด! AI๊ฐ€ ์ž๋™์œผ๋กœ:
- ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”์ฒœํ•ด์ฃผ๊ณ 
- ๋ฒ„์ „ ์ถฉ๋Œ์„ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ 
- ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฏธ๋ฆฌ ๊ฒฝ๊ณ ํ•ด์ฃผ๊ณ 
- ์ตœ์ ์˜ ๋นŒ๋“œ ์„ค์ •์„ ์ œ์•ˆํ•ด์ฃผ๋Š” ๊ฑฐ์•ผ!

์ด๋ฏธ GitHub Copilot ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋„์™€์ฃผ๊ณ  ์žˆ์ž–์•„? ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋„ ๊ณง ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฑฐ์•ผ. ๐Ÿš€

๐Ÿ’ก ์ง€๊ธˆ ๋ฐฐ์›Œ๋‘๋ฉด ๋ฏธ๋ž˜์— ์œ ๋ฆฌํ•ด!
Conan๊ณผ vcpkg๋ฅผ ์ง€๊ธˆ ๋ฐฐ์›Œ๋‘๋ฉด, ๋ฏธ๋ž˜์˜ C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ๋„ ์‰ฝ๊ฒŒ ์ ์‘ํ•  ์ˆ˜ ์žˆ์–ด. ํ•ต์‹ฌ ๊ฐœ๋…๋“ค์€ ๋น„์Šทํ•  ํ…Œ๋‹ˆ๊นŒ!

๐ŸŽ“ ํ•™์Šต ๋ฆฌ์†Œ์Šค์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ

ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋ฉด? ๊ฑฑ์ • ๋งˆ! ํ›Œ๋ฅญํ•œ ๋ฆฌ์†Œ์Šค์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋งŽ์•„. ๐Ÿ‘ฅ

๐Ÿ“š ๊ณต์‹ ๋ฌธ์„œ

Conan:
- ๊ณต์‹ ๋ฌธ์„œ: docs.conan.io
- ConanCenter: conan.io/center
- GitHub: github.com/conan-io/conan

vcpkg:
- ๊ณต์‹ ๋ฌธ์„œ: vcpkg.io
- GitHub: github.com/microsoft/vcpkg
- ํŒจํ‚ค์ง€ ๊ฒ€์ƒ‰: vcpkg.io/en/packages.html

๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ

Conan:
- Slack: cpplang.slack.com (#conan ์ฑ„๋„)
- Reddit: r/cpp
- Stack Overflow: [conan] ํƒœ๊ทธ

vcpkg:
- Discord: discord.gg/vcpkg
- GitHub Discussions: github.com/microsoft/vcpkg/discussions
- Stack Overflow: [vcpkg] ํƒœ๊ทธ

๐ŸŽฅ ์ถ”์ฒœ ์˜์ƒ ๋ฐ ํŠœํ† ๋ฆฌ์–ผ

- CppCon ๋ฐœํ‘œ ์˜์ƒ๋“ค (YouTube์—์„œ "CppCon Conan" ๋˜๋Š” "CppCon vcpkg" ๊ฒ€์ƒ‰)
- Microsoft์˜ vcpkg ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ
- JFrog์˜ Conan ์›จ๋น„๋‚˜ ์‹œ๋ฆฌ์ฆˆ
- ๊ฐ์ข… ๊ฐœ๋ฐœ์ž ๋ธ”๋กœ๊ทธ๋“ค

๐ŸŒ ์žฌ๋Šฅ๋„ท์—์„œ๋„ ๋ฐฐ์›Œ๋ณด์„ธ์š”!
์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์˜ '์ง€์‹์ธ์˜ ์ˆฒ'์—๋Š” C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์‹์ด ๊ฐ€๋“ํ•ด. ์‹ค๋ฌด ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ณต์œ ํ•˜๋Š” ํŒ๊ณผ ๋…ธํ•˜์šฐ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”!

๐ŸŽฏ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด

์ด๋ก ๋งŒ ๋ฐฐ์šฐ๋ฉด ๊ธˆ๋ฐฉ ์žŠ์–ด๋ฒ„๋ ค. ์ง์ ‘ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์—ฐ์Šตํ•ด๋ณด์ž! ์—ฌ๊ธฐ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ์ค„๊ฒŒ. ๐Ÿ’ก

๐ŸŽฎ ํ”„๋กœ์ ํŠธ 1: ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„ ์—”์ง„

์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:
- SDL2 (๊ทธ๋ž˜ํ”ฝ ๋ฐ ์ž…๋ ฅ)
- GLM (์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
- nlohmann-json (์„ค์ • ํŒŒ์ผ)
- spdlog (๋กœ๊น…)

๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:
- ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
- ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋นŒ๋“œ
- ๋ณต์žกํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ

๐ŸŒ ํ”„๋กœ์ ํŠธ 2: RESTful API ์„œ๋ฒ„

์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:
- cpp-httplib ๋˜๋Š” Crow (HTTP ์„œ๋ฒ„)
- SQLite3 (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)
- jwt-cpp (์ธ์ฆ)
- nlohmann-json (JSON ์ฒ˜๋ฆฌ)

๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:
- ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ†ตํ•ฉ
- ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

๐Ÿ“Š ํ”„๋กœ์ ํŠธ 3: ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋„๊ตฌ

์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:
- Eigen (์„ ํ˜•๋Œ€์ˆ˜)
- Matplotlib-cpp (์‹œ๊ฐํ™”)
- CSV-parser (๋ฐ์ดํ„ฐ ์ž…๋ ฅ)
- Boost.Program_options (CLI)

๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:
- ๊ณผํ•™ ๊ณ„์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
- ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”
- ๋ช…๋ น์ค„ ๋„๊ตฌ ๊ฐœ๋ฐœ

๐Ÿค– ํ”„๋กœ์ ํŠธ 4: ๋จธ์‹ ๋Ÿฌ๋‹ ์ถ”๋ก  ์—”์ง„

์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:
- ONNX Runtime (๋ชจ๋ธ ์ถ”๋ก )
- OpenCV (์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ)
- Protobuf (๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”)
- gRPC (๋„คํŠธ์›Œํฌ ํ†ต์‹ )

๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:
- AI/ML ํ†ตํ•ฉ
- ๊ณ ์„ฑ๋Šฅ ์ปดํ“จํŒ…
- ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

โœจ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์™€! ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด ์ •๋ง ๋Œ€๋‹จํ•ด! ๐Ÿ‘

์šฐ๋ฆฌ๋Š” ์˜ค๋Š˜ C++ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์˜ A๋ถ€ํ„ฐ Z๊นŒ์ง€ ์‚ดํŽด๋ดค์–ด. ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, Conan๊ณผ vcpkg๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ๋ฐฐ์› ์ง€. ์‹ค์ „ ์˜ˆ์ œ๋„ ๋งŒ๋“ค์–ด๋ณด๊ณ , ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค๊ณผ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋„ ์•Œ์•„๋ดค์–ด.

๐ŸŽฏ ํ•ต์‹ฌ ์š”์•ฝ

1. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ํ•„์ˆ˜
ํ˜„๋Œ€์ ์ธ C++ ๊ฐœ๋ฐœ์—์„œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ์„ ํƒ์ด ์•„๋‹ˆ๋ผ ํ•„์ˆ˜์•ผ. ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ , ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๊ณ , ํ˜‘์—…์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค˜.

2. Conan vs vcpkg
- Conan: ๋ฐ”์ด๋„ˆ๋ฆฌ ์šฐ์„ , ์œ ์—ฐํ•œ ์„ค์ •, ํฌ๋กœ์Šค ํ”Œ๋žซํผ์— ๊ฐ•ํ•จ
- vcpkg: ์†Œ์Šค ๊ธฐ๋ฐ˜, ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ, Visual Studio ํ†ตํ•ฉ ์šฐ์ˆ˜
๋‘˜ ๋‹ค ํ›Œ๋ฅญํ•œ ๋„๊ตฌ๋‹ˆ๊นŒ ํ”„๋กœ์ ํŠธ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋ฉด ๋ผ!

3. ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค
- ๋ฒ„์ „์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ณ ์ •ํ•˜๊ธฐ
- ์˜์กด์„ฑ ์ตœ์†Œํ™”ํ•˜๊ธฐ
- CI/CD์— ํ†ตํ•ฉํ•˜๊ธฐ
- ๋ณด์•ˆ ํ•ญ์ƒ ์—ผ๋‘์— ๋‘๊ธฐ

4. ๊ณ„์† ๋ฐฐ์šฐ๊ธฐ
๊ธฐ์ˆ ์€ ๊ณ„์† ๋ฐœ์ „ํ•ด. ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ฐธ์—ฌํ•˜๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๊ณ„์† ์„ฑ์žฅํ•˜์ž!

๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„
1. ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ Conan์ด๋‚˜ vcpkg๋ฅผ ์ ์šฉํ•ด๋ณด๊ธฐ
2. ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ
3. ํŒ€์›๋“ค๊ณผ ์ง€์‹ ๊ณต์œ ํ•˜๊ธฐ
4. ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋ฉด์„œ ์‹ค๋ ฅ ํ‚ค์šฐ๊ธฐ

์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ฒฝํ—˜๋‹ด๋„ ์ฝ์–ด๋ณด๊ณ , ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์งˆ๋ฌธ๋„ ์˜ฌ๋ ค๋ด. ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฒŒ ์ œ์ผ ๋น ๋ฅธ ๊ธธ์ด์•ผ!

C++ ๊ฐœ๋ฐœ์ด ์ ์  ๋” ํ˜„๋Œ€์ ์ด๊ณ  ํŽธ๋ฆฌํ•ด์ง€๊ณ  ์žˆ์–ด. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ๊ทธ ๋ณ€ํ™”์˜ ์ค‘์‹ฌ์— ์žˆ์ง€. ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋‚˜์€ C++ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธธ ๋ฐ”๋ผ! ๐Ÿ’ช

์งˆ๋ฌธ์ด๋‚˜ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ํ™˜์˜์ด์•ผ. ์šฐ๋ฆฌ ๋ชจ๋‘ ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€์ž! ๐ŸŒŸ

ํ–‰๋ณตํ•œ ์ฝ”๋”ฉ ๋˜๊ธธ! Happy Coding! ๐ŸŽ‰

๐Ÿ“š ๋” ๋งŽ์€ C++ ์ง€์‹์ด ํ•„์š”ํ•˜์‹ ๊ฐ€์š”?

์žฌ๋Šฅ๋„ท์˜ '์ง€์‹์ธ์˜ ์ˆฒ'์—์„œ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์‹์„ ํƒํ—˜ํ•ด๋ณด์„ธ์š”!
์‹ค๋ฌด ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ณต์œ ํ•˜๋Š” ์ƒ์ƒํ•œ ๋…ธํ•˜์šฐ๊ฐ€ ๊ฐ€๋“ํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.