<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pyinstaller 보관 - 하우인포-IT·테크</title>
	<atom:link href="https://howinfo.kr/tag/pyinstaller/feed/" rel="self" type="application/rss+xml" />
	<link>https://howinfo.kr/tag/pyinstaller/</link>
	<description>IT·AI 자동화 &#38; 인프라 전문 블로그 (하우인포)</description>
	<lastBuildDate>Sat, 28 Feb 2026 00:28:24 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://howinfo.kr/wp-content/uploads/2026/02/cropped-ChatGPT-Image-2026년-2월-12일-오후-05_39_40-32x32.png</url>
	<title>Pyinstaller 보관 - 하우인포-IT·테크</title>
	<link>https://howinfo.kr/tag/pyinstaller/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>파이썬 프로그램을 윈도우 EXE로 만드는 방법 (PyInstaller 실전 가이드)</title>
		<link>https://howinfo.kr/%ed%8c%8c%ec%9d%b4%ec%8d%ac-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8%ec%9d%84-%ec%9c%88%eb%8f%84%ec%9a%b0-exe%eb%a1%9c-%eb%a7%8c%eb%93%9c%eb%8a%94-%eb%b0%a9%eb%b2%95-pyinstaller-%ec%8b%a4%ec%a0%84/</link>
					<comments>https://howinfo.kr/%ed%8c%8c%ec%9d%b4%ec%8d%ac-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8%ec%9d%84-%ec%9c%88%eb%8f%84%ec%9a%b0-exe%eb%a1%9c-%eb%a7%8c%eb%93%9c%eb%8a%94-%eb%b0%a9%eb%b2%95-pyinstaller-%ec%8b%a4%ec%a0%84/#respond</comments>
		
		<dc:creator><![CDATA[hong]]></dc:creator>
		<pubDate>Sat, 28 Feb 2026 00:28:23 +0000</pubDate>
				<category><![CDATA[IT기초]]></category>
		<category><![CDATA[exe배포]]></category>
		<category><![CDATA[Pyinstaller]]></category>
		<category><![CDATA[tkinter]]></category>
		<category><![CDATA[개발팁]]></category>
		<category><![CDATA[배포자동화]]></category>
		<category><![CDATA[빌드]]></category>
		<category><![CDATA[윈도우exe]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬패키징]]></category>
		<category><![CDATA[프로그램 배포]]></category>
		<guid isPermaLink="false">https://howinfo.kr/?p=2108</guid>

					<description><![CDATA[<p>파이썬으로 만든 스크립트가 잘 돌아가도, 주변 사람에게 공유하려면 항상 이런 문제가 생깁니다. 그래서 결국 많이 선택하는 방법이 EXE로 패키징하는 겁니다.이번...</p>
<p>게시물 <a href="https://howinfo.kr/%ed%8c%8c%ec%9d%b4%ec%8d%ac-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8%ec%9d%84-%ec%9c%88%eb%8f%84%ec%9a%b0-exe%eb%a1%9c-%eb%a7%8c%eb%93%9c%eb%8a%94-%eb%b0%a9%eb%b2%95-pyinstaller-%ec%8b%a4%ec%a0%84/">파이썬 프로그램을 윈도우 EXE로 만드는 방법 (PyInstaller 실전 가이드)</a>이 <a href="https://howinfo.kr">하우인포-IT·테크</a>에 처음 등장했습니다.</p>
]]></description>
										<content:encoded><![CDATA[
<p>파이썬으로 만든 스크립트가 잘 돌아가도, 주변 사람에게 공유하려면 항상 이런 문제가 생깁니다.</p>



<ul class="wp-block-list">
<li>“파이썬 설치해야 해?”</li>



<li>“pip로 뭐 설치해야 해?”</li>



<li>“실행했더니 검은 창만 뜨고 꺼지는데?”</li>
</ul>



<p>그래서 결국 많이 선택하는 방법이 <strong>EXE로 패키징</strong>하는 겁니다.<br>이번 글은 제가 실제로 가장 많이 쓰는 도구인 <strong>PyInstaller</strong> 기준으로, “초보도 따라 할 수 있게” 정리했습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1) EXE 만들기 전에 꼭 알아야 할 것</h2>



<h3 class="wp-block-heading">✅ EXE로 만들면 좋은 점</h3>



<ul class="wp-block-list">
<li>파이썬이 설치되지 않은 PC에서도 실행 가능(대부분의 경우)</li>



<li>배포/공유가 편해짐</li>



<li>파일 1개(또는 폴더 1개)로 정리 가능</li>
</ul>



<h3 class="wp-block-heading">⚠️ 현실적으로 생기는 문제</h3>



<ul class="wp-block-list">
<li>용량이 커짐(수십~수백 MB도 흔함)</li>



<li>백신 오탐(특히 새로 만든 exe)</li>



<li>경로 문제(파일 저장/설정 파일 위치)</li>



<li>GUI(Tkinter 등)에서는 괜찮은데, 콘솔 출력은 안 보이기도 함</li>
</ul>



<p>이걸 미리 알고 가면 삽질이 크게 줄어요.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2) 준비물: 파이썬/폴더 구조 추천</h2>



<h3 class="wp-block-heading">권장 폴더 구조 예시</h3>



<pre class="wp-block-preformatted">my_app/<br>  main.py<br>  core/<br>  assets/<br>  data/<br>  requirements.txt</pre>



<ul class="wp-block-list">
<li><strong>assets/</strong> : 이미지, 아이콘 등 리소스</li>



<li><strong>data/</strong> : 설정 파일, 저장 파일(앱 실행 중 생성되는 데이터)</li>



<li><strong>requirements.txt</strong> : 의존성 목록</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3) PyInstaller 설치</h2>



<p>가장 먼저 <strong>가상환경</strong>을 추천합니다. (빌드가 깔끔해져요)</p>



<h3 class="wp-block-heading">(선택) 가상환경 만들기</h3>



<pre class="wp-block-preformatted">cd my_app<br>python -m venv .venv<br>.venv\Scripts\activate</pre>



<h3 class="wp-block-heading">PyInstaller 설치</h3>



<pre class="wp-block-preformatted">python -m pip install --upgrade pip<br>pip install pyinstaller</pre>



<p>설치 확인:</p>



<pre class="wp-block-preformatted">pyinstaller --version</pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4) 가장 기본 빌드: onefile로 EXE 만들기</h2>



<h3 class="wp-block-heading">콘솔 프로그램(터미널 창 필요)</h3>



<pre class="wp-block-preformatted">pyinstaller --onefile main.py</pre>



<h3 class="wp-block-heading">GUI 프로그램(창만 띄우고 콘솔 숨김)</h3>



<pre class="wp-block-preformatted">pyinstaller --onefile --noconsole main.py</pre>



<p>빌드가 끝나면 보통 아래 폴더가 생깁니다.</p>



<ul class="wp-block-list">
<li><code>dist/</code> : 실제 배포 파일(exe)</li>



<li><code>build/</code> : 빌드 캐시</li>



<li><code>main.spec</code> : 빌드 설정 파일</li>
</ul>



<p>결과 EXE는 <code>dist/main.exe</code> 에서 확인합니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5) 아이콘 넣기(윈도우 exe 느낌 살리기)</h2>



<p>아이콘은 <code>.ico</code> 파일이 필요합니다. (png 그대로는 안됨)</p>



<pre class="wp-block-preformatted">pyinstaller --onefile --noconsole --icon=assets/app.ico main.py</pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">6) 이미지/설정파일 등 “외부 파일” 포함하기</h2>



<p>여기서 많이 막힙니다.<br>파이썬에서는 상대경로로 잘 읽히는데, exe로 묶이면 경로가 달라져요.</p>



<h3 class="wp-block-heading">6-1) 빌드 옵션으로 파일 포함</h3>



<p>예: <code>assets/</code> 폴더를 함께 포함</p>



<pre class="wp-block-preformatted">pyinstaller --onefile --noconsole ^<br>  --add-data "assets;assets" ^<br>  main.py</pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>윈도우에서 <code>--add-data "원본;대상"</code> 형태로 세미콜론(<code>;</code>)을 사용합니다.</p>
</blockquote>



<h3 class="wp-block-heading">6-2) exe 환경에서 경로 처리(핵심)</h3>



<p>파이썬 코드에서 “실행 위치”를 잡는 함수를 넣어두면 안정적입니다.</p>



<pre class="wp-block-preformatted">import os, sysdef resource_path(relative_path: str) -&gt; str:<br>    # PyInstaller로 묶이면 _MEIPASS 경로에 리소스가 풀림<br>    base_path = getattr(sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__)))<br>    return os.path.join(base_path, relative_path)</pre>



<p>사용 예:</p>



<pre class="wp-block-preformatted">icon_path = resource_path("assets/app.ico")</pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7) “exe 실행하면 저장이 안돼요/초기화돼요” 문제 해결</h2>



<p>이 현상은 거의 대부분 <strong>저장 위치가 잘못 잡혀서</strong> 생깁니다.</p>



<ul class="wp-block-list">
<li>개발 중: 프로젝트 폴더에 저장</li>



<li>exe 실행: 사용자 PC의 다른 위치에서 실행 → 상대경로가 달라짐</li>



<li>또는 Program Files 아래라면 쓰기 권한 문제로 저장 실패</li>
</ul>



<h3 class="wp-block-heading">추천: 사용자 폴더(AppData) 아래에 저장 폴더 만들기</h3>



<pre class="wp-block-preformatted">import osdef get_app_data_dir(app_name="MyApp"):<br>    base = os.getenv("APPDATA")  # C:\Users\...\AppData\Roaming<br>    path = os.path.join(base, app_name)<br>    os.makedirs(path, exist_ok=True)<br>    return path</pre>



<p>저장 예:</p>



<pre class="wp-block-preformatted">cfg_path = os.path.join(get_app_data_dir("HStockGuard"), "config.json")</pre>



<p>이렇게 하면 exe로 배포해도 <strong>설정/저장 데이터가 유지</strong>됩니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">8) 자주 겪는 에러/해결 체크리스트</h2>



<h3 class="wp-block-heading">✅ 실행하자마자 창이 꺼짐</h3>



<ul class="wp-block-list">
<li>콘솔 모드로 빌드해서 에러 확인<br><code>--noconsole</code> 빼고 실행해보기</li>
</ul>



<h3 class="wp-block-heading">✅ 모듈 못 찾는다고 나옴</h3>



<ul class="wp-block-list">
<li>누락된 모듈을 hidden-import로 추가</li>
</ul>



<pre class="wp-block-preformatted">pyinstaller --onefile --hidden-import=패키지명 main.py</pre>



<h3 class="wp-block-heading">✅ 백신이 위험하다고 막음</h3>



<ul class="wp-block-list">
<li>새 exe는 오탐이 흔함</li>



<li>코드서명까지는 현실적으로 어렵고, 최소한 배포 파일을 자주 바꾸지 않는 게 도움</li>



<li>가능하면 <code>onedir</code> 배포도 고려(오탐이 덜 나는 경우가 있음)</li>
</ul>



<h3 class="wp-block-heading">✅ 용량이 너무 큼</h3>



<ul class="wp-block-list">
<li>가상환경을 깨끗하게 유지</li>



<li>불필요한 패키지 제거</li>



<li><code>--exclude-module</code> 사용 고려(상황에 따라)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">9) 배포 방식 추천: onefile vs onedir</h2>



<h3 class="wp-block-heading">onefile</h3>



<ul class="wp-block-list">
<li>장점: 파일 1개로 배포 끝</li>



<li>단점: 실행 시 임시폴더에 풀리는 과정 때문에 첫 실행이 느릴 수 있음</li>
</ul>



<h3 class="wp-block-heading">onedir</h3>



<pre class="wp-block-preformatted">pyinstaller --noconsole main.py</pre>



<ul class="wp-block-list">
<li>장점: 실행 빠르고 문제 추적이 쉬움</li>



<li>단점: 폴더째로 배포해야 함</li>
</ul>



<p>개인적으로는 <strong>처음엔 onedir로 안정화 → 마지막에 onefile</strong>로 마무리하는 경우가 많았습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">FAQ</h2>



<p><strong>Q1. PyInstaller 말고 다른 방법도 있나요?</strong><br>A. 네. <code>cx_Freeze</code>, <code>Nuitka</code> 같은 대안도 있습니다. 다만 가장 대중적이고 자료가 많은 건 PyInstaller입니다.</p>



<p><strong>Q2. 32비트/64비트는 어떻게 맞추나요?</strong><br>A. 빌드에 사용하는 파이썬이 64비트면 보통 64비트 exe가 됩니다. 배포 대상 PC 환경과 맞추세요.</p>



<p><strong>Q3. exe로 만들면 소스가 완전히 숨겨지나요?</strong><br>A. 완전한 보안은 아닙니다. “배포 편의” 목적에 가깝다고 보는 게 현실적입니다.</p>



<h1 class="wp-block-heading">부록) 그대로 복사해서 쓰는 샘플 코드(저장 유지 + 리소스 경로)</h1>



<h2 class="wp-block-heading">core/paths.py</h2>



<pre class="wp-block-preformatted">import os<br>import sysdef resource_path(relative_path: str) -&gt; str:<br>    """<br>    PyInstaller(onefile)에서 리소스 경로를 안전하게 가져온다.<br>    """<br>    base_path = getattr(sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__)))<br>    return os.path.join(base_path, relative_path)def appdata_dir(app_name: str = "MyApp") -&gt; str:<br>    """<br>    AppData\Roaming 아래에 앱 폴더를 생성해 저장 경로로 사용한다.<br>    """<br>    base = os.getenv("APPDATA") or os.path.expanduser("~")<br>    path = os.path.join(base, app_name)<br>    os.makedirs(path, exist_ok=True)<br>    return path</pre>



<h2 class="wp-block-heading">core/config.py</h2>



<pre class="wp-block-preformatted">import json<br>import os<br>from .paths import appdata_dirdef load_config(app_name: str = "MyApp", filename: str = "config.json") -&gt; dict:<br>    path = os.path.join(appdata_dir(app_name), filename)<br>    if not os.path.exists(path):<br>        return {}<br>    with open(path, "r", encoding="utf-8") as f:<br>        return json.load(f)def save_config(cfg: dict, app_name: str = "MyApp", filename: str = "config.json") -&gt; str:<br>    path = os.path.join(appdata_dir(app_name), filename)<br>    with open(path, "w", encoding="utf-8") as f:<br>        json.dump(cfg, f, ensure_ascii=False, indent=2)<br>    return path</pre>



<h2 class="wp-block-heading">main.py (테스트용)</h2>



<pre class="wp-block-preformatted">from core.config import load_config, save_configAPP_NAME = "HowinfoPyExeDemo"def main():<br>    cfg = load_config(APP_NAME)<br>    run_count = int(cfg.get("run_count", 0)) + 1<br>    cfg["run_count"] = run_count    saved_path = save_config(cfg, APP_NAME)<br>    print(f"[OK] 실행 횟수: {run_count}")<br>    print(f"[OK] 설정 저장 위치: {saved_path}")if __name__ == "__main__":<br>    main()</pre>



<h2 class="wp-block-heading">빌드 명령어(윈도우)</h2>



<pre class="wp-block-preformatted">pyinstaller --onefile main.py</pre>



<p>GUI + 아이콘 + assets 포함 예시:</p>



<pre class="wp-block-preformatted">pyinstaller --onefile --noconsole ^<br>  --icon=assets/app.ico ^<br>  --add-data "assets;assets" ^<br>  main.py<br></pre>
<p>게시물 <a href="https://howinfo.kr/%ed%8c%8c%ec%9d%b4%ec%8d%ac-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8%ec%9d%84-%ec%9c%88%eb%8f%84%ec%9a%b0-exe%eb%a1%9c-%eb%a7%8c%eb%93%9c%eb%8a%94-%eb%b0%a9%eb%b2%95-pyinstaller-%ec%8b%a4%ec%a0%84/">파이썬 프로그램을 윈도우 EXE로 만드는 방법 (PyInstaller 실전 가이드)</a>이 <a href="https://howinfo.kr">하우인포-IT·테크</a>에 처음 등장했습니다.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://howinfo.kr/%ed%8c%8c%ec%9d%b4%ec%8d%ac-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8%ec%9d%84-%ec%9c%88%eb%8f%84%ec%9a%b0-exe%eb%a1%9c-%eb%a7%8c%eb%93%9c%eb%8a%94-%eb%b0%a9%eb%b2%95-pyinstaller-%ec%8b%a4%ec%a0%84/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>바이브 코딩으로 만든 Windows 바탕화면 캘린더 프로그램</title>
		<link>https://howinfo.kr/%eb%b0%94%ec%9d%b4%eb%b8%8c-%ec%bd%94%eb%94%a9%ec%9c%bc%eb%a1%9c-%eb%a7%8c%eb%93%a0-windows-%eb%b0%94%ed%83%95%ed%99%94%eb%a9%b4-%ec%ba%98%eb%a6%b0%eb%8d%94/</link>
					<comments>https://howinfo.kr/%eb%b0%94%ec%9d%b4%eb%b8%8c-%ec%bd%94%eb%94%a9%ec%9c%bc%eb%a1%9c-%eb%a7%8c%eb%93%a0-windows-%eb%b0%94%ed%83%95%ed%99%94%eb%a9%b4-%ec%ba%98%eb%a6%b0%eb%8d%94/#respond</comments>
		
		<dc:creator><![CDATA[hong]]></dc:creator>
		<pubDate>Mon, 09 Feb 2026 08:50:20 +0000</pubDate>
				<category><![CDATA[개발·코딩]]></category>
		<category><![CDATA[ai코딩]]></category>
		<category><![CDATA[exe만들기]]></category>
		<category><![CDATA[Pyinstaller]]></category>
		<category><![CDATA[PyQt5]]></category>
		<category><![CDATA[개인업무관리]]></category>
		<category><![CDATA[데스크톱앱개발]]></category>
		<category><![CDATA[바이브코딩]]></category>
		<category><![CDATA[바탕화면캘린더]]></category>
		<category><![CDATA[비개발자개발]]></category>
		<category><![CDATA[업무관리도구]]></category>
		<category><![CDATA[윈도우캘린더]]></category>
		<category><![CDATA[윈도우프로그램]]></category>
		<category><![CDATA[파이썬GUI]]></category>
		<category><![CDATA[파이썬실행파일]]></category>
		<category><![CDATA[파이썬프로그램]]></category>
		<guid isPermaLink="false">https://howinfo.kr/?p=1466</guid>

					<description><![CDATA[<p>파이썬으로 설치형 프로그램과 실행파일 까지 만드는 방법 실제 개발 기록 (전체소스 제공) “개발을 잘 몰라도, AI와 대화만으로 설치형 프로그램을 만들...</p>
<p>게시물 <a href="https://howinfo.kr/%eb%b0%94%ec%9d%b4%eb%b8%8c-%ec%bd%94%eb%94%a9%ec%9c%bc%eb%a1%9c-%eb%a7%8c%eb%93%a0-windows-%eb%b0%94%ed%83%95%ed%99%94%eb%a9%b4-%ec%ba%98%eb%a6%b0%eb%8d%94/">바이브 코딩으로 만든 Windows 바탕화면 캘린더 프로그램</a>이 <a href="https://howinfo.kr">하우인포-IT·테크</a>에 처음 등장했습니다.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">파이썬으로 설치형 프로그램과 실행파일 까지 만드는 방법 실제 개발 기록 (전체소스 제공)</h3>



<p>“개발을 잘 몰라도, AI와 대화만으로 설치형 프로그램을 만들 수 있을까?”</p>



<p>이번 프로젝트는 그 질문에서 시작했습니다.<br>목표는 단순하지만 분명했습니다.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Windows PC 바탕화면에서 항상 보이는 달력 + 일정 관리 프로그램</strong><br>그리고 <strong>나중에 Android 앱과 연동 가능한 구조</strong></p>
</blockquote>



<p>웹앱이 아닌 <strong>완전한 설치형 프로그램</strong>으로요.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">📌 프로젝트 목표 정리</h2>



<p>이번 프로젝트의 핵심 목표는 아래 4가지였습니다.</p>



<ul class="wp-block-list">
<li>Windows 바탕화면에서 실행되는 <strong>독립형 캘린더 프로그램</strong></li>



<li>날짜별 일정 <strong>추가 / 수정 / 삭제</strong></li>



<li>PC 재부팅 후에도 유지되는 <strong>로컬 데이터 저장</strong></li>



<li>향후 Android 앱과 <strong>동기화 가능한 구조 설계</strong></li>
</ul>



<p>특히 중요한 조건은 하나였습니다.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>❗ <strong>코드는 직접 작성하지 않고, ‘바이브 코딩(자연어 + AI)’으로만 진행</strong></p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">🛠 사용한 기술 스택</h2>



<h3 class="wp-block-heading">왜 이 조합을 선택했을까?</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>구분</th><th>선택</th></tr></thead><tbody><tr><td>언어</td><td>Python</td></tr><tr><td>UI</td><td>PyQt5</td></tr><tr><td>데이터</td><td>SQLite</td></tr><tr><td>실행 파일</td><td>PyInstaller</td></tr></tbody></table></figure>



<p><strong>이유는 단순합니다.</strong></p>



<ul class="wp-block-list">
<li>Python은 비개발자도 진입 장벽이 낮고</li>



<li>PyQt는 Windows 네이티브 느낌을 가장 잘 살릴 수 있으며</li>



<li>SQLite는 서버 없이도 안정적인 데이터 저장이 가능하고</li>



<li>PyInstaller로 <strong>단일 파일 배포</strong>가 가능하기 때문입니다.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">🖥️ 1단계: Windows 데스크톱 캘린더 구현</h2>



<p>가장 먼저 구현한 것은 <strong>기본 달력 UI</strong>입니다.</p>



<h3 class="wp-block-heading">구현된 주요 기능</h3>



<ul class="wp-block-list">
<li>월별 달력 표시</li>



<li>오늘 날짜 강조</li>



<li>이전 / 다음 달 이동</li>



<li>날짜 클릭 시 일정 목록 표시</li>
</ul>



<p>처음에는 “그냥 달력만 나오면 되겠지”라고 생각했지만,<br>막상 써보니 <strong>업무용으로는 부족</strong>했습니다.</p>



<p>그래서 바로 다음 단계로 넘어갔습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">📝 2단계: 일정 관리 기능 추가</h2>



<p>업무용 캘린더의 핵심은 결국 <strong>일정 관리</strong>입니다.</p>



<p>추가한 기능은 다음과 같습니다.</p>



<ul class="wp-block-list">
<li>일정 추가 / 수정 / 삭제</li>



<li>시간, 설명, 색상 지정</li>



<li>완료 여부 체크</li>



<li>날짜별 일정 자동 저장</li>
</ul>



<p>이 모든 데이터는 <strong>SQLite 파일 하나</strong>로 관리됩니다.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>👉 프로그램 폴더에 생성되는 <code>.db</code> 파일 하나만 백업하면<br>모든 일정이 그대로 복원됩니다.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">💾 3단계: 로컬 저장 구조 설계 (중요)</h2>



<p>이번 프로젝트에서 꽤 신경 쓴 부분입니다.</p>



<h3 class="wp-block-heading">왜 로컬 저장을 먼저 선택했을까?</h3>



<ul class="wp-block-list">
<li>회사 PC 환경에서는 외부 서버 접근이 제한되는 경우가 많고</li>



<li>개인 업무 일정은 <strong>클라우드보다 로컬이 더 안전</strong>한 경우도 많기 때문입니다.</li>
</ul>



<p>그래서 구조를 이렇게 잡았습니다.</p>



<pre class="wp-block-code"><code>&#91; UI (PyQt) ]
      ↓
&#91; Repository ]
      ↓
&#91; SQLite Database ]
</code></pre>



<p>이 구조 덕분에<br>👉 나중에 <strong>Firebase / REST API / Android 앱 연동</strong>을 붙이기도 쉽습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">⚠️ 예상치 못한 문제: 회사 SSL / 보안 환경</h2>



<p>가장 큰 난관은 <strong>코드가 아니라 환경</strong>이었습니다.</p>



<h3 class="wp-block-heading">발생한 문제</h3>



<ul class="wp-block-list">
<li>회사 네트워크에서 PyPI SSL 인증서 오류</li>



<li>PyQt5, PyInstaller 설치 실패</li>



<li>EXE 생성 단계에서 계속 중단</li>
</ul>



<h3 class="wp-block-heading">해결 방법</h3>



<ul class="wp-block-list">
<li><code>--trusted-host</code> 옵션 사용</li>



<li>미러 서버 활용</li>



<li>오프라인 wheel 파일 설치 가이드 제공</li>
</ul>



<p>결국 <strong>회사 보안 환경에서도 설치 가능</strong>한 배치 파일 세트를 완성했습니다.</p>



<p>이 부분은 “실무 개발”에서 정말 중요한 경험이었습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">📦 4단계: 실행 파일 생성</h2>



<p>최종 목표였던 <strong>독립 실행 파일</strong>도 완성했습니다.</p>



<h3 class="wp-block-heading">실행 파일의 장점</h3>



<ul class="wp-block-list">
<li>Python 설치 불필요</li>



<li>더블 클릭으로 실행</li>



<li>다른 PC로 복사해서 바로 사용 가능</li>
</ul>



<p>생성 명령은 단순하지만,<br>앞선 SSL 문제를 해결하지 않으면 절대 여기까지 올 수 없었습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">📎 첨부 파일 안내</h2>



<p>이 글과 함께 아래 파일들을 <strong>블로그에 첨부</strong>할 예정입니다.</p>



<h3 class="wp-block-heading">📁 첨부 파일</h3>



<ul class="wp-block-list">
<li>Python 전체 소스 코드</li>



<li>실행용 배치 파일</li>



<li>EXE 생성용 스크립트</li>



<li>완성된 실행 파일 (<code>DesktopCalendar</code>)</li>



<li>사용 설명서 (README)</li>
</ul>



<p></p>



<p></p>



<p>👉 <strong>코드를 몰라도</strong></p>



<ul class="wp-block-list">
<li>압축 해제</li>



<li>실행</li>



<li>바로 사용 가능하도록 구성했습니다.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">✍️ 이번 프로젝트를 통해 느낀 점</h2>



<p>이 프로젝트를 통해 확실히 느낀 점이 있습니다.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>이제 “개발을 할 줄 아는 사람”과<br>“개발을 설계할 수 있는 사람”의 경계가 빠르게 무너지고 있다</strong></p>
</blockquote>



<p>코드를 직접 치지 않아도,</p>



<ul class="wp-block-list">
<li>요구사항을 명확히 말할 수 있고</li>



<li>문제를 설명할 수 있고</li>



<li>결과를 검증할 수 있다면</li>
</ul>



<p>👉 <strong>실제 제품 수준의 프로그램도 만들 수 있다</strong>는 걸 확인했습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">🔮 다음 단계 계획</h2>



<p>다음 단계는 자연스럽게 이어집니다.</p>



<ul class="wp-block-list">
<li>Android 앱 버전 제작</li>



<li>PC ↔ 모바일 일정 동기화</li>



<li>알림 기능 추가</li>



<li>반복 일정 / 태그 기능</li>
</ul>



<p>이 역시 <strong>바이브 코딩 방식</strong>으로 계속 진행할 예정입니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">마무리</h2>



<p>이 글은 단순한 개발 튜토리얼이 아닙니다.</p>



<ul class="wp-block-list">
<li>“개발을 못 해도”</li>



<li>“회사 환경이 빡세도”</li>



<li>“시간이 많지 않아도”</li>
</ul>



<p>👉 <strong>AI와 함께라면 어디까지 가능한지</strong>를 기록한 실제 사례입니다.</p>



<p>같은 방식으로 뭔가 만들어보고 싶다면,<br>이 프로젝트 기록이 작은 참고 자료가 되었으면 합니다. </p>



<p>[전체소스] </p>



<div class="wp-block-file"><a id="wp-block-file--media-6824aa0b-b8d1-4336-8432-945c828d5cf3" href="https://howinfo.kr/wp-content/uploads/2026/02/calendar_app_COMPLETE.zip">calendar_app_COMPLETE</a><a href="https://howinfo.kr/wp-content/uploads/2026/02/calendar_app_COMPLETE.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-6824aa0b-b8d1-4336-8432-945c828d5cf3">다운로드</a></div>



<p></p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="594" height="663" src="https://howinfo.kr/wp-content/uploads/2026/02/calendar_s.png" alt="" class="wp-image-1468" srcset="https://howinfo.kr/wp-content/uploads/2026/02/calendar_s.png 594w, https://howinfo.kr/wp-content/uploads/2026/02/calendar_s-269x300.png 269w" sizes="(max-width: 594px) 100vw, 594px" /></figure>



<p></p>



<p></p>
<p>게시물 <a href="https://howinfo.kr/%eb%b0%94%ec%9d%b4%eb%b8%8c-%ec%bd%94%eb%94%a9%ec%9c%bc%eb%a1%9c-%eb%a7%8c%eb%93%a0-windows-%eb%b0%94%ed%83%95%ed%99%94%eb%a9%b4-%ec%ba%98%eb%a6%b0%eb%8d%94/">바이브 코딩으로 만든 Windows 바탕화면 캘린더 프로그램</a>이 <a href="https://howinfo.kr">하우인포-IT·테크</a>에 처음 등장했습니다.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://howinfo.kr/%eb%b0%94%ec%9d%b4%eb%b8%8c-%ec%bd%94%eb%94%a9%ec%9c%bc%eb%a1%9c-%eb%a7%8c%eb%93%a0-windows-%eb%b0%94%ed%83%95%ed%99%94%eb%a9%b4-%ec%ba%98%eb%a6%b0%eb%8d%94/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
