Generative UI... in Python? โ Jeremiah Lowin, Prefect
ํ ์ค ํต์ฌ
MCP ์ฑ๊ณผ prefab์ ํตํด Python ๊ฐ๋ฐ์๊ฐ ๋ณต์กํ ํ๋ฐํธ์๋ ์์ด๋ MCP ์๋ฒ์ ์ง์ ์ฐ๊ฒฐ๋๋ ์ธํฐ๋ํฐ๋ธ UI๋ฅผ ๋ง๋ค ์ ์๊ณ , ๋์๊ฐ Python DSL์ ์คํธ๋ฆฌ๋ฐํด ์์ฑํ UI๊น์ง ๊ตฌํํ ์ ์๋ค.
์๊ฐ๋ณ ์์ฝ
-
0:00
MCP ์ฑ๊ณผ ์์ด์ ํธ ์ฐํ ๊ธฐ์กด MCP ๋๊ตฌ๋ ํญ์ ์์ด์ ํธ๋ฅผ ๊ฑฐ์ณ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋์ง๋ง, MCP ์ฑ์ HTML/CSS/JavaScript UI๋ฅผ ์ง์ ์ฌ์ฉ์์๊ฒ ๋ณด๋ด ์์ด์ ํธ๋ฅผ ์ฐํํ๋ค. ์ด ๋ฐฉ์์ ์์ฝ, ์ข์ ๋ณ๊ฒฝ, ์ผ์ ์ํธ์์ฉ์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ง์ ์กฐ์ํด์ผ ํ๋ ๊ฒฝํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ํฅํ ์์ด์ ํธ๊ฐ ์ฑ ์์ฒด์ ์ํธ์์ฉํ๋ ํ์ฅ๋ ์๊ณ ๋๋ค.
-
3:20
Python ์์ง๋์ด์๊ฒ UI๋ฅผ ๋ฐฐํฌํ๊ธฐ ๋์ ์ฌ์ฉ์๊ฐ ๋๋ถ๋ถ Python ์์ง๋์ด์ด๊ธฐ ๋๋ฌธ์ React๋ฅผ ๊ฐ์ ๋ก ์น๋ ๋ฐฉ์์ ํ์ค์ ์ด์ง ์์ผ๋ฉฐ, ๊ธฐ์กด ํ๋ฐํธ์๋ ์ํ๊ณ๋ฅผ Python์ ์ต์ง๋ก ํตํฉํ๋ ์ ๊ทผ๋ ํผํด์ผ ํ๋ค. ๋์ ์กฐ์ง ๋ด๋ถ์์ ์ ๋ณด ๊ณต์ ์ ์์ง์ ํ์ํ ์ค์ฉ์ ์ธ UI๋ฅผ ์ ๊ณตํ๋ ์ชฝ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ฌ์ ์ํ๋ค.
-
4:45
ํ, ํผ, ์ฐจํธ๋ก ๋ฌธ์ ๋ฅผ ์ขํ๊ธฐ UI ์๊ตฌ๋ฅผ ํ, ํผ, ์ฐจํธ ๊ฐ์ ์ ํ๋ ๋ฒ์ฃผ๋ก ์ขํ๋ฉด ๋ฒ์ฉ ํ๋ฐํธ์๋๋ฅผ ์๋ก ๋ง๋๋ ๋์ ๋ชฉ์ ์ ๋ง๋ scoped UI ํ๋ ์์ํฌ๋ฅผ ์ค๊ณํ ์ ์๋ค. prefab์ ์ด๋ฐ ๋ฒ์์์ Python๋ง์ผ๋ก UI๋ฅผ ์กฐํฉํ ์ ์๊ฒ ํด ์ฃผ๋ฉฐ, Hello world ์นด๋๋ ์ ๋ถ Python ์ฝ๋๋ก ์์ฑ๋๋ค.
-
5:43
ํ๋ฐํธ์๋๋ฅผ ๋ง๋๋ ๋์ ์กฐํฉํ๊ธฐ ํต์ฌ์ ํ๋ฐํธ์๋๋ฅผ ์ฒ์๋ถํฐ ๊ตฌ์ถํ๋ ๊ฒ์ด ์๋๋ผ ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํด ์์ฑํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ตฌ์กฐ๊ฐ ์ฝ๋์ ๋๋ฌ๋๊ณ , ์ฌ์ฉ์๋ ์์์ UI๊ฐ ์๋๋ผ ์ ๋๋ ํ๋ฉด์ ๋น ๋ฅด๊ฒ ์ ๊ณต๋ฐ์ ์ ์๋ค.
-
6:37
DSL๊ณผ ๊ทธ ์ฌ์ด์ JSON prefab์ context manager ๊ธฐ๋ฐ์ Python DSL๋ก UI๋ฅผ ์ ์ธ์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ , ์ด๋ฅผ JSON ํ๋กํ ์ฝ๋ก ์ง๋ ฌํํ ๋ค React ์ฑ์์ ๋ ๋๋งํ๋ค. ์ฌ๊ธฐ์ ํต์ฌ์ Python์ด ์๋๋ผ JSON์ด๋ผ๋ ์ค๊ฐ ํํ์ด๋ฉฐ, ์ด ๋๋ถ์ ์์ด์ ํธ์ ์ฌ๋์ด ๊ฐ์ UI ํํ์ ์์ฑยท์์ ยท์ ์กํ ์ ์๊ณ , reactive ๋ณ์๋ก ํด๋ผ์ด์ธํธ ์ํธ์์ฉ๋ ๊ตฌํ๋๋ค.
-
8:54
๋ฌธ์๋ฅผ ๋ฌธ์ํ ๋์ ์์์ ๋ ๋๋งํ๊ธฐ prefab์ ๋ฌธ์๋ prefab ์์ฒด๋ก ๋ ๋๋ง๋๋ฉฐ, ๋ฌธ์์ ์์ ์ฝ๋๋ ๋ผ์ด๋ธ๋ก ์คํ๋์ด UI๊ฐ ์ฆ์ ๋ณด์ธ๋ค. ์ฌ์ฉ์๋ ์์ ๋ฅผ ํ๋ ์ด๊ทธ๋ผ์ด๋๋ก ์ด์ด Python ์ฝ๋๋ฅผ ์ง์ ์์ ํ๊ณ ๊ฒฐ๊ณผ UI๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์๋ค.
-
10:13
์ธํฐ๋ํฐ๋ธ ๋๊ตฌ์ ํ ์์ ์ฐจํธ MCP ๋๊ตฌ๊ฐ Python dictionary ๋์ prefab ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ฉด FastMCP๊ฐ ์ด๋ฅผ ๊ฐ์งํด ์ธํฐ๋ํฐ๋ธ MCP ์ฑ์ผ๋ก ์ ํํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ฒ์ยทํํฐ๋งยท์ ๋ ฌยทํ์ด์ง๋ค์ด์ ์ด ๊ฐ๋ฅํ ํ๋ฅผ ์ ๊ณตํ ์ ์๊ณ , ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ ์์ ํ์ด ์ฐจํธ๋ฅผ ๋ฐฐ์นํ๋ ๊ตฌ์ฑ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
-
12:56
์ ์ฒด ์ฑ๊ณผ ๋น์ผ ๋ณต๋ถ ๋ฌธ์ ์์ ํ ์ฑ ํํ์์๋ UI ์ง์ ์ ๊ณผ ๋ฐฑ์๋ ๋๊ตฌ๋ฅผ ํจ๊ป ์ ์ํด ํผ ์ ๋ ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ๊ฐ์ ์์ ์ผ๋ก ์ฐ๊ฒฐํ ์ ์๋ค. ํนํ ํ์ผ ์ ๋ก๋์ฒ๋ผ ์์ด์ ํธ๋ฅผ ๊ฑฐ์น๋ฉด ๋์ฉ๋ ํ ์คํธ๋ฅผ ๊ทธ๋๋ก ์ฌ์ ๋ ฅํ๊ฒ ๋๋ ๋นํจ์จ์ด ๋ฐ์ํ๋ฏ๋ก, MCP ์ฑ์ผ๋ก ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ง์ ์๋ฒ์ ๋ณด๋ด๋ ๊ตฌ์กฐ๊ฐ ํจ์ฌ ์ ๋ ดํ๊ณ ์์ ํ๋ค.
-
15:15
์์ฑํ UI์ wire ์์์ JSON๋ณด๋ค ์์ Python ์์ด์ ํธ๊ฐ UI ํ๋กํ ์ฝ์ ์ค์๊ฐ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ๋ฉด ๋ ๋๋ฌ๊ฐ ์ด๋ฅผ ์ฆ์ ํ๋ฉด์ผ๋ก ๋ฐ๊พธ๋ ์์ฑํ UI๊ฐ ๊ฐ๋ฅํ๋ค. ์ดํ ๋ฐ๊ฒฌ๋ ์ค์ํ ์ฌ์ค์ Python ํํ์ด JSON๋ณด๋ค ์ฝ 70% ์์ ํ ํฐ, ๋น์ฉ, ์ง์ฐ ์๊ฐ ์ธก๋ฉด์์ ๋ ํจ์จ์ ์ด๋ฏ๋ก, ์ง๊ธ์ JSON ๋์ Python์ ์ ์กํด ์๋๋ฐ์ค์์ ์คํํ ๋ค JSON์ผ๋ก ๋ณํํด ๋ ๋๋งํ๋ค.
์ค๋ฌด ์ธ์ฌ์ดํธ
- MCP ์ฑ์ ์์ด์ ํธ๋ฅผ ํตํ ๊ฐ์ ์๋ต๋ณด๋ค ์ฌ์ฉ์๊ฐ ์ง์ ์กฐ์ํ๋ ํ๋ฉด์ด ํ์ํ ์ ๋ฌด์ ํนํ ์ ํฉํ๋ฏ๋ก, ๋ด๋ถ ์ ๋ฌด ๋๊ตฌ์ ๋ฐ์ดํฐ ์ ๋ ฅ ํ๋ฉด๋ถํฐ ์ ์ฉํ๋ฉด ํจ๊ณผ๊ฐ ํฌ๋ค.
- UI ๋ฒ์๋ฅผ ํยทํผยท์ฐจํธ๋ก ์ ํํ๋ฉด Python ํ๋ ์ ์ง ๊ฐ๋ฅํ ์์ค์ DSL์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ด๋ ํต์ฌ์ ํ๋ฐํธ์๋ ๊ธฐ์ ์คํ์ด ์๋๋ผ ์ค๊ฐ ํํ๊ณผ ์ปดํฌ๋ํธ ์ค๊ณ๋ค.
- ํ์ผ ์ ๋ก๋๋ ์์ฑํ UI์ฒ๋ผ ์์ด์ ํธ๊ฐ ์ค๊ฐ์์ ๋ณต๋ถํ๊ฑฐ๋ ์ฌ์์ ํ๋ ๋น์ฉ์ด ํฐ ์์ ์, ์ฌ์ฉ์-์๋ฒ ์ง์ ๊ฒฝ๋ก์ ๋ ์์ ์ง๋ ฌํ ํํ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ๋ง์ผ๋ก๋ ํจ์จ์ด ํฌ๊ฒ ๊ฐ์ ๋๋ค.