[Web] Pyodide에 대해서 알아보자!

2024. 1. 2. 16:18CS/기타

최근에 친한 동생이랑 웹 프로젝트를 시작했는데, 해당 프로젝트에서 파이썬 기술이 필요하기에 Pyodide를 활용하기로 했습니다. Pyodide란 파이썬을 웹 브라우저 단에서 돌려볼 수 있는 프로젝트인데, 이거에 대해서 한 번 정리해보고자 합니다.

Pyodide 란? 

Pyodide는 브라우저 상에서 파이썬 구동하는 프로젝트입니다. 좀 더 자세하게 말하자면, Pyodide는 CPython를 WASM(WebAssembly)가 읽을 수 있도록 하는 프로젝트인데 이를 통해서 Python 코드들을 브라우저나 Node.js 상에서 실행시킬 수 있도록 합니다.

 

Pyodide는 PyPI 상에 pure python wheel을 가진 어느 패키지든 지원하면서 C extension을 가진 패키지들도 다수 지원한다고 합니다. (예 : numpy, pandas, scipy, matplotlib, scikit-learn, regex, pyyaml, etc.) [지원 목록]

 

또한, Pyodide를 활용하면 Javascript랑 Python을 혼용해서 사용할 수가 있다고 합니다.

Pyodide의 핵심 기술 WebAssembly / Emscripten

Pyodide의 핵심 기술들로는 WebAssembly랑 Emscripten인데, 제가 잘 모르기에 각각 정리해서 설명해보도록 하겠습니다.

WebAssembly

WebAssembly는 바이너리 프로그램을 웹 브라우저에서 실행하기 위한 표준입니다. Javascript는 동적 타입 인터프리터 언어로 성능이 매우 중요한 프로그램은 웹 상에서 실행하기 어려운데, 이를 보안하기 위해 제안된 WebAssembly는 바이너리 파일로 컴파일 되면서 정적 타입을 사용해 성능이 중요한 프로그램도 웹 상에서 돌릴 수 있도록 합니다. 

Emscripten

WebAssembly를 위한 컴파일러 툴 체인으로 C / C++ 코드를 WebAssembly 코드로 바꾸는게 가능합니다. CPython이 C로 구현되어 있다는 점에서 CPython 인터프리터를 WebAssembly 모듈로 컴파일 한 다음에 브라우저 상에서 이를 실행시키는 방식이 Pyodide의 작동 원리입니다.

JavaScript - Python 간의 활용

Pyodide는 위에 언급한 것처럼 Javascript랑 Python을 병행해서 사용할 수 있습니다. 이게 어떻게 가능한거냐면 JavaScript에서 컴파일된 Python 인터프리터를 하나의 JavaScript의 오브젝트로 생각해서 다뤄집니다. 그래서 Pyodide는 JavaScript의 다른 오브젝트들과도 상호작용을 할 수 있게 JavaScript의 오브젝트와 Python의 오브젝트 상호간의 변환을 지원해줍니다.

 

예시로는, JavaScript Map과 Python dictionary, JavaScript Array와 Python List 가 있는데, 각각 서로 상호 대응이 가능한 클래스입니다. 이러한 클래스간의 변환을 유저가 직접 핸들링 하지 않아도 되는 FFI(Foreign Function Interface)를 Pyodide에서 지원한다고 합니다. 더불어 변환시에 가능한 메모리 누수도 Pyodide가 관리해준다고 합니다.

Pyodide의 장점

먼저, Python을 활용한 어플리케이션을 서버 없이 Client-only 웹 어플리케이션으로 배포가 가능합니다. 서버는 Storage 등의 operation이 필요할 때만 접근해서 처리하고, 나머지 Python 연산들은 전부 브라우저 단에서 처리가 가능합니다. 그래서 만약에 Storage operation이 불필요한 어플리케이션이면 그냥 Front-end만 설계만 해도 됩니다! 그렇다면 서버와의 통신이 필요 없으므로 속도 향상도 노릴 수 있고, 서버가 필요없으니 비용도 아낄 수가 있지요. (제가 진행하는 프로젝트는 이러한 이유때문에 Pyodide를 프로젝트에 활용하기로 결정했습니다.)

 

또한 아래와 같은 이점들도 있다고 합니다.

  • Usability(사용성) : 파이썬을 직접 설치할 필요없이 브라우저로 웹에 접속만 하면 됩니다.

  • Scalability(확장성) : Pyodide를 활용하면 서버에서는 정적 파일을 서빙만 하면 됩니다. 그래서 비용도 덜 들고 확장도 쉽게 가능합니다. 또한, 정적 파일은 브라우저에 캐싱되어 한 번 다운받으면 다시 다운로드 할 필요는 없지요.

  • Privacy(개인정보보호) : 브라우저 내에서만 연산이 이루어지니 유저가 사용한 데이터가 서버에 안 남습니다.

  • Transparency(투명성) : 브라우저 내에서만 연산이 이루어지니 유저가 모든 동작들을 검증할 수 있습니다.

Pyodide의 한계

Pyodide는 브라우저 상에서만 파이썬을 실행을 하기에 데스크톱에서 실행하는 것과 차이가 생깁니다. 이러한 점 때문에 Pyodide는 모든 파이썬 라이브러리들을 지원하지 않습니다. 예시로, Python 통신 라이브러리인 http, urllib, requests 등이나 threading, multiprocessing 같은 라이브러리도 지원하지 않습니다. 

 

또한, CPython 인터프리터의 용량도 크기 때문에 웹 페이지의 초기 로딩 속도는 느리기도 하며 데스크톱에서 Python을 실행하는 것보다는 성능이 떨어진다고 합니다.

 

그런데 CPython 팀에서 자체적으로 Python 인터프리터를 Emscripten으로 빌드한 Proof-of-Concept을 공개하는 등 Pyodide랑 CPython 팀이 장기적인 방향성에 대해서 함께 고민하면서 점차 지원하는 라이브러리 등도 늘려가고 있다고 하니 시간이 지나면 많이 해결되지 않을까 싶습니다.

Pyodide를 찍먹해볼 수 있는 사이트

 

아직 이 프로젝트를 저희 프로젝트에 적용해서 실질적으로 어떤지는 테스트해보지 않았지만, 백엔드를 Python 연산을 위해서만 필요했던 저희로써는 매우 유용한 것 같습니다. 나중에 기회가 된다면 한 번 테스트해보고 후기도 적어보도록 하겠습니다.

[참고] : 이 글들을 참고해서 작성했습니다. 좀 더 자세한 사항들은 여기서 확인할 수 있습니다.