본문으로 건너뛰기
Previous
Next
C++ CLion 완벽 가이드 | 설치·설정·디버깅·리팩토링·생산성 [#53-1]

C++ CLion 완벽 가이드 | 설치·설정·디버깅·리팩토링·생산성 [#53-1]

C++ CLion 완벽 가이드 | 설치·설정·디버깅·리팩토링·생산성 [#53-1]

이 글의 핵심

C++ CLion IDE 마스터: CMake 설정이 안 돼요, 디버거가 연결 안 돼요 같은 문제 해결. 툴체인 설정, 고급 디버깅, 리팩토링 도구, 생산성 단축키, 프로덕션 패턴까지 900줄 분량으로 다룹니다.

들어가며: “C++ IDE 뭘 쓰지?”

VSCode vs CLion vs Visual Studio

VSCode는 가볍고 확장이 많지만, C++ 전용 기능은 제한적입니다. Visual Studio는 Windows에서 강력하지만 크로스 플랫폼이 아닙니다. CLion은 JetBrains의 C++ 전용 IDE로, Linux/macOS/Windows에서 동일한 경험을 제공하며 CMake·디버깅·리팩토링이 통합되어 있습니다. 실제 겪는 문제 시나리오:

// 실행 예제
- CMake 프로젝트를 열었는데 "툴체인을 찾을 수 없음" 에러 → GCC/Clang 경로 설정 필요
- 디버거로 실행했는데 브레이크포인트가 안 걸림 → Debug 빌드·심볼 확인 필요
- 10만 줄 코드베이스에서 함수 정의 찾기가 너무 느림 → CLion의 인덱싱·심볼 검색 활용
- 리팩토링할 때 변수명 바꾸면 수동으로 다 찾아서 고쳐야 함 → Rename Refactoring 사용
- 팀원마다 다른 OS(Linux/macOS/Windows) → CLion으로 동일한 워크플로 공유
- Docker 컨테이너 안에서 빌드·실행해야 함 → CLion 원격/도커 툴체인
- vcpkg/Conan 설치한 라이브러리 경로를 못 찾음 → 툴체인·CMake 옵션 연동
- 인덱싱 중 CPU 100%로 다른 작업이 불가 → 제외 경로 설정 필요
- "undefined reference" 에러가 나는데 헤더는 잘 찾음 → 링크 대상·소스 파일 누락

시나리오별 상세:

시나리오증상CLion에서 해결
신규 프로젝트CMake 없이 시작New Project → C++ Executable으로 자동 CMake 생성
레거시 MakefileMakefile만 있음CMake로 변환하거나, Compilation Database 생성 후 열기
멀티 플랫폼Win/Mac/Linux 각각 빌드CMake Presets로 프로파일 분리, 툴체인 전환
대규모인덱싱 10분 이상build, third_party 제외, 메모리 증가
CLion으로 해결:
문제CLion 기능
------------------
툴체인 설정Settings > Toolchains에서 GCC/Clang/MSVC 선택
디버깅GDB/LLDB 통합, 조건부 브레이크포인트, Watches
코드 탐색Go to Definition, Find Usages, Call Hierarchy
리팩토링Rename, Extract, Change Signature
크로스 플랫폼동일 UI, CMake Presets 지원
원격 개발SSH, Docker, WSL 툴체인
요구 환경: CLion 2023.x 이상, C++17 이상, CMake 3.16+
이 글을 읽으면:
  • CLion 설치부터 툴체인·CMake 설정까지 완전히 구성할 수 있습니다.
  • 고급 디버깅 기법(조건부 BP, 역디버깅 등)을 활용할 수 있습니다.
  • 리팩토링·단축키로 생산성을 높일 수 있습니다.
  • 자주 발생하는 에러와 해결법을 알 수 있습니다.
  • 프로덕션 환경에서의 패턴을 적용할 수 있습니다.

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

1. 문제 시나리오와 CLion 선택

언제 CLion을 쓰면 좋을까?

flowchart TD
    A[C++ 프로젝트] --> B{주요 환경은?}
    B -->|Windows 전용| C[Visual Studio]
    B -->|Linux/macOS/크로스플랫폼| D[CLion]
    B -->|가벼운 편집만| E[VSCode]
    D --> D1[CMake 기반]
    D --> D2[디버깅·리팩토링 중요]
    D --> D3[원격/Docker 개발]

CLion vs 다른 IDE 비교

항목CLionVisual StudioVSCode
플랫폼Win/Mac/LinuxWindows모두
빌드 시스템CMake 중심MSBuild, CMakeCMake 등 확장
디버깅GDB/LLDBMSVC 디버거확장 의존
리팩토링내장 강력내장제한적
인덱싱전체 코드베이스빠름확장 의존
가격유료(학생 무료)Community 무료무료

2. CLion 완전 설치·설정 가이드

2.1 설치

macOS:

# Homebrew로 설치
brew install --cask clion

Linux (Ubuntu/Debian):

# JetBrains Toolbox 또는 직접 다운로드
# https://www.jetbrains.com/clion/download/
sudo snap install clion --classic

Windows:

- https://www.jetbrains.com/clion/download/ 에서 설치 프로그램 다운로드
- MinGW-w64 또는 Visual Studio Build Tools 사전 설치 권장

2.2 툴체인(Toolchain) 설정

CLion은 툴체인으로 컴파일러·디버거·CMake를 묶어 관리합니다. 설정 경로: Settings (macOS: Cmd+,) → Build, Execution, DeploymentToolchains

// 실행 예제
flowchart LR
    subgraph Toolchain[툴체인 구성]
        T1[CMake]
        T2[C/C++ 컴파일러]
        T3[디버거 GDB/LLDB]
        T4[빌드 도구 make/ninja]
    end

macOS - System 툴체인:

1. Toolchains → + → System
2. Name: macOS (Clang)
3. C Compiler: /usr/bin/clang (또는 Xcode 경로)
4. C++ Compiler: /usr/bin/clang++
5. Debugger: LLDB (기본)
6. Environment: 기본 또는 Custom

Linux - GCC 툴체인:

# GCC 설치 확인
gcc --version
g++ --version
# Ubuntu/Debian
sudo apt install build-essential cmake gdb
1. Toolchains → + → System
2. C Compiler: /usr/bin/gcc
3. C++ Compiler: /usr/bin/g++
4. Debugger: GDB

Windows - MinGW:

1. MinGW-w64 또는 MSYS2 설치
2. Toolchains → + → MinGW
3. Environment: MinGW 설치 경로 지정 (예: C:\msys64\mingw64)
4. 또는 Visual Studio 툴체인 선택

CMake 옵션 예시 (툴체인별):

// CMakePresets.json - 툴체인 자동 감지
{
  "version": 3,
  "configurePresets": [
    {
      "name": "linux-debug",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_CXX_COMPILER": "/usr/bin/g++"
      }
    }
  ]
}

2.3 CMake 프로파일 설정

설정 경로: SettingsBuild, Execution, DeploymentCMake

항목설명권장값
Build typeDebug / Release / RelWithDebInfo개발: Debug
Toolchain사용할 툴체인시스템에 맞게
CMake options추가 옵션-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
Build directory빌드 출력 경로cmake-build-debug
디버그·릴리즈 프로파일 분리:
1. CMake → Profiles → + 로 새 프로파일 추가
2. Debug: Build type = Debug, 이름 = Debug
3. Release: Build type = Release, 이름 = Release
4. 실행 시 상단 드롭다운에서 프로파일 선택

2.4 코드 스타일·Clang-Tidy

Clang-Tidy 연동 (정적 분석):

# .clang-tidy - 프로젝트 루트에 생성
Checks: >
  -*,
  bugprone-*,
  performance-*,
  modernize-*,
  readability-*
WarningsAsErrors: '
HeaderFilterRegex: '.*'

설정: SettingsEditorInspectionsC/C++Clang-Tidy 체크

2.5 원격·Docker 툴체인 (선택)

SSH 원격 개발:

1. Toolchains → + → Remote Host
2. SSH Configuration: 호스트, 사용자, 키 경로
3. 원격 머신에 CMake, GCC/Clang, GDB 설치 필요
4. 빌드·실행이 원격에서 수행됨

Docker 툴체인:

1. Toolchains → + → Docker
2. Docker 이미지 선택 (예: ubuntu:22.04)
3. 이미지 내부에 build-essential, cmake, gdb 설치된 Dockerfile 사용 권장

Dockerfile 예시:

# Dockerfile.dev
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
    build-essential cmake gdb git \
    && rm -rf /var/lib/apt/lists/*

3. CMake 프로젝트 구성

3.1 새 프로젝트 생성

FileNew ProjectC++ Executable (또는 Library) 생성되는 기본 구조:

# CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(my_project CXX)
set(CMAKE_CXX_STANDARD 17)
add_executable(my_project main.cpp)

3.2 기존 CMake 프로젝트 열기

FileOpen → 프로젝트 루트의 CMakeLists.txt 또는 폴더 선택 CLion이 자동으로:

  • CMake 설정 실행
  • 컴파일 데이터베이스 생성
  • 코드 인덱싱 시작

3.3 vcpkg·Conan 연동

vcpkg:

# CMakeLists.txt
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
    CACHE STRING "Vcpkg toolchain file")
find_package(nlohmann_json CONFIG REQUIRED)
target_link_libraries(my_project PRIVATE nlohmann_json::nlohmann_json)

CLion에서 vcpkg 툴체인 사용 시 CMAKE_TOOLCHAIN_FILE을 툴체인 환경 변수로 설정. Conan:

# conanfile.txt
[requires]
nlohmann_json/3.11.2
[generators]
CMakeDeps
CMakeToolchain
# CMakeLists.txt
find_package(nlohmann_json REQUIRED)
target_link_libraries(my_project PRIVATE nlohmann_json::nlohmann_json)

3.4 CMake Presets 활용

// CMakePresets.json
{
  "version": 3,
  "configurePresets": [
    {
      "name": "default",
      "hidden": true,
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/${presetName}",
      "cacheVariables": {
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
      }
    },
    {
      "name": "debug",
      "inherits": "default",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      }
    },
    {
      "name": "release",
      "inherits": "default",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    }
  ]
}

CLion은 CMakePresets.json을 자동 감지해 프로파일로 가져옵니다.

4. 고급 디버깅

4.1 기본 디버깅

실행: Shift+F10 (Run), Shift+F9 (Debug) 브레이크포인트: 줄 번호 왼쪽 클릭 또는 Ctrl+F8 (Win/Linux) / Cmd+F8 (Mac) 디버깅 예제 코드:

// debug_demo.cpp
#include <iostream>
#include <vector>
int computeSum(const std::vector<int>& data) {
    int sum = 0;
    for (size_t i = 0; i < data.size(); ++i) {
        sum += data[i];  // 브레이크포인트: i, sum 관찰
    }
    return sum;
}
int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    int result = computeSum(vec);
    std::cout << "Sum: " << result << "\n";
    return 0;
}

4.2 조건부 브레이크포인트

사용법: 브레이크포인트 우클릭 → Edit Breakpoint → Condition 입력

예: i == 3          → i가 3일 때만 멈춤
예: ptr == nullptr  → 널 포인터일 때만
예: data.size() > 1000  → 큰 입력에서만

4.3 Watches·Evaluate Expression

Watches: 디버깅 중 변수 추가 관찰

Watches 창에 입력:
- vec.size()
- vec.data()
- *ptr (포인터 역참조)

Evaluate Expression (Alt+F8): 실행 중 임의 식 계산

// 디버깅 중 Evaluate에서 실행 가능
vec.size()
std::accumulate(vec.begin(), vec.end(), 0)

4.4 역디버깅 (Reverse Debugging)

GDB 7.0+ / LLDB에서 실행을 역방향으로 되돌리며 디버깅할 수 있습니다. 활성화: SettingsBuild, Execution, DeploymentDebuggerEnable reverse debugging 제한: 기록 모드로 실행해 오버헤드가 큼. 필요한 구간만 사용 권장.

4.5 디버깅 워크플로

flowchart TD
    A[버그 재현] --> B[재현 가능한 최소 코드 작성]
    B --> C[의심 구간에 브레이크포인트]
    C --> D[Debug 실행]
    D --> E[Step Over/Into로 흐름 추적]
    E --> F[Watches로 변수 확인]
    F --> G{원인 파악?}
    G -->|아니오| C
    G -->|예| H[수정 후 재검증]

4.6 데이터 브레이크포인트

메모리 주소·변수 값 변경 시 멈추는 브레이크포인트.

1. Run → View Breakpoints (Ctrl+Shift+F8)
2. + → C++ Data Breakpoint
3. 예: &buffer — buffer 주소의 메모리가 변경될 때
4. 예: ptr — ptr가 가리키는 값이 변경될 때

사용 사례: 버퍼 오버플로우, 잘못된 포인터 수정, 레이스 컨디션 의심 시.

4.7 로그포인트 (Logpoint)

브레이크 없이 로그만 출력. 성능 영향 최소.

1. 브레이크포인트 우클릭 → Edit Breakpoint
2. "Log message to console" 체크
3. 예: "i={i}, sum={sum}"
4. 실행 시 콘솔에 로그만 출력되고 멈추지 않음

5. 리팩토링 도구

5.1 Rename (이름 변경)

단축키: Shift+F6 변수·함수·클래스·파일 이름을 바꾸면 모든 참조가 자동으로 변경됩니다.

// Before: computeSum → computeTotal 로 변경
int computeSum(const std::vector<int>& data) {
    // ...
}
// Refactor → Rename (Shift+F6) → computeTotal
// 모든 호출부가 computeTotal로 변경됨

5.2 Extract (추출)

Extract Function: Ctrl+Alt+M (Win/Linux) / Cmd+Alt+M (Mac) 선택한 코드 블록을 새 함수로 추출합니다.

// Before
void process() {
    std::vector<int> data = loadData();
    int sum = 0;
    for (int x : data) sum += x;
    std::cout << "Sum: " << sum << "\n";
}
// 블록 선택 후 Extract Function → 이름: printSum
// After
void printSum(const std::vector<int>& data) {
    int sum = 0;
    for (int x : data) sum += x;
    std::cout << "Sum: " << sum << "\n";
}
void process() {
    std::vector<int> data = loadData();
    printSum(data);
}

Extract Variable: Ctrl+Alt+V / Cmd+Alt+V Extract Parameter: Ctrl+Alt+P / Cmd+Alt+P

5.3 Change Signature

함수 시그니처 변경 시 호출부를 자동 업데이트합니다. RefactorChange Signature (Ctrl+F6 / Cmd+F6)

  • 매개변수 추가·삭제·순서 변경
  • 기본값 설정
  • 반환 타입 변경

5.4 Inline

함수 본문을 호출부에 인라인하고 함수 정의를 제거합니다. RefactorInline (Ctrl+Alt+N / Cmd+Alt+N)

6. 생산성 단축키·팁

6.1 필수 단축키 (macOS: Cmd → Ctrl)

동작Win/LinuxmacOS
검색 전체Shift+ShiftShift+Shift
파일 검색Ctrl+Shift+NCmd+Shift+O
심볼 검색Ctrl+Alt+Shift+NCmd+Alt+O
정의로 이동Ctrl+BCmd+B
구현으로 이동Ctrl+Alt+BCmd+Alt+B
사용처 찾기Alt+F7Alt+F7
호출 계층Ctrl+Alt+HCtrl+Alt+H
리팩토링 메뉴Ctrl+Shift+Alt+TCtrl+T
최근 파일Ctrl+ECmd+E
에디터 분할`Shift+Alt+좌/우Cmd+\

6.2 코드 생성

Live Template:

1. Settings → Editor → Live Templates
2. C++ → + → Live Template
3. Abbreviation: fori (for loop with index)
4. Template text:
   for (size_t $INDEX$ = 0; $INDEX$ < $CONTAINER$.size(); ++$INDEX$) {
       $END$
   }
5. Variables: INDEX=index, CONTAINER=container

기본 제공: mainint main() 생성, for → 범위 for 루프 등

6.3 다중 커서·선택

  • 다중 선택: Alt+J (다음 일치), Alt+Shift+J (모든 일치)
  • 컬럼 선택: Alt+Shift+드래그 (블록 선택)
  • 라인 복제: Ctrl+D / Cmd+D

6.4 구조 보기

  • File Structure: Ctrl+F12 / Cmd+F12 — 현재 파일의 함수·클래스 목록
  • Structure 창: 사이드바에서 클래스·함수 트리
  • Hierarchy: Ctrl+H — 클래스 상속 계층

6.5 TODO·FIXME

// TODO: 최적화 필요
// FIXME: 경계 조건 확인

ViewTool WindowsTODO — 프로젝트 전체 TODO/FIXME 목록

6.6 로컬 히스토리

VCS 없이 파일 변경 이력을 로컬에 저장합니다. FileLocal HistoryShow History — 이전 버전 복원 가능

6.7 북마크·핀

  • 북마크: F3 — 현재 위치 북마크, Ctrl+F3 — 이름 붙인 북마크
  • : 에디터 탭 우클릭 → Pin Tab — 자주 쓰는 파일 고정

6.8 스크래치 파일

임시 코드를 프로젝트 외부에 저장. FileNewScratch FileC++ 선택 — *.cpp 임시 파일 생성, 프로젝트 빌드에 포함되지 않음.

6.9 Compare with Clipboard / Branch

  • Clipboard와 비교: Ctrl+Shift+V — 클립보드 내용과 현재 파일 diff
  • Git Branch 비교: GitCompare with Branch — 다른 브랜치와 diff

6.10 Postfix 완성

코드 입력 후 점(.)과 키워드로 변환.

// 예: vec.for → 범위 for 루프로 변환
std::vector<int> vec = {1, 2, 3};
vec.for  // Tab → for (auto&& x : vec) { }
자주 쓰는 것: .for, .if, .null, .not, .cast

7. 자주 발생하는 문제

문제 1: “No toolchain found” / “툴체인을 찾을 수 없음”

원인: 시스템에 C++ 컴파일러가 없거나, CLion이 경로를 찾지 못함. 해결:

# macOS: Xcode Command Line Tools 설치
xcode-select --install
# Ubuntu/Debian
sudo apt install build-essential cmake gdb
# 경로 확인
which g++
which clang++

CLion: SettingsToolchains+System → 컴파일러 경로 수동 지정

문제 2: “CMake project is not loaded” / CMake 설정 실패

원인: CMakeLists.txt 문법 오류, 의존성 누락, 툴체인 불일치. 해결:

  1. CMakeLists.txt 문법 확인:
# 흔한 실수: 괄호 불일치
add_executable(my_app
    main.cpp
    # 닫는 괄호 누락
  1. CMake 로그 확인: ViewTool WindowsCMake — 에러 메시지 확인
  2. 캐시 삭제 후 재설정:
rm -rf cmake-build-* build
# CLion에서 File → Reload CMake Project

문제 3: 디버거에서 브레이크포인트가 안 걸림 (회색)

원인: Release 빌드로 실행 중이거나, 최적화로 인해 라인이 생략됨. 해결:

  1. Debug 프로파일로 빌드·실행 확인
  2. CMake 옵션에 디버그 정보 추가:
# CMakeLists.txt - Debug에서만
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
endif()
  1. 최적화 비활성화: -O0 사용

문제 4: “Cannot find -lxxx” (링커 에러)

원인: 라이브러리 경로 또는 링크 대상이 잘못됨. 해결:

# 올바른 find_package 및 target_link_libraries
find_package(OpenSSL REQUIRED)
target_link_libraries(my_app PRIVATE OpenSSL::SSL OpenSSL::Crypto)
# vcpkg 사용 시
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
find_package(OpenSSL CONFIG REQUIRED)

문제 5: 인덱싱이 너무 느림 / CPU 100%

원인: 대규모 프로젝트, 외부 라이브러리 포함, 빌드 디렉터리 인덱싱. 해결:

  1. 제외 경로 설정: SettingsBuild, Execution, DeploymentCMakeExclude from projectbuild, cmake-build-*, third_party 등 추가
  2. 인덱싱 제외: SettingsProjectDirectories → 폴더 우클릭 → Mark asExcluded
  3. 메모리 할당 증가: HelpEdit Custom VM Options-Xmx4096m (4GB 등)

문제 6: “undefined reference” — 헤더만 있고 구현 없음

원인: 선언만 있고 정의가 없거나, 링크 대상에 소스 파일 미포함. 해결:

# 모든 소스 파일 포함
add_executable(my_app
    main.cpp
    utils.cpp
    parser.cpp
)
# utils.cpp에 Utils::parse() 구현이 있어야 함

문제 7: Docker/원격 툴체인 연결 실패

원인: SSH 키, 경로, 권한 문제. 해결:

  1. SSH 연결 테스트: 터미널에서 ssh user@host 수동 확인
  2. 원격 컴파일러 경로: /usr/bin/g++ 등 표준 경로 사용
  3. 디버거: 원격에 GDB/LLDB 설치 확인

문제 8: 한글 경로·파일명에서 빌드 실패

원인: 일부 툴체인·CMake가 비ASCII 경로를 제대로 처리하지 못함. 해결: 프로젝트 경로를 영문만 사용 (예: C:\dev\my_project)

문제 9: “Symbol not found” / 헤더는 있는데 정의 못 찾음

원인: compile_commands.json 미생성, 인덱싱 미완료, 잘못된 include 경로. 해결:

# CMakeLists.txt
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# 빌드 후 compile_commands.json 생성됨
# 수동 생성 (CLion 외부에서)
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
# build/compile_commands.json 확인

문제 10: Run Configuration이 저장 안 됨

원인: “Share” 체크 안 함 → 로컬에만 저장. 해결: Edit Configurations → 해당 설정 → 우측 상단 “Share” 체크 → .idea/runConfigurations/에 XML로 저장되어 팀과 공유 가능.

8. 프로덕션 패턴

8.1 팀 공통 설정

EditorConfig로 포맷 통일:

# .editorconfig
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{cpp,h,hpp}]
indent_size = 4

공유 Run Configuration:

1. Run → Edit Configurations
2. + → CMake Application
3. 타겟, 실행 인자, 환경 변수 설정
4. "Share" 체크 → .idea/runConfigurations/ 에 저장
5. 팀원이 동일 설정 사용

8.2 CI와 동일한 빌드

CLion에서 사용하는 CMake 옵션을 CI 스크립트와 맞춥니다.

# .github/workflows/build.yml 예시
- name: Configure
  run: |
    cmake -B build -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_CXX_COMPILER=g++-12
- name: Build
  run: cmake --build build
CLion CMake options에 동일한 -D 옵션 추가

8.3 프로파일별 설정

프로파일용도CMAKE_BUILD_TYPE
Debug개발·디버깅Debug
Release성능 측정·배포Release
RelWithDebInfo프로파일링·최적화 디버깅RelWithDebInfo

8.4 대규모 프로젝트

flowchart TD
    A[대규모 코드베이스] --> B[CMake Presets로 프로파일 분리]
    B --> C[제외 경로 설정]
    C --> D[인덱싱 최적화]
    D --> E[모듈별 Run Configuration]
  • Compilation Database: -DCMAKE_EXPORT_COMPILE_COMMANDS=ON — Clangd 등과 공유
  • 모듈화: 서브디렉터리별 add_subdirectory, 필요한 타겟만 빌드

8.5 코드 품질 게이트

# .clang-tidy - CI와 동일 규칙
Checks: >
  bugprone-*,
  performance-*,
  modernize-*,
  readability-*
WarningsAsErrors: 'bugprone-*,performance-*'

CLion에서 저장 시 또는 커밋 전에 Clang-Tidy 경고를 0으로 유지하는 습관.

9. 체크리스트

설치·설정

  • CLion 설치 (JetBrains Toolbox 또는 직접)
  • 툴체인 설정 (GCC/Clang/MSVC)
  • CMake 프로파일 구성 (Debug/Release)
  • CMAKE_EXPORT_COMPILE_COMMANDS=ON 설정
  • Clang-Tidy 연동 (선택)

디버깅

  • Debug 프로파일로 빌드·실행
  • 브레이크포인트·조건부 BP 활용
  • Watches·Evaluate Expression 사용
  • 역디버깅 필요 시 활성화

리팩토링

  • Rename (Shift+F6) — 이름 변경
  • Extract Function/Variable
  • Change Signature
  • Find Usages로 영향 범위 확인

생산성

  • 필수 단축키 숙지 (검색, 정의로 이동, 사용처 찾기)
  • Live Template 커스터마이즈
  • TODO 창 활용
  • 로컬 히스토리 복원

프로덕션

  • EditorConfig 공유
  • Run Configuration 공유
  • CI와 동일한 CMake 옵션
  • 제외 경로로 인덱싱 최적화

정리

항목핵심
설정툴체인·CMake 프로파일·Debug/Release 분리
디버깅조건부 BP, Watches, Evaluate, 역디버깅
리팩토링Rename, Extract, Change Signature
생산성검색, 정의 이동, 단축키, Live Template
에러툴체인·CMake·디버그 심볼·링커·인덱싱
프로덕션EditorConfig, Run Config 공유, CI 일치
핵심 원칙:
  1. Debug로 디버깅 — Release에서는 브레이크포인트가 제대로 동작하지 않을 수 있음
  2. 리팩토링은 도구에 맡기기 — 수동 변경은 누락 위험
  3. 제외 경로 설정 — 빌드 산출물·서브모듈은 인덱싱에서 제외
  4. 팀 설정 공유 — Run Config, EditorConfig로 환경 통일

자주 묻는 질문 (FAQ)

Q. 이 내용을 실무에서 언제 쓰나요?

A. C++ 크로스 플랫폼 개발, 대규모 코드베이스 탐색, 리팩토링 작업, 원격/도커 개발 등에 활용합니다. CLion은 CMake 기반 프로젝트에 최적화되어 있어, vcpkg·Conan과 함께 사용하면 의존성 관리도 편합니다.

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

A. CMake 입문에서 CMake 기본을, GDB/LLDB 디버거에서 디버깅 개념을 먼저 익히면 좋습니다. VSCode C++ 설정과 비교해 보면 IDE 선택에 도움이 됩니다.

Q. 더 깊이 공부하려면?

A. CLion 공식 문서, CMake 문서, cppreference를 참고하세요. JetBrains 블로그의 C++ 관련 포스트도 유용합니다.

참고 자료


관련 글

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

이 부록은 앞선 본문에서 다룬 주제(「C++ CLion 완벽 가이드 | 설치·설정·디버깅·리팩토링·생산성 [#53-1]」)를 구현·런타임·운영 관점에서 다시 압축합니다. 도메인별 세부 구현은 글마다 다르지만, 입력 검증 → 핵심 연산 → 부작용(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++ CLion 완벽 가이드 | 설치·설정·디버깅·리팩토링·생산성 [#53-1]」)를 배포·운영 흐름에 맞춰 옮긴 체크리스트입니다. 도메인에 맞게 단계 이름만 바꿔 적용할 수 있습니다.

  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++, CLion, IDE, 디버깅, 리팩토링, CMake, 생산성 등으로 검색하시면 이 글이 도움이 됩니다.