<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>달나라 노트</title>
    <link>https://cosmosproject.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 19:10:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>CosmosProject</managingEditor>
    <image>
      <title>달나라 노트</title>
      <url>https://tistory1.daumcdn.net/tistory/4327363/attach/b996039b121c4a28a6b2eb07e65f5da3</url>
      <link>https://cosmosproject.tistory.com</link>
    </image>
    <item>
      <title>Python Basic : Python Virtual Environment 관리 (venv, interpreter)</title>
      <link>https://cosmosproject.tistory.com/925</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python을 다룰 때 가상환경(Virtual Environment)을 다루는 경우는 매우 흔합니다.&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;이번에는 (anaconda python이 아닌) 일반 Python을 사용할 때 가상환경을 어떻게 관리할 수 있는지를 알아봅시다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 현재 Python이 설치되어 있는지, 설치되어있다면 그 경로가 어디인지 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774446489316&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;(base) ~~% which -a python

/opt/anaconda3/bin/python3
/usr/local/bin/python3
/usr/bin/python3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;which -a python 명령어를 이용하여 현재 설치된 python의 경로와 종류를 파악합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이는 각자의 환경마다 다를 수 있으며 python은 이미 설치되어있다고 가정합니다.)&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;&amp;nbsp;&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;&amp;nbsp;&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;원하는 Python을 선택하여 가상환경을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 /usr/local/bin/python3를 이용해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774446489316&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/usr/local/bin/python3 -m venv my_test_env&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;/usr/local/bin/python3 -&amp;gt; 여기 설치된 python을 이용해서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-m venv -&amp;gt; 가상환경을 만들건데 (-m은 모듈(Module)을 스크립트처럼 실행하라 라는 의미인데 여기선 더 자세한 설명은 생략하겠습니다.)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;my_test_env -&amp;gt; 가상환경 이름은 my_test_env로 해라&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;그러면 아래처럼 제가 지정한 my_test_env라는 이름의 폴더가 생성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKuB3c/dJMcahcJOy6/fkmV6gWm9v2feqkxotgV91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKuB3c/dJMcahcJOy6/fkmV6gWm9v2feqkxotgV91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKuB3c/dJMcahcJOy6/fkmV6gWm9v2feqkxotgV91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKuB3c%2FdJMcahcJOy6%2FfkmV6gWm9v2feqkxotgV91%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;280&quot; height=&quot;62&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;70&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efr7dV/dJMcacJiuoK/Nyqk2KDVqYntlmbXMAgV31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efr7dV/dJMcacJiuoK/Nyqk2KDVqYntlmbXMAgV31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efr7dV/dJMcacJiuoK/Nyqk2KDVqYntlmbXMAgV31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fefr7dV%2FdJMcacJiuoK%2FNyqk2KDVqYntlmbXMAgV31%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;235&quot; height=&quot;150&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;240&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;bin, include, lib 등의 폴더와 파일들은 모두 python 가상환경 구동에 필요한 것이므로 잘 설치된 것이라고 볼 수 있습니다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 잠깐, my_test_env라는 가상환경은 대체 어디에 생성되는걸까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경이 설치되는 경로는 가상환경을 terminal에서 설치할 때 terminal이 위치하고있는 곳에 설치됩니다.&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;내가 원하는 위치에 가상환경을 설치하고싶으면 terminal에서 cd command를 이용하여 원하는 위치로 이동한 후에 가상환경을 설치해야 합니다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774446489317&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/usr/local/bin/python3 -m venv ~/Documents/code/python_venv_dir/my_test_env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(~/Documents/code/python_ven_dir/ 경로에 my_test_env라는 이름의 가상환경을 생성하라는 뜻)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python의 가상환경은 이렇게 주로 어떤 하나의 폴더에 몰아서 설치하여 관리하곤 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경 설치까지 했으니 이제 가상환경을 실행시켜보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에 아래처럼 입력하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1774446489317&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;source my_test_env/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JwDOE/dJMcagx7nna/KVSxeRR1nK8eCziTtqZoa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JwDOE/dJMcagx7nna/KVSxeRR1nK8eCziTtqZoa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JwDOE/dJMcagx7nna/KVSxeRR1nK8eCziTtqZoa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJwDOE%2FdJMcagx7nna%2FKVSxeRR1nK8eCziTtqZoa1%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;218&quot; height=&quot;252&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 가상환경이 설치된 곳을 가보면 bin이라는 폴더가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 bin이라는 폴더를 들어가보면 activate이라는 파일이 있는데 이 파일이 가상환경을 실행시켜주는 파일이라고 생각하면 됩니다.&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;그래서 source my_test_env/bin/activate 구문은 my_test_env 가상환경에 있는 activate 파일을 실행하여 my_test_env 가상환경을 acitvate하라는 의미를 갖습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 한 가지 주의할 점은 가상환경의 경로입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 가상환경을 설치할 때 어떤 경로에 가상환경을 설치할지 선택할 수 있다고 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 원하는 경로에 가상환경을 설치할 수 있다는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 가상환경 설치 시 별도의 경로를 명시하지 않으면 terminal이 현재 위치하고 있는 곳에 가상환경이 설치된다고 했습니다.&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;이것은 가상환경을 activate할 때에도 동일합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1774448108985&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source my_test_env/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경을 activate할 때 위처럼 source my_test_env/bin/activate 구문을 입력한다고 했습니다.&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;이것이 정상적으로 작동하려면 현재 terminal이 위치하고 있는 곳에 my_test_env라는 가상환경이 설치되어있어야만 정상 작동합니다.&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;따라서 terminal에서 cd command를 이용하여 terminal이 위치하고 있는 경로를 가상환경이 설치되어있는 경로로 먼저 바꾼 후 activate시키거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774446489317&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;source ~/Documents/code/my_test_env/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 가상환경이 설치된 경로를 절대경로로 명시하여 activate하는 방법이 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RywWG/dJMcaiQdl0s/J1HZQRz1zdipxhns6bKsl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RywWG/dJMcaiQdl0s/J1HZQRz1zdipxhns6bKsl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RywWG/dJMcaiQdl0s/J1HZQRz1zdipxhns6bKsl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRywWG%2FdJMcaiQdl0s%2FJ1HZQRz1zdipxhns6bKsl0%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;587&quot; height=&quot;71&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경이 정상적으로 activate되면 위 이미지처럼 terminal의 가장 왼쪽에 괄호로 현재 activate된 가상환경 이름이 뜨게 됩니다.&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;&amp;nbsp;&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;가상환경을 activate했으면 deactivate할 수도 있어야겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경의 deactivate는 간단합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1774446489317&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 위처럼 deactivate를 터미널에 입력하면 됩니다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python Basic</category>
      <category>Environment</category>
      <category>Python</category>
      <category>vevn</category>
      <category>virtual env</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/925</guid>
      <comments>https://cosmosproject.tistory.com/925#entry925comment</comments>
      <pubDate>Wed, 25 Mar 2026 22:48:11 +0900</pubDate>
    </item>
    <item>
      <title>Python pathlib : Path.suffix (파일의 확장자 추출, file extension)</title>
      <link>https://cosmosproject.tistory.com/924</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pathlib에서 suffix 속성을 이용하면 파일의 확장자를 받을 수 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1770973040917&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;from pathlib import Path

dir_path = '/Users/Documents/code/pythonProject/h_2.py'

# Create a Path object
obj_path = Path(dir_path)

# Get extension through suffix attribute
extension = obj_path.suffix

# Show extension
print(extension)


-- Result
.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- obj_path&amp;nbsp;=&amp;nbsp;Path(dir_path)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Path를 통해 특정 directory에 존재하는 파일에 대한 object를 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이 object에는 파일에 대한 다양한 정보가 담겨있게 되죠.&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;- extension&amp;nbsp;=&amp;nbsp;obj_path.suffix&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이렇게 suffix property를 이용해서 파일의 확장자 정보를 불러오는겁니다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python ETC</category>
      <category>pathlib</category>
      <category>Python</category>
      <category>suffix</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/924</guid>
      <comments>https://cosmosproject.tistory.com/924#entry924comment</comments>
      <pubDate>Fri, 13 Feb 2026 17:59:00 +0900</pubDate>
    </item>
    <item>
      <title>Python os : os.path.isfile() (파일 여부 체크, file or not)</title>
      <link>https://cosmosproject.tistory.com/923</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;os.path.isfile()은 주어진 경로가 파일인지 아닌지를 return합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767418672896&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;os.path.isfile(directory)&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&gt;directory가 파일이라면 True를 return합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;directory가 파일이 아니라면 False를 return합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767418672896&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import os

target_dir = '/Users/Documents/code/pythonProject/gemini_test.py'  # 1

bool_file_yn = os.path.isfile(target_dir)  # 2
print(bool_file_yn)


-- Result
True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 체크할 directory를 준비합니다.&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;2. os.path.isfile() method를 이용하여 directory의 파일 여부를 체크합니다.&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;위 예시에서 주어진 경로는 /Users/Documents/code/pythonProject/gemini_test.py 이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/Users/Documents/code/pythonProject/gemini_test.py는 누가봐도 python 파일입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 True가 reutrn됩니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767418672897&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import os

target_dir = '/Users/Documents/code/pythonProject/'

bool_file_yn = os.path.isfile(target_dir)
print(bool_file_yn)


-- Result
False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 target_dir에 /Users/Documents/code/pythonProject/를 줘봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;따라서 os.path.isfile()의 결과로 False가 return되는 것을 알 수 있습니다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python os</category>
      <category>OS</category>
      <category>os.path.isfile()</category>
      <category>Python</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/923</guid>
      <comments>https://cosmosproject.tistory.com/923#entry923comment</comments>
      <pubDate>Sat, 3 Jan 2026 14:37:54 +0900</pubDate>
    </item>
    <item>
      <title>Python glob : iglob (폴더 속 폴더 까지 모든 파일 list 추출)</title>
      <link>https://cosmosproject.tistory.com/922</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간혹 어떤 기준되는 폴더 안에 있는 모든 파일 list를 얻고 싶을 때가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 단순히 어떤 폴더 안에 담긴 것이 아니라 폴더 속 폴더 속 폴더 속의 파일 같이 다중으로 구성된 directory의 모든 파일 리스트를 얻고싶을 때가 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때는 iglob를 사용하면 유용합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767417718782&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;glob.iglob(directory, recursive=True/False)&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size16&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시에서의 목적은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;내가 원하는 폴더 안에 있는 모든 파일과, 모든 폴더 속에 담긴 파일까지 모두 return하라.&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767417718782&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import glob


# 기준 folder
root_path = '/Users/Documents/code/pythonProject/**'  # 1

# iglob는 list가 아닌 iterator를 생성함
filter_iterator = glob.iglob(root_path, recursive=True)  # 2

print(type(filter_iterator))  # 3

# for loop를 통해 iterator로부터 출력되는 모든 값 출력
for f in filter_iterator:  # 4
    print(f)


-- Result
&amp;lt;class 'generator'&amp;gt;

/Users/Documents/code/pythonProject/
/Users/Documents/code/pythonProject/h_2.py
/Users/Documents/code/pythonProject/turtle_test
/Users/Documents/code/pythonProject/turtle_test/turtle_test.py
/Users/Documents/code/pythonProject/test_keyboard_control.py
/Users/Documents/code/pythonProject/browser_control.py
/Users/Documents/code/pythonProject/img_black.png
/Users/Documents/code/pythonProject/imgs
/Users/Documents/code/pythonProject/imgs/스크린샷 2025-08-31 오전 7.37.42.png
/Users/Documents/code/pythonProject/imgs/스크린샷 2025-08-31 오전 7.44.53.png
/Users/Documents/code/pythonProject/pdf
/Users/Documents/code/pythonProject/pdf/testing.pdf
/Users/Documents/code/pythonProject/test.py
/Users/Documents/code/pythonProject/gemini_test.py
/Users/Documents/code/pythonProject/main.py
/Users/Documents/code/pythonProject/h_1.py
/Users/Documents/code/pythonProject/sample_capture.png&lt;/code&gt;&lt;/pre&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;b&gt;1. root_path 지정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 적힌 경로에 담긴 모든 파일과 폴더 리스트를 출력할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주의할 점은 '/Users/Documents/code/pythonProject/**' 이렇게 directory의 가장 끝에 asterisk를 2개 ** 적어야 한다는 것입니다.&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;'/Users/Documents/code/pythonProject/*' 처럼 *를 한개만 적으면 다른 결과가 나옵니다.&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;'/Users/Documents/code/pythonProject/*' -&amp;gt; /Users/Documents/code/pythonProject/ 폴더 바로 안에 있는 것만 스캔함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;'/Users/Documents/code/pythonProject/**' -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;/Users/Documents/code/pythonProject/ 폴더 바로 안에 있는 것과 폴더 속 폴더 까지도 모두 스캔함&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;이렇게 * 2개를 적어야 폴더 속 폴더까지 모두 탐색하라는 pattern을 의미합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. iglob iterator 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iglob는 list가 아닌 iterator를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 특정 디렉토리에 폴더나 파일이 너무 많아도 용량이 매우 큰 list가 생성되지 않는다는 장점이 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 생성된 iterator 확인&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. for loop를 통해 iterator를 실행하여 folder, file 출력&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보면 /Users/Documents/code/pythonProject/ 폴더 안에 있는 모든 파일과 폴더 속 폴더까지 모두 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 파일도 단순히 python file이 아니라 이미지, pdf등 존재하는 모든 것이 출력됩니다.&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 위 결과는 기준 경로 안에 있는 파일과 폴더까지 모두 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 파일만 출력하고 싶으면 어떻게 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이땐 os.path.isfile를 같이 이용하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767417718783&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import glob
import os

# 기준 folder
root_path = '/Users/robin/Documents/code/pythonProject/**'

# iglob는 list가 아닌 iterator를 생성함
filter_iterator = glob.iglob(root_path, recursive=True)

print(type(filter_iterator))

# for loop를 통해 iterator로부터 출력되는 모든 값 출력
for f in filter_iterator:
    if os.path.isfile(f):  # 단, file일 때만 출력 (폴더는 출력하지 않음)
        print(f)


-- Result
&amp;lt;class 'generator'&amp;gt;

/Users/Documents/code/pythonProject/h_2.py
/Users/Documents/code/pythonProject/turtle_test/turtle_test.py
/Users/Documents/code/pythonProject/test_keyboard_control.py
/Users/Documents/code/pythonProject/browser_control.py
/Users/Documents/code/pythonProject/img_black.png
/Users/Documents/code/pythonProject/imgs/스크린샷 2025-08-31 오전 7.37.42.png
/Users/Documents/code/pythonProject/imgs/스크린샷 2025-08-31 오전 7.44.53.png
/Users/Documents/code/pythonProject/pdf/testing.pdf
/Users/Documents/code/pythonProject/test.py
/Users/Documents/code/pythonProject/gemini_test.py
/Users/Documents/code/pythonProject/main.py
/Users/Documents/code/pythonProject/h_1.py
/Users/Documents/code/pythonProject/sample_capture.png&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;os.path.isfile() method는 주어진 경로가 file이면 True, file이 아니면 False를 return합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python glob</category>
      <category>glob</category>
      <category>iglob</category>
      <category>Python</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/922</guid>
      <comments>https://cosmosproject.tistory.com/922#entry922comment</comments>
      <pubDate>Sat, 3 Jan 2026 14:22:01 +0900</pubDate>
    </item>
    <item>
      <title>Python anaconda : conda activate (environment 활성화하기)</title>
      <link>https://cosmosproject.tistory.com/921</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anaconda를 사용할 때 다양한 environment를 어떻게 활성화하는지 알아봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767417063834&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;conda activate environment_name&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 interpreter를 활성화할 땐 conda activate 명령어를 사용하면 됩니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;terminal을 열고 conda env list를 입력하여 현재 제 컴퓨터에 설치된 conda environment를 출력해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(conda env list 관련 = &lt;a href=&quot;https://cosmosproject.tistory.com/919&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cosmosproject.tistory.com/919&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767417063835&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;(base) ~ % conda env list
# conda environments:
#
base                  *  /opt/anaconda3
dj_project               /opt/anaconda3/envs/dj_project
testproject              /opt/anaconda3/envs/testproject&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;base, dj_project, testproject라는 3개의 environment가 설치되어 있고 현재 base environment가 활성화되어있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 terminal에 아래 명령어를 입력해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767417063835&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;conda activate testproject&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;testproject라는 이름의 environment를 활성화시키겠다는 의미입니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음에 다시 conda env list를 입력해보면 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767417063835&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;(testproject) ~ % conda env list
# conda environments:
#
base                     /opt/anaconda3
dj_project               /opt/anaconda3/envs/dj_project
testproject           *  /opt/anaconda3/envs/testproject&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별표가 testporject에 표시되고있죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말은 현재 testproject가 활성화된 상태라는 것을 의미합니다.&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;그리고 왼쪽 상단에 (testproject)라고 써있는데 이 말은 현재 활성화된 상태의 environment가 testproject라는 의미입니다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python ETC</category>
      <category>Anaconda</category>
      <category>conda activate</category>
      <category>Python</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/921</guid>
      <comments>https://cosmosproject.tistory.com/921#entry921comment</comments>
      <pubDate>Sat, 3 Jan 2026 14:11:08 +0900</pubDate>
    </item>
    <item>
      <title>Python anaconda : conda info (interpreter 정보 출력)</title>
      <link>https://cosmosproject.tistory.com/920</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anaconda에서는 현재 사용중인 interpreter의 정보를 출력하는 기능이 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767416712428&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;conda info&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;terminal을 열고 conda info 명령어를 입력해봅시다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767416712428&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;(base) ~ % conda info

     active environment : base
    active env location : /opt/anaconda3
            shell level : 1
       user config file : /Users/me/.condarc
 populated config files : /Users/me/.condarc
          conda version : 24.5.0
    conda-build version : 24.1.2
         python version : 3.11.7.final.0
                 solver : libmamba (default)
       virtual packages : __archspec=1=skylake
                          __conda=24.5.0=0
                          __osx=26.1=0
                          __unix=0=0
       base environment : /opt/anaconda3  (writable)
      conda av data dir : /opt/anaconda3/etc/conda
  conda av metadata url : None
           channel URLs : https://repo.anaconda.com/pkgs/main/osx-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/osx-64
                          https://repo.anaconda.com/pkgs/r/noarch
          package cache : /opt/anaconda3/pkgs
                          /Users/me/.conda/pkgs
       envs directories : /opt/anaconda3/envs
                          /Users/me/.conda/envs
               platform : osx-64
             user-agent : conda/24.5.0 requests/2.31.0 CPython/3.11.7 Darwin/25.1.0 OSX/26.1 solver/libmamba conda-libmamba-solver/24.1.0 libmambapy/1.5.6 aau/0.4.3 c/EIhs3V1rFKNFD4ucRaR5uw s/pMkzV5__rj_nLxM84GzDmw e/o5cjODAD3WITxEWk0ZUdlg
                UID:GID : 501:20
             netrc file : None
           offline mode : False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conda info를 입력했을 때의 정보입니다.&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;저는 지금 base라는 이름의 interpreter를 activate해둔 상태입니다.&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;b&gt;- active&amp;nbsp;environment&amp;nbsp;:&amp;nbsp;base&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이렇게 현재 active인 environment가 base로 표시된 것임을 볼 수 있습니다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python ETC</category>
      <category>Anaconda</category>
      <category>conda info</category>
      <category>interpreter</category>
      <category>Python</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/920</guid>
      <comments>https://cosmosproject.tistory.com/920#entry920comment</comments>
      <pubDate>Sat, 3 Jan 2026 14:05:17 +0900</pubDate>
    </item>
    <item>
      <title>Python anaconda : conda env list (anaconda interpreter list, interpreter list 출력)</title>
      <link>https://cosmosproject.tistory.com/919</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anaconda를 사용할 때 현재 설치된 anaconda interpreter가 설치된 경로와 이름 등 anaconda interpreter list를 추출할 수 있는 방법을 알아봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767416542419&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;conda env list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;terminal을 열고 위 명령어를 입력해봅시다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1767416542420&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;(base) ~ % conda env list
# conda environments:
#
base                  *  /opt/anaconda3
dj_project               /opt/anaconda3/envs/dj_project
testproject              /opt/anaconda3/envs/testproject&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 위처럼 현재 설치된 interpreter의 이름과 각 interpreter가 설치된 경로가 출력됩니다.&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;위 예시에서는 base, dj_project, testproject라는 이름의 3개의 interpreter가 출력되었으므로 총 3개의 interpreter가 설치되어있는 것입니다.&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;그리고 base에 * 표시가 되어있는데 이는 현재 terminal에서 activate된 상태의 interpreter가 base interpreter인 것입니다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Python ETC</category>
      <category>Anaconda</category>
      <category>conda</category>
      <category>conda env list</category>
      <category>Python</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/919</guid>
      <comments>https://cosmosproject.tistory.com/919#entry919comment</comments>
      <pubDate>Sat, 3 Jan 2026 14:03:20 +0900</pubDate>
    </item>
    <item>
      <title>Hive : _SUCCESS 파일 없애기 (set mapreduce.fileoutputcommitter.marksuccessfuljobs = false)</title>
      <link>https://cosmosproject.tistory.com/918</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&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;b&gt;* _SUCCESS 파일을 생성하지 않는 옵션을 보려면 맨 아래에 있는 4번으로 넘어가세요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. _SUCCESS 파일에 대해서&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_SUCCESS 파일이 뭔지부터 알아봅시다.&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;Hive를 사용하다보면 특정 조건의 query를 실행했을 때 _SUCCESS 파일이 생성되곤 합니다.&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;모든 query를 실행했을 때 생성되는 것은 아니고, Hive에서 데이터를 쓰는(write) query를 실행할 때 _SUCCESS 파일이 생성됩니다.&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;대표적으로 다음과 같은 경우에 _SUCCESS 파일이 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- insert into 등으로 테이블에 데이터를 삽입할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- create table ~~ as select ~ (CTAS) 와 같이 select 쿼리의 결과를 바탕으로 새 테이블을 만들 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아래처럼 external table을 생성하고 데이터를 insert 할 때&lt;/p&gt;
&lt;pre id=&quot;code_1766971031316&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;drop table if exists test_table_1;
create external table test_table_1 (
    col_1     bigint,
    col_2     string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
location 's3://root_dir/test_dir/'
;

insert overwrite table test_table_1
select  col_1
        , col_2
from original_table
;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 _SUCCESS 파일은 일반적인 select query에서는 생성되지 않고 데이터를 어딘가에 insert 하는 등 write할 때 생성됩니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_SUCCESS 파일은 일반적으로 비어있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무런 데이터를 가지지 않은 그냥 파일의 이름이 _SUCCESS인 파일이 생성됩니다.&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;_SUCCESS 파일은 내용은 비어있지만 flag역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_SUCCESS 파일이 존재한다면 &quot;이 job이 성공적으로 수행되어 완료되었구나&quot;라는 것을 판단할 수 있는 것이죠.&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. _SUCCESS 파일에 데이터가 있는 경우&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하는 Hive 서버의 설정값이나 Hive 서버의 환경에 따라서 _SUCCESS 파일이 생성되는 것은 동일하지만 _SUCCESS 파일에 어떤 JSON 형태의 데이터가 담기는 경우가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(위에서 언급했던 비어있는 _SUCCESS 파일이 아니라는 것이죠.)&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;Hive의 설정값에 따라서 _SUCCESS 파일에 JSON 형태의 데이터를 담아주는 경우가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 주로 다음과 같은 내용들이 _SUCCESS 파일에 담겨있게 됩니다.&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;- committer: 사용된 커미터의 종류 (예: MagicCommitter, StagingCommitter)&lt;br /&gt;- data: 실제로 생성된 파일 목록&lt;br /&gt;- metrics: 작업 성능 지표 (쓰기 속도, 태스크 수 등)&lt;br /&gt;- date: 작업 완료 시간&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;결국 정리해보면 Hive에서 write을 할 때 write 작업이 성공적으로 완료되면 _SUCCESS 파일이 생성되며 이 _SUCCESS 파일 안에는 수행되었던 write 작업의 내용이 JSON형태로 찍히게 되는 것입니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. _SUCCESS 파일에 데이터가 있는 경우의 문제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1766971031317&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;drop table if exists test_table_1;
create external table test_table_1 (
    col_1     bigint,
    col_2     string
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
location 's3://root_dir/test_dir/'
;

insert overwrite table test_table_1
select  col_1
        , col_2
from original_table
;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위같이 external table을 만들고 여기에 insert overwrite을 하여 S3의 어떤 경로에 데이터를 넣었다고 합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에 일반적으로 location에 명시된 데이터가 저장되는 S3 경로(위 예시에서는 s3://root_dir/test_dir/)에 _SUCCESS 파일도 생성됩니다.&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;즉, s3://root_dir/test_dir/에는 단순히 insert overwrite을 했던 original_table에 담긴 데이터 뿐 아니라 _SUCCESS 파일도 존재하게 된다는 것이죠.&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;_SUCCESS 파일이 비어있다면 문제 없을 수 있지만 _SUCCESS 파일에 JSON 형태의 어떠한 데이터가 있다면 s3://root_dir/test_dir/ 경로에는 original_table 데이터 뿐 아니라 _SUCCESS 파일에 있는 JSON 로그까지 있게 됩니다.&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;보통 Hive에서 external table을 만들어 S3에 어떠한 데이터를 올리는 경우는 S3에 데이터를 업로드하여 업로드된 데이터를 다른 Database(e.g. Redshift etc)나 다른 곳에서 접근하게 하기 위함일 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 _SUCCESS 파일에 있는 JSON 로그까지 읽어서 의도치 않은 데이터를 결과에 포함시키거나 아니면 data pipeline에 에러가 발생할 수 있습니다.&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;그래서 data pipeline을 구성할 때에는 굳이 Hive의 _SUCCESS 파일을 인식하기보다 Airflow의 dependency나 별도의 flagging file을 S3의 다른 directory에 모아두고 사용하는 것이 일반적입니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. _SUCCESS 파일을 생성되지 않게 하는 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_SUCCESS 파일이 생성되지 않게 하려면 아래 옵션을 Hive query의 맨 위에 추가하여 같이 실행하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1766971031317&quot; class=&quot;bash&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; cursor: default; z-index: 1;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;set mapreduce.fileoutputcommitter.marksuccessfuljobs = false;

-- your query&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL/Apache Hive</category>
      <category>fileoutputcommitter.marksuccessfuljobs</category>
      <category>hive</category>
      <category>_SUCCESS</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/918</guid>
      <comments>https://cosmosproject.tistory.com/918#entry918comment</comments>
      <pubDate>Mon, 29 Dec 2025 20:11:10 +0900</pubDate>
    </item>
    <item>
      <title>Local Minima는 딥러닝에서 진짜 큰 문제를 일으킬까? (feat. Saddle Point)</title>
      <link>https://cosmosproject.tistory.com/917</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경사 하강법(Gradient Descent) 얘기를 할 때 Local Minima를 언급했었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(경사 하강법 글 = &lt;a href=&quot;https://cosmosproject.tistory.com/916&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cosmosproject.tistory.com/916&lt;/a&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;그래서 Local Minima가 딥러닝에 저해되는 요소라고 언급하였는데 그러면 현실적으로 Local Minima라는 문제가 있음에도 현재 전세계적으로 딥러닝이 잘 되고 있는 이유와, 왜 그런지를 알아봅시다.&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;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;왜 Local Minima 문제에도 불구하고 딥러닝은 잘 작동할까? Local Minima 문제를 어떻게 해결하는 것일까?&quot;&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 현실적으로 다뤄지는 딥러닝의 손실 함수(에러율 함수)는 매우 고차원 함수이다.&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEuEZT/dJMcacO0Ndg/6kGaEzjif3fIHTAaoKGG40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEuEZT/dJMcacO0Ndg/6kGaEzjif3fIHTAaoKGG40/img.png&quot; data-alt=&quot;Local Minima Problem&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEuEZT/dJMcacO0Ndg/6kGaEzjif3fIHTAaoKGG40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEuEZT%2FdJMcacO0Ndg%2F6kGaEzjif3fIHTAaoKGG40%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;704&quot; height=&quot;452&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Local Minima Problem&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 경사 하강법 얘기를 할 때 Local Minima를 언급하며 봤던 손실함수의 그래프입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;보면 Global Minimum 지점이 있고, Local Minima 지점이 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 에러율을 하다보면 A section에서 Local Minima 지점에 빠져 헤어나오지 못한다는 의미의 내용을 언급했습니다.&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;근데 위 손실 함수는 매우매우 단순한 2차원 구조를 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 간단한 저차원 함수(1~3차원 등)에서는 위처럼 진짜 딥러닝에 문제가 될 수 있는 Local Minima라고 할 수 있는 지점이 비교적 쉽게 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이러한 Local Minima가 딥러닝 모델에 저해될 수도 있구요.&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;그런데 보통 현실에서 딥러닝을 할 때의 손실 함수는 만~백만개 단위의 parameter를 가진 고차원 함수입니다.&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;저차원 손실 함수에서는 빠지면 쉽고 Global Minimum과 비교했을 때 에러율이 상대적으로 큰 Local Minima가 자주 나타날 수 있는 반면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고차원 손실 함수에서는 Local Minima가 있을 수는 있어도 대부분의 Local Minima가 Global Minimum과 압도적인 차이를 가지는 경우가 적어집니다.&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;즉, 어떤 손실 함수에서건 Local Minima는 존재할 수 있지만 고차원 손실 함수에서는 진짜 심각한 문제라고 인식할만한 나쁜 Local Minima point가 거의 사라진다는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 어떤 Local Minima에 빠지더라도 그 학습 결과가(에러율이) 딥러닝 모델을 사용 못할 정도가 아니라는 것입니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Local Minima보다 더 큰 문제는 Saddle Point(안장점)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 딥러닝에서는 Local Minima 문제보다 Saddle Point가 더 큰 문제로 다가옵니다.&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;Saddle point(안장점) 마치 말의 안장같이 생긴 형대를 띄는 그래프를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 상상이 안가실텐데 이 그래프는 2차원 그래프가 아닙니다. 3차원으로 생각해야 해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQXibv/dJMcain9U3f/JuVF8rGokoYBII090xNYx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQXibv/dJMcain9U3f/JuVF8rGokoYBII090xNYx1/img.png&quot; data-alt=&quot;Saddle Point&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQXibv/dJMcain9U3f/JuVF8rGokoYBII090xNYx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQXibv%2FdJMcain9U3f%2FJuVF8rGokoYBII090xNYx1%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;434&quot; height=&quot;450&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Saddle Point&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 Saddle Point를 나타내보자면 위와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진짜 말의 안장같이 생겼죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2383&quot; data-origin-height=&quot;2475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv1WfU/dJMcahpfEvM/AtXdIokT7O2WfFtnzl5mT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv1WfU/dJMcahpfEvM/AtXdIokT7O2WfFtnzl5mT1/img.png&quot; data-alt=&quot;Saddle Point&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv1WfU/dJMcahpfEvM/AtXdIokT7O2WfFtnzl5mT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv1WfU%2FdJMcahpfEvM%2FAtXdIokT7O2WfFtnzl5mT1%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;580&quot; height=&quot;602&quot; data-origin-width=&quot;2383&quot; data-origin-height=&quot;2475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Saddle Point&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 이미지를 보면 제가 그래프의 가운데 부분에 빨간색 점으로 A point라고 표시한 부분이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 Saddle Point입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Saddle Point는 기울기가 0입니다. 위 안장을 볼 때 곡선이 점점 완만해지며 미분값이 0이 되는 지점인 것 같죠?&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;Saddle Point의 핵심은 여기서 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Path 1의 경로를 통해서 Saddle Point로 간다고 해보죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Path 1 경로는 Saddle Point를 향해 점점 올라가고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 반대로 Path 2의 경로를 통해서 Saddle Point로 접근한다고 가정하면 Path 2 경로는 Saddle Point를 향해 점점 내려가고 있어요.&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;Saddle Point의 특징은 위처럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기울기가 0이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 방향에서 보면 올라가지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 방향에서 보면 내려가는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 형태의 지점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Saddle point는 어떻게 보면 오르막이지만 어떻게 보면 내리막인 지점이죠.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 왜 Saddle point가 딥러닝 학습에 문제가 될까요?&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;b&gt;(1) 오르막인지 내리막인지에 대한 구분이 애매해지고 신호가 작아진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;그런데 위에서 봤듯이 Saddle point에 접근하게 되면 더 내려갈 내리막이 있는데도 현재 기울기가 매우매우 작거나 0이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝을 진행하는데 학습을 1번 진행했더니 모델이 예상한 값이 1000, 실제 정답은 100이라고 합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 모델의 예측치와 정답간의 차이를 계산하면 1000 - 100 = 900이라는 차이가 나죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이정도면 꽤 큰 차이가 납니다. 현재 딥러닝 모델의 정확도가 매우 떨어진다는 의미죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음 학습에서는 현재 모델이 가진 여러 값들을 더 큰 폭으로 변화시켜야 좋을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;반대로 다른 모델은 학습을 1번 진행했더니 모델이 예상한 값이 101, 실제 정답은 100이라고 합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 모델의 예측치와 정답간의 차이가 1밖에 나지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 정답 근처에 있음을 알 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 경우는 모델이 가진 여러 값들을 작은 폭으로 변화시켜야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;p data-ke-size=&quot;size16&quot;&gt;이를 달리말하면 현 시점의 손실 함수의 미분값(기울기)이 클수록 모델에는 더 큰 폭의 변화가 일어나며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;근데 Saddle Point는 더 나아갈 내리막이 있음에도 불구하고 기울기가 0에 접근하게 됩니다.&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;따라서 Saddle Point에 빠지게 되면 한 번 학습할 때 마다 모델에 가해지는 변화가 적어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때문에 Saddle Point는 모델의 학습을 느리게 만들어 학습을 저해합니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) 고차원 손실 함수에서는 Local Minima보다 Saddle Point가 훨씬 더 많다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 현실적인 딥러닝에서는 손실 함수가 매우 고차원이라고 했죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 고차원 손실 함수에서는 Local Minima 지점보다 Saddle Point가 훨씬 더 빈번하게 발생하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 그러면 Saddle Point는 어떻게 해결하는가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝에서 사용하는 여러 방식 중 최신 optimizer들은 Saddle Point에 대한 다양한 해결책을 제공해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;b&gt;(1) Momentum Optimizer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Momentum Optimizer는 관성을 구현한 optimizer입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운동을 할 때 내가 지금 멈추려고 해도 관성에 의해 쉽게 멈추지 못하는 것 처럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 학습 진행 시 Saddle Point에 접근해서 기울기가 0에 근접했다고 해도(= 멈췄다고 해도) 진행 방향으로 좀 더 나아가도록(= 관성에 의해 멈추지 못하는) 유도하는 방식입니다.&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;기울기가 0이 되는 지점에 도달해도 바로 기울기를 0으로 만들어서 모델의 변화 폭을 줄이는게 아니라 이전에 진행해왔던 모멘텀(관성, 기울기)으로 좀 더 진행해보는 것이죠.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) Adam Optimizer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adam Optimizer는 학습률을 변화시키는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑같은 지점에 있다고 가정할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습률이 크면 모델이 한번 학습할 때 변화하는 폭이 커지고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습률이 작으면 모델이 한번 학습할 때 변화하는 폭이 작아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adam Optimizer는 고정된 학습률을 사용하는게 아니라 상황에 따라 학습률을 adaptive하게 변화시키며 학습을 진행하는 것이죠.&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;이렇게 하면 기울기가 0이 되어서 변화량 자체는 작아질지언정 여기에 높은 학습률을 곱하여 변화량을 키우는 방식이라고 할 수 있습니다.&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 일반적인 딥러닝은 매우 고차원이어서 좋은 정답(꽤 높은 정확도를 가지는 지점)이 많아진다.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대의 딥러닝은 parameter도 수만 수백만 단위로 매우 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 매우 복잡하고 다양성있는 고차원의 학습이 진행되며, 이러한 경우에서는 우리가 이정도면 괜찮다고 할 만한 좋은 해들이 많아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에 Local Minima 지점에 도달해도 이 지점이 딥러닝의 오류를 엄청나게 높게 유지하고 그런 지점이 아니라는 것이죠.&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매우 대략적이고 디테일하고 깊은 내용들은 모두 생략한 채로 느낌만 알아보기 위해 위 내용들을 살펴보았습니다.&lt;/p&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;&quot;왜 Local Minima 문제에도 불구하고 딥러닝은 잘 작동할까? Local Minima 문제를 어떻게 해결하는 것일까?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;(1) 현실적인 딥러닝은 고차원의 손실 함수를 갖게 되어 Local Minima라고 해도 Global Mimina와 큰 차이가 없는 경우가 많다. (Local Minima에 빠지더라도 괜찮은 정확도를 보여준다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 고차원 손실 함수에서는 Local Minima보다 Saddle Point가 더 문제인데 Saddle Point 문제를 해결해주는 방법(e.g. Optimizer)이 있어서 Saddle Point도 해결할 수 있다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Deep Learning</category>
      <category>AI</category>
      <category>DeepLearning</category>
      <category>saddle point</category>
      <category>딥러닝</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/917</guid>
      <comments>https://cosmosproject.tistory.com/917#entry917comment</comments>
      <pubDate>Sun, 16 Nov 2025 12:57:14 +0900</pubDate>
    </item>
    <item>
      <title>온프레미스(On-Premise)란?</title>
      <link>https://cosmosproject.tistory.com/915</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IT 관련 내용을 접다하보면 온프레미스(On-Premise)라는 용어를 접할 때가 있습니다.&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;On-Premise가 란 무엇일까요?&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;p data-ke-size=&quot;size16&quot;&gt;그것들을 두 가지 큰 방식으로 나눠보자면 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 다른 기업에서 제공하는 클라우드 서비스를 이용하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자체적으로 전산실과 서버 장비를 갖춘 후 자체적인 서버를 운용하는 방법&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;여기서 2번을 온프레미스 방식이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;p data-ke-size=&quot;size16&quot;&gt;장점 1. 기업이 자체적으로 서버를 운용하는 것이기 때문에 외부 서비스에 문제가 생겨도 기업 자체의 서버에만 문제가 없다면 정상 작동이 가능하다는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 2. 장점 1과 더불어 자체 서버에 회사의 정보를 저장하기 때문에 인터넷, 외부의 클라우드 서비스에서 생기는 문제 등과 상관 없이 데이터 보안 수준이 증가한다는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 3. 회사에서 서버를 관리하기 때문에 상황에 맞게 서버를 용이하게 자체 기업에 맞게 커스터마이징하고 관리할 수 있다는 것&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;p data-ke-size=&quot;size16&quot;&gt;단점 1. 서버를 자체적으로 구성해야하기 때문에 서버를 유지/관리하기 위한 인원이 필요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 2. 서버 장비를 모두 확보해야하기에 초기 비용도 많다는 점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 3. 단점 1번과 2번에 의해 비용적인 측면에서 서버 관리 비용이 그대로 부담된다는 점.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점 4. 자연재해 등 다양한 상황에 따라 회사 서버에 손상이 가해질 경우 데이터의 유실로 직결될 수 있다는 점. (일반적으로는 회사 하나가 전세계적으로 서버를 다 구축해놔서 데이터를 분산하여 저장하긴 힘들기 때문이죠.)&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <category>Onpremise</category>
      <category>온프레미스</category>
      <author>CosmosProject</author>
      <guid isPermaLink="true">https://cosmosproject.tistory.com/915</guid>
      <comments>https://cosmosproject.tistory.com/915#entry915comment</comments>
      <pubDate>Thu, 13 Nov 2025 20:13:00 +0900</pubDate>
    </item>
  </channel>
</rss>