Python/UI (Reflex, Streamlit)

[Python UI] Reflex, Streamlit 비교 및 선택

yubi5050 2023. 8. 5. 19:42

Reflex 란?

특징

  • 구 Pynecone -> 현 Reflex 로 이름 변경
  • 비동기 이벤트 기반의 실시간 애플리케이션 개발을 위한 프레임워크
  • 성능 측면에서 좋은 결과를 보여줄 수 있음 (고성능 비동기 웹 서버 Dazzler 가 내부적으로 사용됨)
  • 실시간 데이터 처리, 대시보드, 모니터링 및 제어 시스템 등의 애플리케이션에 적합
  • 커뮤니티와 문서화가 상대적으로 부족 (이슈 발생시 문제 발생시 해결에 오래걸릴 수 있음)
  • 내부적으로 FastAPI Backend와 FE는 Next.js 기반으로 동작함 (소켓으로 연결됨, Next.js는 React로 변환)
  • 에러 지점이 많을 수 있음 (Next.js에서 차용하는 라이브러리의 버전 업에 따른, deprecated 등)
  • docs , github, star 수 11.9k 개

 

 

Streamlit 란?

Streamlit 특징

  • 빠른 개발과 빠른 반응성(캐싱을 통한 수정시 바로 반영)에 중점을 둔 프레임워크 (Interaction 중심)
  • 성능적으로 대규모 데이터 처리나 고도의 병렬 처리를 위한 프레임워크는 아님
  • 인터렉티브나 프로토 타이핑, 다양한 시각화에 적합 
  • Streamlit  css 입히기가 어려움
  • docs , github, star 수 26.4k 개

 

주요 고려 사항

두개의 UI Framework 중 선택 하기전에, 기능에 대한 요구사항을 바탕으로 다양한 관점에서 비교해 보았다.

 

1. REST API 활용에 잘 어울리는지 (기본 제공되는 함수가 있는지)

  • 둘다 똑같이 Request, aiohttp 등 외부 라이브러리를 사용해서 구현 해야 함
  • Schema, Dto 에 대한 정의도 따로 외부 라이브러리 사용 필요
  • 결론 : Reflex = Streamlit 

 

2. CSS에 대한 자유도 (편의성)

  • Reflex : 내부적으로 CSS에 대한 직접적인 인자값 제공
  • Streamlit : 기본적으로 많이 구현되어 있는 컴포넌트 제공, 커스텀 어려움
  • 결론 : Reflex > Streamlit

 

3. 성능

  • 결론 : Reflex > Streamlit (But. 성능이 좋아야 된다는 요구사항은 없음)

 

4. 패키지 규모

  • Reflex : Node + Python (FastAPI) 등 Node가 추가적으로 필요.
  • Streamlit : 단일 라이브러리 (추가적인 패키지 요구사항 X)
  • 결론 : Streamlit > Reflex

 

5. 자료 데이터 활용 (Excel , CSV)

  • 결론 : Streamlit = Reflex

 

6. 페이지 분리 편의성

  • 해당 기준은 페이지별 구현이 쉬운지, 협업하기 좋은지
  • Reflex : 페이지별로 코드 구현 및 분리에 용이
  • Streamlit : 단일 페이지에 보다 적합 (메뉴바, 네비게이션 등으로 컴포넌트 그룹 단위의 수정은 가능)
  • 결론 : Reflex > Streamlit

 

7. 자료 및 문서

  • 결론 : Streamlit >> Reflex (월등한 Streamlit 압승)

 

최종 결론

대부분의 적합도는 Reflex가 적합해서 최종 Reflex로 구현했지만, (현재는 프로젝트 구현 완료)

생각보다 컴포넌트에서 event handler 의 자유도가 떨어지고, 

커스텀 하기에도 자료 및 문서의 부족이 너무 심해서 구현이 쉽진 않았던 것 같다. (심지어 pynecone에서 reflex로 바뀌어서, 자료가 더 없음)

 

개인적으로 다음 프로젝트를 진행 하게 된다면 Streamlit 으로 진행하지 않을 까 싶다. 

(물론 제일 좋은 건 FE 프레임워크를 따로 선택 하는 것이 좋다고 생각)