<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dev on Jiho Kim</title><link>https://blog.wlgh7407.com/posts/dev/</link><description>Recent content in Dev on Jiho Kim</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Jiho Kim</copyright><lastBuildDate>Fri, 17 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.wlgh7407.com/posts/dev/index.xml" rel="self" type="application/rss+xml"/><item><title>uv로 파이썬 관리하기</title><link>https://blog.wlgh7407.com/posts/dev/260417_dev_uv%EB%A1%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.wlgh7407.com/posts/dev/260417_dev_uv%EB%A1%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0/</guid><description>&lt;h2 class="relative group"&gt;📝 상세 정리
 &lt;div id="-상세-정리" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%83%81%ec%84%b8-%ec%a0%95%eb%a6%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;가상환경은 왜 필요할까?&lt;/li&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260417194153.png"
 &gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;위와같은 상황을 방지하자.&lt;/li&gt;
&lt;li&gt;버전 안맞는거만큼 화나는게 없다.&lt;/li&gt;
&lt;li&gt;그러면, 버전을 하나하나 다 적은 문서를 주면, 괜찮지 않을까? 맞춰서 하나하나 깔면 되잖아!
&lt;ul&gt;
&lt;li&gt;물론 그래도 된다!&lt;/li&gt;
&lt;li&gt;근데 깔아야할 패키지가 수백 수천개라면? 에반거같은데..
&lt;ul&gt;
&lt;li&gt;그래서 &lt;code&gt;requirements.txt&lt;/code&gt;와 파이썬이 기존에 제공하던 가상환경(venv) 로 다음과 같이 수행할 수 있게 됐다!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그러면 모두가 행복해질 수 있을 줄 알았으나..
&lt;ul&gt;
&lt;li&gt;같은 프로젝트 내에서 라이브러리 패키지 $A, B, C$가 있다고 해보자.
&lt;ul&gt;
&lt;li&gt;$B$는 $A$의 버전이 2.0 이하임을 요구하고,&lt;/li&gt;
&lt;li&gt;$C$는 $A$의 버전이 3.0 이상임을 요구할 수 있겠다.&lt;/li&gt;
&lt;li&gt;이때 B를 깔고 C를 깔면 pip는 이걸 그대로 덮어버리면서, 나중에 B가 터질것을 예측하지 못한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또한 &lt;code&gt;requiremets.txt&lt;/code&gt;는 우리가 직접 깐 패키지에만 의존성을 부여하고, 그 패키지가 의존하는 하위 패키지들에는 의존성을 관리하지 않는다.
&lt;ul&gt;
&lt;li&gt;밑에있는걸 쓰다가 터질 수도 있다!!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이런 문제점들을 해결하기 위해, &lt;code&gt;Poetry&lt;/code&gt;가 나왔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Poetry&lt;/code&gt;는 위의 문제들을 모두 해결했다!
&lt;ul&gt;
&lt;li&gt;여러 패키지간의 의존성이 겹치는 문제를 백트래킹을 이용한 &lt;code&gt;DEPENDENCY RESOLVER&lt;/code&gt;로 미리미리 잡아주고&lt;/li&gt;
&lt;li&gt;하위 패키지들에도 버전을 관리해서 &lt;code&gt;poetry.lock&lt;/code&gt;으로 작성해두고&lt;/li&gt;
&lt;li&gt;&lt;code&gt;venv, requriements.txt, setup.py&lt;/code&gt; 등 여러가지로 관리되던 설정 파일들도 통합했다.&lt;/li&gt;
&lt;li&gt;그런데&amp;hellip; 한번에 모든 기능을 넣은 탓에 너무 느려져버렸다&lt;/li&gt;
&lt;li&gt;사실 파이썬 버전 자체도 관리하지 못해서 &lt;code&gt;pyenv&lt;/code&gt;같은것도 따로 써야했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이런 상황에 2024년, &lt;code&gt;uv&lt;/code&gt;가 등장했다.
&lt;ul&gt;
&lt;li&gt;사실 이 이후로는 위에꺼 아무것도 모르고, 그냥 uv 하나만 알아도 된다.&lt;/li&gt;
&lt;li&gt;uv가 왜 그렇게 좋냐?
&lt;ul&gt;
&lt;li&gt;일단 개빠르다.
&lt;ul&gt;
&lt;li&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Image Description"
 src="https://blog.wlgh7407.com/images/Pasted%20image%2020260417202532.png"
 &gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;대 u v&lt;/li&gt;
&lt;li&gt;Rust로 작성된 툴이라서, pip보다 10~100배, poetry보다도 훨씬 빠르다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파이썬 버전을 포함해서 관리가 매우매우 쉽다.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;poetry&lt;/code&gt;의 장점을 모두 담은것은 물론, &lt;code&gt;pyenv&lt;/code&gt;로 진행하던 버전 관리또한 받아준다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pyenv, pip, poetry, venv&lt;/code&gt; 아무것도 필요 없어진것이다!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv python install 3.12&lt;/code&gt; 로 파이썬을 깔고&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv lock&lt;/code&gt;으로 의존성을 고정하고&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv run&lt;/code&gt;으로 가상환경 직접 활성화 없이 일회성으로 실행하고&lt;/li&gt;
&lt;li&gt;모든 기능이 추가되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;심지어 파이썬 3.12~13쯤부터, &lt;code&gt;pip install&lt;/code&gt;을 하려고하면 다음과 같은 오류 메세지를 본 사람이 분명 있을 것이다.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;error: externally-managed-environment&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;이는 시스템 전역에 파이썬 패키지를 설치할 수 없다는 오류이다.&lt;/li&gt;
&lt;li&gt;사실 뭐 break-system같은걸 해서 어거지로 설치할 수야 있다만.. 잘 되던걸 막은 이유가 분명 있지 않을까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;아무튼 이제 공식적으로 가상환경 격리를 권장하는 시대가 됐다.
&lt;ul&gt;
&lt;li&gt;이상황에 pip로 venv까지 하나하나 관리하고싶나?&lt;/li&gt;
&lt;li&gt;uv로 든든~하게 이주하고말지.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;헐, 근데 저는 &lt;code&gt;microsoft/markitdown&lt;/code&gt; 처럼 전역으로 쓰고싶은 파이썬 패키지 (글로벌 도구)가 있는데요? 이건 어쩔수없이 &lt;code&gt;pipx&lt;/code&gt;를 써야하지 않을까요?
&lt;ul&gt;
&lt;li&gt;하지만 개깡패 uv는 이것조차 다 잡으러 왔다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv tool&lt;/code&gt; 을 이용해 설치하면, 격리도 해주면서, 알아서 관리하면서, 사용할때는 뇌빼고 쓸 수 있게 uv를 안붙여도 바로바로 실행까지 된다.&lt;/li&gt;
&lt;li&gt;심지어 깔기도 싫고 일회용으로 쓰고싶으면 &lt;code&gt;uv tool run&lt;/code&gt;로도 된다는거 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;걍 대uv이다. 말이 안됨. 숭배를 햇&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;🛠️ 사용법
 &lt;div id="-사용법" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%82%ac%ec%9a%a9%eb%b2%95" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;위까지 쓰니까 힘이 빠져서 지금은 쓰기 귀찮다. 며칠 뒤에 보면 작성되어있지 않을까?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;🔗 참고 자료
 &lt;div id="-참고-자료" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://python-poetry.org/" target="_blank" rel="noreferrer"&gt;https://python-poetry.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.astral.sh/uv/" target="_blank" rel="noreferrer"&gt;https://docs.astral.sh/uv/&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;설마 자외선 이름 맞춰서 사이트 보라색인건가? 개밤티다.
&lt;ul&gt;
&lt;li&gt;내 블로그가 더 밤티라는 나쁜말은 ㄴ.ㄴ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>