<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Konsla Hobby</title>
    <link>https://konsla99.tistory.com/</link>
    <description>konsla99 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 11 May 2026 08:42:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Konsla99</managingEditor>
    <item>
      <title>완전탐색 Exhausitive Search (DFS,BFS with C++)</title>
      <link>https://konsla99.tistory.com/19</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG19an/dJMcagk8Pe0/PwfkpSjyzD2YUJpLZOdAF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG19an/dJMcagk8Pe0/PwfkpSjyzD2YUJpLZOdAF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG19an/dJMcagk8Pe0/PwfkpSjyzD2YUJpLZOdAF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG19an%2FdJMcagk8Pe0%2FPwfkpSjyzD2YUJpLZOdAF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;완전 탐색 (Brute Force)&lt;/h2&gt;
&lt;p&gt;모든 경우의 수를 다 체크해서 정답을 찾는 방법입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BIG O notation:&lt;/strong&gt; 1초 = 10^8 연산 기준&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;입력 조건:&lt;/strong&gt; n &amp;lt;= 100이라면 O(n^3)까지 허용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;INDEX&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;비트 마스크&lt;/li&gt;
&lt;li&gt;순열 / 조합&lt;/li&gt;
&lt;li&gt;백 트래킹&lt;/li&gt;
&lt;li&gt;DFS / BFS&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;완전 탐색 기법 활용 방법&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Brute Force:&lt;/strong&gt; 단순 반복/조건문 활용 테스트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비트 마스크:&lt;/strong&gt; 부분 집합/상태 표현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;순열/조합:&lt;/strong&gt; N개 중 순서 조합으로 뽑기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재귀 호출:&lt;/strong&gt; 상태 변화 + 깊이 우선 분할정복&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFS/DFS:&lt;/strong&gt; 그래프 탐색&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;백트래킹:&lt;/strong&gt; 조건 불만족 시 조기 탈출&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;해결하고자 하는 문제의 가능한 경우의 수를 계산하고 모든 방법을 고려합니다. 기본적으로 N의 크기가 작을 때 이용합니다.&lt;/p&gt;
&lt;h3&gt;1. 단순 Brute-Force (반복문 활용)&lt;/h3&gt;
&lt;p&gt;무식하게 푼다는 의미로, for/while 문을 이용합니다. 일반적으로 중첩된 반복문을 사용하여 모든 조합을 조사합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EX) 두 수의 합이 100이 되는 경우 찾기&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main() {
    for(int a = 0; a &amp;lt;= 100; a++) {
        for(int b = 0; b &amp;lt;= 100; b++) {
            if(a + b == 100) {
                cout &amp;lt;&amp;lt; &amp;quot;a=&amp;quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &amp;quot;, b=&amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
            }
        }
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;단순 반복을 통해 100 * 100의 모든 경우의 수를 필터링합니다.&lt;/p&gt;
&lt;h3&gt;2. 비트 마스크 (Bit Mask)&lt;/h3&gt;
&lt;p&gt;2진수를 이용하는 컴퓨터의 연산 방식을 이용합니다. 각 원소가 포함/포함X인 두 가지 선택으로 구성되는 경우 유용합니다.&lt;br&gt;어떤 집합의 부분 집합은 원소가 포함 되거나, 아니거나 2가지 경우다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4MFng/dJMcaffwv8c/vNfVK4C48h4CWjYVOuJDYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4MFng/dJMcaffwv8c/vNfVK4C48h4CWjYVOuJDYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4MFng/dJMcaffwv8c/vNfVK4C48h4CWjYVOuJDYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4MFng%2FdJMcaffwv8c%2FvNfVK4C48h4CWjYVOuJDYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;498&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int main() {
    vector&amp;lt;int&amp;gt; S = {1, 3, 4, 7, 10};
    int n = S.size();                      // size = 5

    // 32가지(2^n) flag 생성
    for (int bit = 0; bit &amp;lt; (1 &amp;lt;&amp;lt; n); bit++) {
        cout &amp;lt;&amp;lt; &amp;quot;subset: { &amp;quot;;
        // 32가지 플래그에 맞춰 종류 검사(5비트)
        for (int i = 0; i &amp;lt; n; i++) {
            if (bit &amp;amp; (1 &amp;lt;&amp;lt; i)) {
                cout &amp;lt;&amp;lt; S[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
            }
        }
        cout &amp;lt;&amp;lt; &amp;quot;}\n&amp;quot;;
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;1 &amp;lt;&amp;lt; n&lt;/code&gt;은 2^n을 의미합니다.&lt;/p&gt;
&lt;h3&gt;3. 순열 / 조합&lt;/h3&gt;
&lt;h4&gt;순열 (next_permutation)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

int main() {
    vector&amp;lt;int&amp;gt; arr{1, 2, 3};
    sort(arr.begin(), arr.end()); // 사전 순 정렬 필수

    do {
        for(int i = 0; i &amp;lt; arr.size(); ++i) {
            cout &amp;lt;&amp;lt; arr[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
        }
        cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
    } while(next_permutation(arr.begin(), arr.end()));
}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;조합 (마스크 활용)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

int main() {
    vector&amp;lt;int&amp;gt; arr{1, 2, 3};
    vector&amp;lt;int&amp;gt; mask{1, 1, 0};    // 3개중 2개를 고르는 마스크
    sort(mask.begin(), mask.end()); // 마스크 정렬

    do {
        for (int i = 0; i &amp;lt; arr.size(); i++) {
            if(mask[i]) {
                cout &amp;lt;&amp;lt; arr[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
            }
        }
        cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
    } while(next_permutation(mask.begin(), mask.end()));
}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;중복 조합 (재귀 활용)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

template &amp;lt;typename T&amp;gt;
void comb(const vector&amp;lt;T&amp;gt;&amp;amp; arr, int r, int start, vector&amp;lt;T&amp;gt;&amp;amp; selected) {
    if (selected.size() == r) {
        for(int x : selected) cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
        cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        return;
    }
    for(int i = start; i &amp;lt; arr.size(); ++i) {
        selected.push_back(arr[i]);
        comb(arr, r, i, selected); // i부터 다시 원소 저장 가능 (중복 허용)
        selected.pop_back(); // 백트래킹
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;중복 조합 실행 흐름&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;comb(arr, r, start, selected):
├─ selected.size() == r → 출력 및 종료
└─ for i = start to arr.size():
    ├─ selected.push_back(arr[i]) // 원소 선택
    ├─ comb(arr, r, i, selected)    // 재귀 호출 (현재 인덱스 i 유지로 중복 허용)
    └─ selected.pop_back()         // 백트래킹 (원상 복구)&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;중복 순열&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

template &amp;lt;typename T&amp;gt;
void repeat_permute(const vector&amp;lt;T&amp;gt;&amp;amp; arr, int r, vector&amp;lt;T&amp;gt;&amp;amp; selected) {
    if(selected.size() == r) {
        for(T x : selected) cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
        cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        return;
    }
    for(int i = 0; i &amp;lt; arr.size(); ++i) {
        selected.push_back(arr[i]);     // 현재원소 선택
        repeat_permute(arr, r, selected); // 다음 원소로 이동 (중복허용)
        selected.pop_back();            // 백트래킹
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;4. 부분집합 (재귀 활용)&lt;/h3&gt;
&lt;p&gt;시각적 호출 트리 (arr = {1,2,3})&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;subset_recursive(0, [])
├── 선택 1 → [1]
│   ├── 선택 2 → [1,2]
│   │   ├── 선택 3 → [1,2,3] ✅
│   │   └── 비선택 3 → [1,2] ✅
│   └── 비선택 2 → [1]
│       ├── 선택 3 → [1,3] ✅
│       └── 비선택 3 → [1] ✅
└── 비선택 1 → []
    ├── 선택 2 → [2]
    │   ├── 선택 3 → [2,3] ✅
    │   └── 비선택 3 → [2] ✅
    └── 비선택 2 → []
        ├── 선택 3 → [3] ✅
        └── 비선택 3 → [] ✅&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

void subset_recur(const vector&amp;lt;int&amp;gt;&amp;amp; arr, int index, vector&amp;lt;int&amp;gt;&amp;amp; current) {
    if(index == arr.size()) {
        for(int x : current) cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
        cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;
        return;
    }
    // 1. 선택하는 경우
    current.push_back(arr[index]);
    subset_recur(arr, index + 1, current);
    current.pop_back();

    // 2. 선택하지 않는 경우
    subset_recur(arr, index + 1, current);
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;5. 백 트래킹 (Backtracking)&lt;/h3&gt;
&lt;p&gt;모든 경우의 수를 시도하며, &lt;strong&gt;조건에 맞지 않으면 되돌아가는(취소하는)&lt;/strong&gt; 방식의 탐색 알고리즘입니다. 되돌아가기 기능이 있는 완전 탐색입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void backtrack() {
    if (정답이거나 끝 조건이면) {
        출력 or 기록
        return;
    }
    for (모든 선택지) {
        선택
        backtrack(); // 다음 단계로 탐색
        선택 취소   // ✅ 이게 백트래킹 (원상 복구)
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;가능한 모든 경우 탐색 (완전 탐색)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;차이점&lt;/td&gt;
&lt;td&gt;매 단계마다 &amp;quot;이 선택이 맞나?&amp;quot; 판단하고, 아니면 돌아감&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;되돌림&lt;/td&gt;
&lt;td&gt;pop_back(), visited[i] = false 같은 코드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가지치기&lt;/td&gt;
&lt;td&gt;조건을 걸어 불필요한 경로를 탐색하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;핵심 3요소:&lt;/strong&gt; 선택, 재귀 호출, 되돌리기&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;6. DFS / BFS&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기법&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;대표 적용 분야&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;DFS&lt;/td&gt;
&lt;td&gt;깊이 우선 탐색&lt;/td&gt;
&lt;td&gt;백트래킹, 경로 탐색, 트리, 재귀 기반 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BFS&lt;/td&gt;
&lt;td&gt;너비 우선 탐색&lt;/td&gt;
&lt;td&gt;최단 거리, 레벨 탐색, 큐 기반 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;DFS (Depth First Search)&lt;/h4&gt;
&lt;p&gt;한 방향으로 끝까지 깊이 들어갔다가, 더 이상 갈 수 없으면 다시 돌아오는 방식의 탐색 알고리즘입니다. 스택(Stack) 또는 재귀 호출을 사용하여 구현합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

vector&amp;lt;int&amp;gt; adj[100]; // 인접 리스트
bool visited[100];    // 방문 체크

void dfs(int now) {
    visited[now] = true;
    cout &amp;lt;&amp;lt; now &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
    for (int next : adj[now]) {
        if (!visited[next]) {
            dfs(next); // 방문하지 않은 노드로 더 깊이 탐색
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;BFS (Breadth First Search)&lt;/h4&gt;
&lt;p&gt;시작 노드에서 가까운 노드부터 차례대로 탐색하는 방식입니다. 큐(Queue)를 사용하여 구현하며, 최단 경로를 찾을 때 주로 사용됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

void bfs(int start, vector&amp;lt;int&amp;gt; adj[], bool visited[]) {
    queue&amp;lt;int&amp;gt; q;
    q.push(start);
    visited[start] = true;

    while (!q.empty()) {
        int now = q.front();
        q.pop();
        cout &amp;lt;&amp;lt; now &amp;lt;&amp;lt; &amp;quot; &amp;quot;;
        for (int next : adj[now]) {
            if (!visited[next]) {
                visited[next] = true;
                q.push(next);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;  완전 탐색 효율 높이기: 가지치기 (Pruning)&lt;/p&gt;
&lt;p&gt;완전 탐색은 모든 경우를 다 보지만, 절대 답이 될 수 없는 경로를 미리 차단하면 시간을 획기적으로 줄일 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;방법:&lt;/strong&gt; 재귀 함수 상단에 &lt;code&gt;if (현재 값이 최솟값보다 크면) return;&lt;/code&gt; 과 같은 조건 추가&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;효과:&lt;/strong&gt; 탐색해야 할 트리(State Space Tree)의 가지를 쳐내어 복잡도를 실질적으로 감소시킴&lt;/p&gt;
&lt;h3&gt;요약 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;DFS (깊이 우선)&lt;/th&gt;
&lt;th&gt;BFS (너비 우선)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;자료구조&lt;/td&gt;
&lt;td&gt;재귀(함수 스택) / Stack&lt;/td&gt;
&lt;td&gt;Queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특징&lt;/td&gt;
&lt;td&gt;경로의 특징을 저장할 때 유리&lt;/td&gt;
&lt;td&gt;최단 거리 보장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리&lt;/td&gt;
&lt;td&gt;비교적 적게 사용&lt;/td&gt;
&lt;td&gt;노드가 많을수록 큐 공간 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;종료 조건&lt;/td&gt;
&lt;td&gt;바닥에 도달하면 백트래킹&lt;/td&gt;
&lt;td&gt;목표 노드 발견 시 즉시 종료 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;결론:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;문제에서 &amp;quot;모든 조합을 만들어라&amp;quot; → 재귀/백트래킹(DFS)&lt;/li&gt;
&lt;li&gt;문제에서 &amp;quot;최소 횟수/최단 거리&amp;quot; → BFS&lt;/li&gt;
&lt;li&gt;N이 매우 작고 상태가 2가지(ON/OFF) → 비트 마스크&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ref&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://be-senior-developer.tistory.com/117&quot;&gt;https://be-senior-developer.tistory.com/117&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://rebro.kr/59&quot;&gt;https://rebro.kr/59&lt;/a&gt;﻿&lt;/p&gt;</description>
      <category>Core Tech (기반 기술)/알고리즘&amp;amp;자료구조</category>
      <category>BFS</category>
      <category>DFS</category>
      <category>알고리즘</category>
      <category>완전탐색</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/19</guid>
      <comments>https://konsla99.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 10 May 2026 21:20:30 +0900</pubDate>
    </item>
    <item>
      <title>클린 코딩</title>
      <link>https://konsla99.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXKjF/dJMcagFuvKF/rdsKEXp4wmOzzTUt0OBIkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXKjF/dJMcagFuvKF/rdsKEXp4wmOzzTUt0OBIkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXKjF/dJMcagFuvKF/rdsKEXp4wmOzzTUt0OBIkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXKjF%2FdJMcagFuvKF%2FrdsKEXp4wmOzzTUt0OBIkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;my-index&quot;&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;#intro&quot;&gt;클린코딩이란?&lt;/a&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;#section1&quot;&gt;클린코딩을 위한 8가지 원칙&lt;/a&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;#section2&quot;&gt;기타 클린코딩/코딩 컨벤션 팁&lt;/a&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;h2 id=&quot;intro&quot; data-ke-size=&quot;size26&quot;&gt;클린코딩이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클린코딩(Clean Code)이란 가독성이 높고, 의도가 명확하며, 유지보수가 용이한 코드를 작성하는 것을 의미합니다. 단순히 프로그램이 동작하는 것에 그치지 않고, 동료 개발자나 미래의 자신이 코드를 보았을 때 추가적인 설명 없이도 그 로직을 한눈에 파악할 수 있도록 설계된 코드를 말합니다. 깨끗한 코드는 버그를 줄이고, 협업의 효율성을 극대화하며, 소프트웨어의 생명 주기를 연장하는 핵심적인 역할을 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;section1&quot; data-ke-size=&quot;size26&quot;&gt;클린 코딩을 위한 8가지 원칙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 명명 규칙 (Naming Convention)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Camel Case 사용: &lt;code&gt;userName&lt;/code&gt;, &lt;code&gt;isEnabled&lt;/code&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스: PascalCase (예: &lt;code&gt;UserManager&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;상수: 대문자 + 언더스코어 (&lt;code&gt;MAX_SIZE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;메서드: 동사 중심 (&lt;code&gt;getName()&lt;/code&gt;, &lt;code&gt;calculateTotal()&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;변수/클래스: 명사 중심&lt;/li&gt;
&lt;li&gt;의미 없는 약어, 숫자, 특수문자 사용 지양&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 의미를 명확하게 표현&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수와 변수 이름만 봐도 동작과 목적이 이해되어야 함&lt;/li&gt;
&lt;li&gt;예: &lt;code&gt;check()&lt;/code&gt; &amp;rarr; &lt;code&gt;isPasswordValid()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 변수 및 메서드 위치 정리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 멤버는 파일 상단에 정리&lt;/li&gt;
&lt;li&gt;지역 변수는 사용하는 위치에서 가까이 선언&lt;/li&gt;
&lt;li&gt;메서드는 호출 순서에 따라 위에서 아래로 구성 &amp;rarr; 흐름 파악 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 한 메서드는 하나의 기능만 수행&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 책임 원칙(Single Responsibility Principle)&lt;/li&gt;
&lt;li&gt;하나의 함수가 여러 역할(입력 처리 + 로직 처리 + 출력 등)을 하지 않도록 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 메서드는 작게 작성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 5~10줄 이내 유지 권장&lt;/li&gt;
&lt;li&gt;명확한 목적을 가진 짧은 함수로 나눌수록 재사용성과 테스트 용이성 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 코드 최소화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불필요한 중복, 조건문, 변수 제거&lt;/li&gt;
&lt;li&gt;간단한 표현 가능 시 삼항 연산자, 범위 기반 for 등 적극 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. 중복 제거&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반복되는 코드 &amp;rarr; 별도 함수나 공통 유틸로 분리&lt;/li&gt;
&lt;li&gt;유사 기능을 하는 함수가 다수 존재한다면 통합 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. 적절한 주석 활용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡한 알고리즘이나 예외적인 흐름에만 주석 추가&lt;/li&gt;
&lt;li&gt;가능한 한 &quot;코드 자체로 의도를 설명&quot;하도록 작성&lt;/li&gt;
&lt;li&gt;잘못된 주석, 오래된 주석은 삭제하는 것이 낫다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;section2&quot; data-ke-size=&quot;size26&quot;&gt;기타 클린코딩/코딩 컨벤션 팁&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 및 클래스 구조&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 파일에는 하나의 클래스 또는 주요 기능 단위로 구성&lt;/li&gt;
&lt;li&gt;파일명은 클래스명과 일치하도록&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;들여쓰기 및 줄바꿈&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 4 space 또는 1 tab 사용 (팀 기준에 따름)&lt;/li&gt;
&lt;li&gt;블록 시작 전 빈 줄로 의미 구분 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에러 핸들링&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예외 상황 처리를 명확하게&lt;/li&gt;
&lt;li&gt;try-catch 범위를 좁게, 예외 메시지는 구체적으로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;의미 있는 커밋 메시지&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경 이유와 목적이 드러나도록&lt;/li&gt;
&lt;li&gt;예: &lt;code&gt;Fix: buffer overflow in input parser&lt;/code&gt;, &lt;code&gt;Refactor: extract log formatting logic&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문서화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수별 주석보다 문서화 도구 활용 권장 (예: Doxygen)&lt;/li&gt;
&lt;li&gt;클래스/모듈 단위로 기능 요약 문서 구성&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Engineering Principles/Convention</category>
      <category>가독성</category>
      <category>소프트웨어공학</category>
      <category>유지보수</category>
      <category>코딩컨벤션</category>
      <category>클린코드</category>
      <category>프로그래밍팁</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/18</guid>
      <comments>https://konsla99.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 10 May 2026 19:51:36 +0900</pubDate>
    </item>
    <item>
      <title>[블로그] 블로그 꾸미기 with  AI</title>
      <link>https://konsla99.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwVcw7/dJMcaaE065B/3tKD9RgYX0pg5RKEv8Z7V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwVcw7/dJMcaaE065B/3tKD9RgYX0pg5RKEv8Z7V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwVcw7/dJMcaaE065B/3tKD9RgYX0pg5RKEv8Z7V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwVcw7%2FdJMcaaE065B%2F3tKD9RgYX0pg5RKEv8Z7V0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1324&quot; height=&quot;619&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;619&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 블로그 모습&lt;/b&gt;&lt;br&gt;해당 블로그의 모습에서 카테고리 섹션에 각각 대표 이미지를 추가하려한다.&lt;br&gt;본인은 프론트엔드 쪽은 잘 하지 못하므로 AI의 도움을 받았다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;Back Ground&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
 &lt;li&gt;다음과 같이 간단하게 지침을 만들어 주었다.&lt;/li&gt; 
 &lt;li&gt;작업 과정에서 6천줄이 넘는 티스토리의 html, Css를 읽고 파싱하면 다음과 같은 문제가 있다. 
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
   &lt;li&gt;작업이 길어지면 처리속도가 10분이 넘어간다.&lt;/li&gt; 
   &lt;li&gt;파싱하는데에도 많은 시간이 소요&lt;/li&gt; 
   &lt;li&gt;이는 웹에서와 마찬가지로 전체적인 문맥을 파악하려는 AI특성으로 인해 점점 느려진다.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;따라서 이전에 Skills를 통해 html과 css작업에 대해 다음 2개의 서브에이전트 호출을 명시했다. 
  &lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt; 
   &lt;li&gt;업무 내용 파악 및 정리 Agent&lt;/li&gt; 
   &lt;li&gt;작업용 Agent&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;✦ 현재 skills/ 디렉토리에 정의되어 있는 서브 에이전트(Skill)는 다음과 같습니다. 

   1. tech-blog-analyzer: 기술 블로그 분석을 담당하는 에이전트입니다.
   2. tech-blog-executor: 기술 블로그 관련 작업을 실행하는 에이전트입니다. &lt;/code&gt;&lt;/pre&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;setting&lt;/h3&gt;&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;## 블로그 수정작업

### Task
- tistory.html
- style.css
- 해당 두 파일에 대해 수정 작업을 수행할 예정

### 지침
- 두파일중 하나만 수정하면 동작을 안하는 경우가 있음
- html, css작업은 skills를 참고해 서브에이전트를 활용할 것

### Ref
- skills
- image src&lt;/code&gt;&lt;/pre&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;work&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;세팅이 끝나면 간단하게 명령을 한다.&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejzB7d/dJMcacCPaYV/Fmd6g8uUJ21QYbJjNGTGN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejzB7d/dJMcacCPaYV/Fmd6g8uUJ21QYbJjNGTGN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejzB7d/dJMcacCPaYV/Fmd6g8uUJ21QYbJjNGTGN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejzB7d%2FdJMcacCPaYV%2FFmd6g8uUJ21QYbJjNGTGN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;127&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Result&lt;br&gt;&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/delLuJ/dJMcagrFegf/KsJMSsPRqMjsnR0vAet0a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/delLuJ/dJMcagrFegf/KsJMSsPRqMjsnR0vAet0a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/delLuJ/dJMcagrFegf/KsJMSsPRqMjsnR0vAet0a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdelLuJ%2FdJMcagrFegf%2FKsJMSsPRqMjsnR0vAet0a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1447&quot; height=&quot;629&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;</description>
      <category>PLAYGROUND</category>
      <category>Agent</category>
      <category>ai</category>
      <category>서브에이전트</category>
      <category>스킨수정</category>
      <category>티스토리</category>
      <category>하네스엔지니어링</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/17</guid>
      <comments>https://konsla99.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 19 Apr 2026 02:30:46 +0900</pubDate>
    </item>
    <item>
      <title>코드의 가독성을 결정하는 Naming Conventions 가이드</title>
      <link>https://konsla99.tistory.com/16</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드의 가독성을 결정하는 Naming Conventions 가이드&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dARl9Y/dJMcacQbckL/x27vtnCDEClnJDfQhIJJT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dARl9Y/dJMcacQbckL/x27vtnCDEClnJDfQhIJJT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dARl9Y/dJMcacQbckL/x27vtnCDEClnJDfQhIJJT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdARl9Y%2FdJMcacQbckL%2Fx27vtnCDEClnJDfQhIJJT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 작성 시 식별자(변수, 함수, 타입 등)의 이름을 정하는 규칙은 협업과 유지보수의 핵심입니다. 주요 표기법과 실전 적용 방식을 정리했습니다.&lt;/p&gt;
&lt;div class=&quot;my-callout info&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;주요 표기법 요약&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;snake_case:&lt;/b&gt; 모든 단어를 소문자로 쓰고 언더바(&lt;code&gt;_&lt;/code&gt;)로 연결 (DB, Python 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;camelCase:&lt;/b&gt; 첫 단어는 소문자, 이후 단어 첫 글자는 대문자 (Java, JS, C++ 변수/함수)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PascalCase:&lt;/b&gt; 모든 단어의 첫 글자를 대문자로 표기 (클래스명, C++ 타입명)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SCREAMING_SNAKE_CASE:&lt;/b&gt; 모든 단어를 대문자로 쓰고 언더바로 연결 (상수, 매크로)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 나만의 네이밍 원칙 (C++/Embedded 중심)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 프로젝트(Refactor: OD-291)에 적용된 가독성 향상 규칙입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클래스 및 함수&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스명:&lt;/b&gt; &lt;code&gt;PascalCase&lt;/code&gt; 사용 (예: &lt;code&gt;class PascalCaseNaming&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;함수/변수명:&lt;/b&gt; &lt;code&gt;camelCase&lt;/code&gt; 사용하되, 함수는 &lt;b&gt;동사&lt;/b&gt;로 시작 (예: &lt;code&gt;createUi()&lt;/code&gt;, &lt;code&gt;connectMotor()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특수 변수 및 멤버 변수&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;멤버 변수:&lt;/b&gt; 가독성을 위해 접두어 &lt;code&gt;m_&lt;/code&gt; 사용 (예: &lt;code&gt;m_num&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자료구조/포인터:&lt;/b&gt; 접미어를 활용하여 성격 명시 (예: &lt;code&gt;m_imgVec&lt;/code&gt;, &lt;code&gt;varPtr&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Signal/Slot:&lt;/b&gt; 일반 함수와 구분하기 위해 접두어 사용 (예: &lt;code&gt;slots_camelCase()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 상황별 추천 네이밍 전략&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베디드나 센서 데이터 처리 시 구조에 따라 네이밍 방향이 달라집니다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;추천 네이밍&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;센서별 독립 관리&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;getSensor1Val()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;센서 중심, 각 센서의 기능이 명확히 묶임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기능 중심 공통 처리&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;getVal_sensor1()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;기능 중심, switch-case나 배열 관리에 용이&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;my-callout tip&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;헝가리안 표기법(Hungarian Notation)에 대하여&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대 IDE의 발전으로 변수 타입을 접두어로 붙이는 방식은 줄어드는 추세입니다. 다만, &lt;b&gt;멤버 변수(m_)&lt;/b&gt;나 &lt;b&gt;포인터(ptr)&lt;/b&gt; 등 범위를 나타내거나 중요한 정보를 담는 접두어/접미어는 여전히 권장됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 결론: 리팩토링 적용 사례&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 리팩토링 작업(OD-291)에서 가독성을 위해 다음과 같이 수정했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Body 영역은 &lt;code&gt;camelCase&lt;/code&gt; 원칙 준수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tmp&lt;/code&gt;, &lt;code&gt;raw&lt;/code&gt;, &lt;code&gt;max&lt;/code&gt; 등의 수식어는 &lt;code&gt;camelCase&lt;/code&gt; 내에 통합&lt;/li&gt;
&lt;li&gt;기능에 더 적합한 이름으로 함수명 고도화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://github.com/QuantumLeaps/embedded-coding-style/blob/main/SECTION1.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Embedded Coding Style Guide&lt;/a&gt;&lt;/p&gt;</description>
      <category>Engineering Principles/Convention</category>
      <category>camelcase</category>
      <category>Hunarian</category>
      <category>snakecase</category>
      <category>스네이크케이스</category>
      <category>카멜케이스</category>
      <category>파스칼케이스</category>
      <category>헝가리안표기법</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/16</guid>
      <comments>https://konsla99.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 6 Apr 2026 05:43:05 +0900</pubDate>
    </item>
    <item>
      <title>C++ Naming Conventions: 주요 원칙 및 가이드라인</title>
      <link>https://konsla99.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;C++ Naming Conventions: 주요 원칙 및 가이드라인&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tNQWO/dJMcabX2KD2/YGmpOB3YjivEBqiZw90oMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tNQWO/dJMcabX2KD2/YGmpOB3YjivEBqiZw90oMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tNQWO/dJMcabX2KD2/YGmpOB3YjivEBqiZw90oMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtNQWO%2FdJMcabX2KD2%2FYGmpOB3YjivEBqiZw90oMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ 프로젝트의 가독성과 유지보수성을 높이기 위한 명명 규칙(Naming Convention) 정리입니다.&lt;/p&gt;
&lt;div class=&quot;my-callout info&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;참고 문서&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Google C++ Style Guide: https://google.github.io/styleguide/cppguide.html#Naming&lt;/li&gt;
&lt;li&gt;GeeksforGeeks: https://www.geeksforgeeks.org/cpp/naming-convention-in-c/&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 주요 원칙&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;대상&lt;/th&gt;
&lt;th&gt;표기법&lt;/th&gt;
&lt;th&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;타입명&lt;/td&gt;
&lt;td&gt;PascalCase&lt;/td&gt;
&lt;td&gt;클래스, 구조체, 열거형 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;변수/함수명&lt;/td&gt;
&lt;td&gt;camelCase&lt;/td&gt;
&lt;td&gt;소문자로 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상수/매크로&lt;/td&gt;
&lt;td&gt;SCREAMING_SNAKE_CASE&lt;/td&gt;
&lt;td&gt;대문자와 _ 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 일반적인 규칙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명확한 이름 사용으로 가독성을 높여야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적을 설명하거나, 대상의 의도를 설명하는 이름을 사용합니다.&lt;/li&gt;
&lt;li&gt;타인이 모를 수 있는 약어 사용을 지양합니다.&lt;/li&gt;
&lt;li&gt;이름이 나타내는 뜻은 쓰이는 범위에 비례해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;my-callout tip&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;약어 처리 팁&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼합형(카멜, 파스칼 케이스)에서 약어는 하나의 단어로 간주하여 단일 대문자로 표기하는 것을 권장합니다. (예: StartRPC 보다는 &lt;b&gt;StartRpc&lt;/b&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 세부 규칙&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파일명&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일명은 모두 소문자로 작성합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_&lt;/code&gt; 혹은 &lt;code&gt;-&lt;/code&gt;를 포함할 수 있습니다.&lt;/li&gt;
&lt;li&gt;일관된 로컬 규정이 없다면 &lt;code&gt;_&lt;/code&gt; 사용이 권장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;타입명 (Class, Struct 등)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단어의 첫 글자는 대문자로 작성합니다. (PascalCase)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_&lt;/code&gt;를 사용하지 않습니다.&lt;/li&gt;
&lt;li&gt;클래스 이름은 &lt;b&gt;명사&lt;/b&gt;로 지정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;변수명&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수 이름에는 &lt;code&gt;_&lt;/code&gt;를 제외한 특수 기호를 사용하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메서드/함수명&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 메서드 및 함수명은 &lt;b&gt;동사&lt;/b&gt;로 시작합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Engineering Principles/Convention</category>
      <category>naming</category>
      <category>네이밍</category>
      <category>네이밍컨벤션</category>
      <category>명명규칙</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/15</guid>
      <comments>https://konsla99.tistory.com/15#entry15comment</comments>
      <pubDate>Sun, 5 Apr 2026 22:36:55 +0900</pubDate>
    </item>
    <item>
      <title>안건 기반 Git 커밋 및 버전 관리 가이드</title>
      <link>https://konsla99.tistory.com/14</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  버전 기반 이슈 관리 체계&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxXgcb/dJMb99ZYg50/XWf9m67Yme93hvhKNq7sPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxXgcb/dJMb99ZYg50/XWf9m67Yme93hvhKNq7sPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxXgcb/dJMb99ZYg50/XWf9m67Yme93hvhKNq7sPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxXgcb%2FdJMb99ZYg50%2FXWf9m67Yme93hvhKNq7sPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[작성 예시]&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;[Fix][내부 모터 구동 로직 수정건]

IssueNum:

- AB-123 (Main Issue): 모터 구동 시 발생하는 간헐적 타임아웃 오류 해결

feat: 모니터링 상태 플래그(MTR_STAT) 전이 로직 변경
chore: Main.c 내 노후화된 디버깅 주석 및 미사용 매크로 제거
refactor: 제어 모듈 내 모터 관련 전역 변수 명명 규칙 통일

Body:
- motorRun.c: 탈조 방지를 위한 플래그 판정 조건식 수정 (if문 경계값 최적화)
- Main.c: 불필요한 초기화 구문 정리 및 가독성 확보를 위한 코드 블록 재구성
하드웨어 인터럽트 서비스 루틴(ISR) 내 플래그 업데이트 우선순위 조정

Footer:
- Related: AB-011 (인코더 피드백 관련), AB-012 (드라이버 통신 프로토콜)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  관리 방식 분석: 버전별 브랜치 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 유용한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장비/솔루션 배포:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;-  하드웨어 장비나 특정 솔루션이 버전별로 고객사에 납품되어 **병렬 유지보수**가 필요한 경우.  &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;임베디드/펌웨어:&lt;/b&gt;&lt;br /&gt;- 특정 버전의 바이너리가 필드에서 동작 중이며, 해당 버전에 대한 &lt;b&gt;Hotfix&lt;/b&gt; 대응이 잦은 환경.&lt;br /&gt;- &lt;i&gt;이력 추적 중시:*&lt;/i&gt;&lt;br /&gt;- 특정 기능이 어느 버전에 처음 포함되었고, 어떤 이슈와 연관되었는지 직관적으로 파악해야 할 때.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 장점 및 단점&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;- &lt;b&gt;명확한 격리:&lt;/b&gt; 특정 버전의 버그 수정이 다른 버전의 안정성에 영향을 주지 않음. - &lt;b&gt;이력 관리:&lt;/b&gt; 이슈 번호(IssueNum)와 연동되어 사후 추적(Traceability)이 매우 용이함. - &lt;b&gt;커뮤니케이션:&lt;/b&gt; 기획/QA 팀과 &quot;v2.5에 반영됨&quot;과 같이 명확한 소통 가능.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;- &lt;b&gt;관리 오버헤드:&lt;/b&gt; 브랜치가 많아질수록 관리 포인트가 늘어남. - &lt;b&gt;코드 동기화:&lt;/b&gt; 공통 버그 수정 시 여러 버전 브랜치에 각각 반영(Cherry-pick)해야 하는 번거로움 발생.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  추가 개선 방안&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 시스템을 유지하면서도 효율을 높일 수 있는 몇 가지 제언입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 커밋 메시지 자동화 (Git Hooks)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;검증:&lt;/b&gt; 커밋 시 &lt;code&gt;IssueNum&lt;/code&gt; 형식이 맞는지, &lt;code&gt;Body&lt;/code&gt;가 비어있지는 않은지 자동으로 체크하는 스크립트를 적용하여 데이터의 품질을 유지할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연동:&lt;/b&gt; Jira나 Redmine 같은 툴을 사용 중이라면, 커밋 시 자동으로 해당 티켓의 상태를 '진행 중'에서 '해결'로 변경하도록 웹훅(Webhook) 설정을 추천합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 버전 요약(Release Notes) 자동 생성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재와 같이 구조화된 텍스트를 유지하면, 스크립트를 통해 해당 버전 브랜치의 모든 커밋을 취합하여 고객사 전달용 &lt;b&gt;릴리즈 노트(Release Notes)&lt;/b&gt; 를 자동으로 생성하기 매우 유리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. ChangeLog 파일 운영&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브랜치 내부에 &lt;code&gt;CHANGELOG.md&lt;/code&gt; 파일을 두고, 각 버전 브랜치에서 발생한 핵심 변경 사항(IssueNum 포함)을 누적 기록하면 전체 개발 팀원이 변경 이력을 한눈에 파악하기 좋습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TOOLS/Git &amp;amp; GitHub</category>
      <category>git전략</category>
      <category>개발프로세스</category>
      <category>버전관리</category>
      <category>이슈트래킹</category>
      <category>임베디드개발</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/14</guid>
      <comments>https://konsla99.tistory.com/14#entry14comment</comments>
      <pubDate>Sun, 15 Mar 2026 22:58:29 +0900</pubDate>
    </item>
    <item>
      <title>카메라 캘리브레이션 - 왜곡 제거</title>
      <link>https://konsla99.tistory.com/13</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;카메라 왜곡 제거&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmtLNV/dJMcajnSEGY/317nbZmDi6bdifrDNR6vSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmtLNV/dJMcajnSEGY/317nbZmDi6bdifrDNR6vSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmtLNV/dJMcajnSEGY/317nbZmDi6bdifrDNR6vSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmtLNV%2FdJMcajnSEGY%2F317nbZmDi6bdifrDNR6vSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;572&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜곡 제거 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캘리브레이션으로 왜곡 계수를 구한 후 다음 함수들로 왜곡을 보정할 수 있다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;cv::undistort()&lt;/code&gt; - 올인원 함수&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cv::initUndistortRectifyMap() + cv::remap()&lt;/code&gt; - 2단계 방식&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cv::undistortPoints()&lt;/code&gt; - 특정 점만 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;my-callout info&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;왜곡 제거 지도 (Undistortion Map)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;h5&gt;개념&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜곡 제거 지도는 출력 이미지의 각 픽셀이 입력 이미지의 어느 좌표를 참조할지 저장한 매핑 테이블이다.&lt;/p&gt;
&lt;h5&gt;왜 역방향 매핑인가?&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 이미지를 직접 변환하면 픽셀이 분산되어 출력 이미지에 구멍이 생긴다. 따라서 출력 이미지의 각 픽셀 위치에서 입력 이미지의 참조 위치를 찾는 역방향 매핑이 필요하다.&lt;/p&gt;
&lt;h5&gt;계산 과정&lt;/h5&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;픽셀 &amp;rarr; 이미지 평면:&lt;/b&gt; 출력 픽셀 좌표를 카메라 내부 파라미터 역행렬($K^{-1}$)로 정규화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;왜곡 적용:&lt;/b&gt; 정규화된 좌표에 왜곡 계수를 적용하여 왜곡된 정규화 좌표 계산&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지 평면 &amp;rarr; 픽셀:&lt;/b&gt; 왜곡된 정규화 좌표를 카메라 내부 파라미터($K$)로 픽셀 좌표 변환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매핑 저장:&lt;/b&gt; 출력 좌표와 입력 좌표의 대응 관계를 mapX, mapY에 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;함수별 특징&lt;/h4&gt;
&lt;h5&gt;cv::initUndistortRectifyMap()&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜곡 제거 지도(mapX, mapY)를 계산한다. 실제 왜곡 제거는 수행하지 않고 매핑 테이블만 생성한다.&lt;/p&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;cv::Mat mapX, mapY;
cv::initUndistortRectifyMap(
    cameraMatrix, distCoeffs, cv::Mat(), 
    cameraMatrix, imageSize, CV_32FC1, mapX, mapY
);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;cv::remap()&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 왜곡 제거 지도를 사용하여 실제로 이미지 왜곡을 제거한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;cv::Mat undistorted;
cv::remap(distorted, undistorted, mapX, mapY, cv::INTER_LINEAR);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;cv::undistort()&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜곡 제거 지도 계산과 적용을 한 번에 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 시기:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 1~2장 처리 시 (간편함)&lt;/li&gt;
&lt;li&gt;각 이미지의 카메라 파라미터가 다를 때 (매핑 재사용 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;cv::Mat undistorted;
cv::undistort(distorted, undistorted, cameraMatrix, distCoeffs);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;cv::undistortPoints()&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 이미지가 아닌 특정 점들만 왜곡 제거한다. Feature 기반 알고리즘에서 효율적이다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;std::vector&amp;lt;cv::Point2f&amp;gt; distorted_pts = {{320, 240}, {450, 180}};
std::vector&amp;lt;cv::Point2f&amp;gt; undistorted_pts;
cv::undistortPoints(distorted_pts, undistorted_pts, cameraMatrix, distCoeffs);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;cv::convertMaps()&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜곡 제거 지도의 데이터 타입이나 포맷을 변환한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용 가이드&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;추천 방법&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;같은 카메라, 여러 이미지&lt;/td&gt;
&lt;td&gt;initUndistortRectifyMap + remap&lt;/td&gt;
&lt;td&gt;매핑 재사용으로 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이미지 1~2장&lt;/td&gt;
&lt;td&gt;undistort&lt;/td&gt;
&lt;td&gt;코드 간단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;카메라마다 다른 파라미터&lt;/td&gt;
&lt;td&gt;undistort&lt;/td&gt;
&lt;td&gt;매핑 재사용 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실시간 비디오&lt;/td&gt;
&lt;td&gt;initUndistortRectifyMap + remap&lt;/td&gt;
&lt;td&gt;최고 성능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특징점만 처리&lt;/td&gt;
&lt;td&gt;undistortPoints&lt;/td&gt;
&lt;td&gt;필요한 점만 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제&lt;/h4&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// 방법 1: 간단한 왜곡 제거
cv::Mat img = cv::imread(&quot;distorted.jpg&quot;);
cv::Mat undist;
cv::undistort(img, undist, K, dist);

// 방법 2: 비디오 처리 (효율적)
cv::Mat mapX, mapY;
cv::initUndistortRectifyMap(K, dist, cv::Mat(), K, size, CV_32FC1, mapX, mapY);

cv::VideoCapture cap(0);
cv::Mat frame, undist;
while (cap.read(frame)) {
    cv::remap(frame, undist, mapX, mapY, cv::INTER_LINEAR);
    cv::imshow(&quot;Undistorted&quot;, undist);
}

// 방법 3: 특징점만 처리
std::vector&amp;lt;cv::Point2f&amp;gt; corners;
cv::findChessboardCorners(img, patternSize, corners);
std::vector&amp;lt;cv::Point2f&amp;gt; corners_undist;
cv::undistortPoints(corners, corners_undist, K, dist, cv::noArray(), K);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Vision/캘리브레이션</category>
      <category>Camera Calibration</category>
      <category>Computer Vision</category>
      <category>OpenCV</category>
      <category>Undistortion</category>
      <category>왜곡 보정</category>
      <category>카메라 캘리브레이션</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/13</guid>
      <comments>https://konsla99.tistory.com/13#entry13comment</comments>
      <pubDate>Sun, 15 Mar 2026 22:16:03 +0900</pubDate>
    </item>
    <item>
      <title>자소서 첨삭용 Tool 제작</title>
      <link>https://konsla99.tistory.com/12</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;903&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHmWs1/dJMcagEvuCL/I20pwhZeQf7jSBVINU4iik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHmWs1/dJMcagEvuCL/I20pwhZeQf7jSBVINU4iik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHmWs1/dJMcagEvuCL/I20pwhZeQf7jSBVINU4iik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHmWs1%2FdJMcagEvuCL%2FI20pwhZeQf7jSBVINU4iik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1297&quot; height=&quot;903&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;903&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;취업 준비, 이제 AI와 함께 하세요: Gemini Career Assistant 1.0&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AI 기반 자소서 첨삭 및 취업 준비의 모든 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수많은 채용 공고, 막막한 자기소개서 작성, 까다로운 면접 준비... 취업 준비의 어려움, 이제 혼자 끙끙 앓지 마세요. 제가 취업 준비 시절 직접 Gemini CLI를 활용하며 겪었던 경험을 바탕으로, 이 모든 과정을 도와줄 강력한 GUI 툴, &lt;b&gt;Gemini Career Assistant&lt;/b&gt;를 만들었습니다.&lt;/p&gt;
&lt;div class=&quot;my-callout info&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;Gemini Career Assistant란?&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 명령어 없이, 몇 번의 클릭만으로 Gemini AI의 강력한 언어 모델을 활용해 채용 공고 분석부터 면접 질문 생성까지, 취업 준비의 전 과정을 효율적으로 도와주는 Windows용 데스크톱 애플리케이션입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1X8Z-yNBIppV9s25KnIuLjY-occZ3DI_Q/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://drive.google.com/file/d/1X8Z-yNBIppV9s25KnIuLjY-occZ3DI_Q/view?usp=sharing&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771751381378&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Resume_Gem Setup 1.0.0.zip&quot; data-og-description=&quot;&quot; data-og-host=&quot;drive.google.com&quot; data-og-source-url=&quot;https://drive.google.com/file/d/1X8Z-yNBIppV9s25KnIuLjY-occZ3DI_Q/view?usp=sharing&quot; data-og-url=&quot;https://drive.google.com/file/d/1X8Z-yNBIppV9s25KnIuLjY-occZ3DI_Q/view?usp=sharing&amp;amp;usp=embed_facebook&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1X8Z-yNBIppV9s25KnIuLjY-occZ3DI_Q/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://drive.google.com/file/d/1X8Z-yNBIppV9s25KnIuLjY-occZ3DI_Q/view?usp=sharing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Resume_Gem Setup 1.0.0.zip&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;drive.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ 핵심 기능 상세 안내&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gemini Career Assistant는 취업 준비에 필요한 5가지 핵심 기능을 제공하여, 여러분의 소중한 시간과 노력을 아껴드립니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 채용 공고(JD) 분석&lt;/h4&gt;
&lt;div class=&quot;my-callout note&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;이 기능은 무엇인가요?&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석하고 싶은 채용 공고(JD) 파일을 첨부하면, AI가 해당 직무에 필요한 핵심 역량, 주요 업무, 자격 요건 등을 일목요연하게 분석하고 정리해 줍니다. 어떤 점을 강조해서 자소서를 써야 할지 방향을 잡을 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 문항별 자소서 초안 작성&lt;/h4&gt;
&lt;div class=&quot;my-callout note&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;이 기능은 무엇인가요?&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기소개서 문항과 함께, 자신의 경험과 경력이 정리된 파일을 첨부해 보세요. AI가 두 내용을 종합하여 문항의 의도에 맞는 자기소개서 초안을 순식간에 작성해 드립니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;my-callout tip&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;활용 팁!&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상세하고 구체적인 경험/경력 기술서를 첨부할수록, 훨씬 더 완성도 높고 설득력 있는 초안이 생성됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 자소서 피드백&lt;/h4&gt;
&lt;div class=&quot;my-callout note&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;이 기능은 무엇인가요?&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 작성된 자기소개서가 있다면, AI에게 피드백을 요청할 수 있습니다. 문맥의 자연스러움, 오탈자, 그리고 어떤 점을 개선하면 좋을지에 대한 구체적인 제안을 받아보세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. AI 표현 다듬기&lt;/h4&gt;
&lt;div class=&quot;my-callout note&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;이 기능은 무엇인가요?&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 문장을 좀 더 전문적으로 바꾸고 싶은데...&quot;라고 생각될 때 사용하는 기능입니다. 다듬고 싶은 문장을 입력하면, AI가 더 세련되고 프로페셔널한 표현으로 바꿔드립니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 자소서 기반 면접 질문 도출&lt;/h4&gt;
&lt;div class=&quot;my-callout note&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;이 기능은 무엇인가요?&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 제출할 자기소개서를 기반으로, 면접관이 할 법한 예상 질문 리스트를 생성합니다. 꼬리 질문까지 예측하여 면접을 완벽하게 대비할 수 있도록 돕습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 시작 전 필수 확인 사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 툴은 여러분의 PC에 설치된 &lt;code&gt;gemini-cli&lt;/code&gt;를 GUI로 제어하는 방식으로 작동합니다. 따라서 아래의 준비가 반드시 필요합니다.&lt;/p&gt;
&lt;div class=&quot;my-callout warning&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;중요: gemini-cli 설치 필수!&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OS&lt;/b&gt;: Windows 환경에서만 사용 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Gemini-CLI&lt;/b&gt;: PowerShell에서 &lt;code&gt;gemini-cli&lt;/code&gt; 명령어가 실행 가능한 상태여야 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설치 명령어: &lt;code&gt;npm install -g @google/gemini-cli&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인증&lt;/b&gt;: &lt;code&gt;gemini-cli&lt;/code&gt;는 구글 계정 로그인으로 무료 인증이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;my-callout tip&quot;&gt;
&lt;div class=&quot;my-callout-title&quot;&gt;&lt;span class=&quot;my-callout-icon&quot;&gt;&lt;/span&gt; &lt;span&gt;알아두면 좋은 팁&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;my-callout-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;파일 경로&lt;/b&gt;: 현재 버전에서는 분석할 파일(JD, 자소서 등)이 지정된 워크스페이스 폴더 내에 위치해야 합니다. (추후 상대/절대 경로 지원 예정)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과 저장&lt;/b&gt;: '결과 저장' 기능을 사용하면, AI의 답변이 마크다운(&lt;code&gt;.md&lt;/code&gt;) 파일로 저장됩니다. Notion이나 Obsidian 등에서 열어보면 깔끔하게 정리된 내용을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;직접 명령&lt;/b&gt;: 이 툴은 CLI를 버튼화한 것입니다. 때로는 터미널에서 &quot;방금 내용을 파일로 저장해줘&quot;와 같이 직접 명령을 내리는 것이 더 빠르고 정확할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PLAYGROUND</category>
      <category>ai</category>
      <category>자소서</category>
      <category>첨삭</category>
      <category>취준</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/12</guid>
      <comments>https://konsla99.tistory.com/12#entry12comment</comments>
      <pubDate>Sun, 22 Feb 2026 02:09:42 +0900</pubDate>
    </item>
    <item>
      <title>Git 커밋 컨벤션</title>
      <link>https://konsla99.tistory.com/11</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git 커밋 컨벤션: 효율적인 협업을 위한 메시지 작성 가이드&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RO4Ya/dJMcacbimfU/3w6JAn4OYnpJToOgZKEhp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RO4Ya/dJMcacbimfU/3w6JAn4OYnpJToOgZKEhp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RO4Ya/dJMcacbimfU/3w6JAn4OYnpJToOgZKEhp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRO4Ya%2FdJMcacbimfU%2F3w6JAn4OYnpJToOgZKEhp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;559&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 개요: 커밋 메시지가 왜 중요한가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git을 이용한 버전 관리에서 커밋 메시지는 단순히 '기록'을 남기는 것을 넘어, &lt;b&gt;프로젝트의 역사 그 자체&lt;/b&gt;이자 &lt;b&gt;협업의 핵심 도구&lt;/b&gt;입니다. 잘 작성된 커밋 메시지는 다음과 같은 역할을 수행합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가독성 향상:&lt;/b&gt; 변경 이력을 빠르게 파악하여, 코드 리뷰 및 유지보수를 용이하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추적성 보장:&lt;/b&gt; 특정 이슈 또는 버그가 언제, 왜 수정되었는지 쉽게 찾아낼 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동화 연동:&lt;/b&gt; 릴리스 노트 자동 생성 등 CI/CD 파이프라인과 연동하여 작업 효율을 높입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 가이드에서는 보편적으로 사용되는 커밋 컨벤션의 필요성, 구조를 설명하고, 실제 현업에서 사용 가능한 스타일 예시를 제시합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 필요성: 표준화의 이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통일된 Git 커밋 컨벤션은 다음과 같은 명확한 이점을 제공합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;신속한 이해:&lt;/b&gt; &lt;code&gt;git log&lt;/code&gt;를 열었을 때, 메시지만으로 해당 커밋이 '기능 추가'인지 '버그 수정'인지 즉시 알 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쉬운 검색:&lt;/b&gt; &lt;code&gt;fix&lt;/code&gt; 태그가 붙은 커밋만 필터링하여 버그 수정 이력을 추적하거나, 특정 티켓 번호로 작업을 검색하는 것이 간편해집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;책임 소재 명확화:&lt;/b&gt; 커밋 메시지 본문(Body)에 상세 내용을 명시함으로써 변경 사항의 이유와 범위를 명확히 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 일반적인 Git 커밋 스타일 (General Convention)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 표준 Git 커밋 컨벤션은 &lt;b&gt;헤더(Header), 본문(Body), 꼬리말(Footer)&lt;/b&gt; 의 3단계 구조를 따릅니다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성 요소&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;권장 규칙&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Header (첫 줄)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;변경의 유형과 요약&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;type&amp;gt;: &amp;lt;subject&amp;gt;&lt;/code&gt; 형식, 50자 이내, 명령조 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Body (본문)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;변경의 이유와 상세 내용&lt;/td&gt;
&lt;td&gt;헤더와 한 줄 공백, 72자 줄 바꿈, &lt;b&gt;무엇을&lt;/b&gt;보다 &lt;b&gt;왜&lt;/b&gt;를 설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Footer (꼬리말)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이슈 추적 및 Breaking Change&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Fixes: #123&lt;/code&gt;, &lt;code&gt;Closes: JIRA-ABC&lt;/code&gt;, &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; 명시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1. 일반적인 Type(유형) 예시:&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;새로운 기능 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;버그 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;문서 변경 (주석, README 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;코드 포맷팅, 세미콜론 등 (로직 변경 없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refactor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;코드 리팩토링 (기능 변경 없이 내부 구조 개선)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;테스트 코드 추가/수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;빌드, 패키지 관리 등 일반적인 유지보수 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 커밋 스타일 예시: Jira 연동 및 상세 내용 명시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효율적인 이슈 추적과 명확한 기록을 위해 다음과 같은 &lt;b&gt;간결하면서도 필수 정보를 모두 담는&lt;/b&gt; 스타일을 채택하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 &lt;b&gt;헤더에 요약 태그(JIRA)를 포함&lt;/b&gt;하고, &lt;b&gt;본문에서 세부 내용을 명확한 목록&lt;/b&gt;으로 제시하는 것이 특징입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.1. 커밋 구조&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성 요소&lt;/th&gt;
&lt;th&gt;형식&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Header (첫 줄)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[유형] : 요약 설명 [JIRA-티켓]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;유형&lt;/b&gt;으로 변경 성격을 나타내고, &lt;b&gt;JIRA 티켓 번호&lt;/b&gt;로 추적성을 확보합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Body (본문)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;body:&lt;/code&gt; 시작 후 목록&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;code&gt;body:&lt;/code&gt;&lt;/b&gt; 키워드를 명시하고, 변경된 세부 사항을 목록으로 제시합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.2. 헤더 구성 상세&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;유형 (Type):&lt;/b&gt; 일반적인 컨벤션의 유형(&lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;feat&lt;/code&gt; 등)을 사용합니다. &lt;b&gt;반드시 콜론(&lt;code&gt;:&lt;/code&gt;)과 한 칸 공백&lt;/b&gt;으로 요약 설명과 분리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JIRA-티켓:&lt;/b&gt; 관련된 JIRA 티켓 번호(&lt;code&gt;OO1-123&lt;/code&gt;, &lt;code&gt;ABC-456&lt;/code&gt;)를 요약 설명 뒤에 배치하여 &lt;b&gt;이슈와의 연결성&lt;/b&gt;을 강조합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.3. 본문 구성 상세&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;본문은 반드시 &lt;b&gt;&lt;code&gt;body:&lt;/code&gt;&lt;/b&gt; 키워드로 시작하여 본문 영역임을 명시합니다.&lt;/li&gt;
&lt;li&gt;세부 내용은 **하이픈(&lt;code&gt;-&lt;/code&gt;)**을 사용하여 목록(List) 형태로 작성합니다. 이는 가독성을 극대화하기 위함입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;무엇을&quot;&lt;/b&gt; 변경했는지뿐만 아니라, &lt;b&gt;&quot;왜&quot;&lt;/b&gt; 변경했는지(발생한 문제의 원인)를 명확히 기술해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4.4. 커밋 메시지 예시 (실제 적용 사례)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 제가 사용하는 스타일의 구체적인 예시는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;fix : 동작안하는 문제 수정 OO1-123

body:
- 전원 킬 때 초기화 함수 호출 순서 오류를 확인
- `config.json` 로드 전에 시스템 초기화가 시작되어 `Null Pointer Exception` 발생
- 전원 킬 때 `loadConfig()` 함수가 `initializeSystem()` 보다 먼저 실행되도록 순서 변경하여 문제 해결
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;feat : 사용자 대시보드 위젯 추가 ABC-456

body:
- 로그인한 사용자에게만 보이는 &quot;최근 활동&quot; 위젯 추가
- 컴포넌트명은 `RecentActivityWidget`으로 정의
- `UserActivityAPI`에서 데이터를 가져오며, 로딩 상태를 스켈레톤 UI로 처리
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>TOOLS/Git &amp;amp; GitHub</category>
      <category>git</category>
      <category>Git연동</category>
      <category>git헤더</category>
      <category>깃 헤더</category>
      <category>커밋</category>
      <category>커밋컨벤션</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/11</guid>
      <comments>https://konsla99.tistory.com/11#entry11comment</comments>
      <pubDate>Sun, 26 Oct 2025 17:47:24 +0900</pubDate>
    </item>
    <item>
      <title>옵시디언 - 티스토리 마이그레이션 방법</title>
      <link>https://konsla99.tistory.com/10</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Efntv/dJMcabpWPkf/5kKQLAO7nUnZGPv6unnT3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Efntv/dJMcabpWPkf/5kKQLAO7nUnZGPv6unnT3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Efntv/dJMcabpWPkf/5kKQLAO7nUnZGPv6unnT3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEfntv%2FdJMcabpWPkf%2F5kKQLAO7nUnZGPv6unnT3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;572&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵시디언의 티스토리 플러그인이 막혔기 때문에&lt;br /&gt;정확히는 API가 더이상 지원하지 않기 떄문에 여러 방법을 탐구했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마크다운 모드로 작성을 지원하지만 옵시디언의 콜아웃과 같은 기능은 미구현&lt;/li&gt;
&lt;li&gt;때문에 HTML로 변환하는 방법을 사용한다.&lt;/li&gt;
&lt;li&gt;옵시디언 내부 HTML변환 플러그인들은 추천하지 않는다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용해 보았을때 하나씩 부족했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단! 콜아웃 등은 CSS에 추가가 필요하다.&lt;/li&gt;
&lt;li&gt;AI를 활용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선 AI를 준비한다.&lt;/li&gt;
&lt;li&gt;로컬에 있는 옵시디언 노트를 변환하므로 CLI를 사용하는것이 편하다.&lt;/li&gt;
&lt;li&gt;다음 프롬프트와 함꼐 파일을 첨부한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;# 역할
너는 옵시디언 마크다운을 티스토리 HTML로 변환하는 전문 변환기이다.

# 지시문
내가 제공하는 [옵시디언 마크다운]을 아래 [변환 규칙]에 따라 [티스토리용 HTML]로 변환해라.

# 변환 규칙
1.  **콜아웃 구조**: 마크다운 콜아웃 `[!type]` 구문은 토글 기능을 가진 `&amp;lt;div&amp;gt;` 구조로 변환한다.
    -   `[!type]` &amp;rarr; `&amp;lt;div class=&quot;my-callout type&quot;&amp;gt;`
    -   `제목` &amp;rarr; `&amp;lt;div class=&quot;my-callout-title&quot;&amp;gt;`
    -   `내용` &amp;rarr; `&amp;lt;div class=&quot;my-callout-content&quot;&amp;gt;`
    -   **예시**: `[!info] 정보`는 `&amp;lt;div class=&quot;my-callout info&quot;&amp;gt;&amp;lt;div class=&quot;my-callout-title&quot;&amp;gt;...&amp;lt;/div&amp;gt;...&amp;lt;/div&amp;gt;`가 된다.

2.  **아이콘 처리**: 콜아웃 제목(`my-callout-title`) 안에는 이모지 대신 아이콘을 위한 빈 `&amp;lt;span&amp;gt;` 태그만 삽입한다.
    -   `&amp;lt;div class=&quot;my-callout-title&quot;&amp;gt;&amp;lt;span class=&quot;my-callout-icon&quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;콜아웃 제목&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;`

3.  **이미지 처리**: 마크다운 이미지 `![[파일명.png]]` 구문은 `&amp;lt;p&amp;gt;[이미지: 파일명.png]&amp;lt;/p&amp;gt;` 형식의 안내 문구로 대체한다.

4.  **기타 요소**: 나머지 마크다운(문단, 목록, 테이블 등)은 표준 HTML 태그로 변환한다.

5.  **출력 형식**: 다른 설명 없이, 변환된 HTML 코드 블록만 출력한다.

---
[옵시디언 마크다운]
(여기에 옵시디언 마크다운 내용을 붙여넣으세요)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 태그 &lt;code&gt;[이미지: 파일명]&lt;/code&gt; 에 해당하는 사진을 티스토리에서 첨부한다.&lt;/p&gt;</description>
      <category>TOOLS/마크다운&amp;lt;옵시디언&amp;gt;</category>
      <category>AI활용</category>
      <category>HTML변환</category>
      <category>마크다운변환</category>
      <category>블로그이사</category>
      <category>옵시디언티스토리</category>
      <category>콜아웃</category>
      <category>티스토리플러그인대체</category>
      <author>Konsla99</author>
      <guid isPermaLink="true">https://konsla99.tistory.com/10</guid>
      <comments>https://konsla99.tistory.com/10#entry10comment</comments>
      <pubDate>Sat, 25 Oct 2025 01:34:10 +0900</pubDate>
    </item>
  </channel>
</rss>