본문 바로가기
REFLEX 튜토리얼

pynecone 프로젝트의 구성파일 및 구조

by 일코 2023. 1. 18.
django를 배우기 시작한지는 7년 정도 된 것 같습니다.
당시에는 데이터분석이나 머신러닝보다는
바로 django 때문에 파이썬을 배우는 사람들이 많았던 분위기였습니다.
저도 다른 언어나 프레임워크를 배울 때와 다르게
django를 배울 때에는 시작부터 어딘지 마음이 든든했습니다.
"나를 위한 모든 것이 이미 준비된" 느낌이었으니까요.
django는 프로젝트 구조가 다소 복잡하지만, 어느 정도의 진입장벽만 넘고 나면
배우면 배울수록 "개발한다"기보다는 "발견한다"는 짜릿한 느낌이 있었습니다.

하지만 자랑이라도 하듯 600쪽이 넘는 방대한 분량의 공식문서는
엄청난 기능들과 편의성에도 불구하고, 아이러니하게 "부담"으로 다가왔습니다.
7년이 지난 지금도 입문 수준을 벗어나지 못했습니다.
그리고 정반대의 이유로 flask나 fastapi에도 그다지 깊은 정을 붙이지 못했고요.
django에 비하면 구조나 코드는 몹시 단순했지만
그만큼 준비된 게 없다는 백지같은 느낌 때문에
불안한 마음이 올라왔습니다.

그런데 이놈의 pynecone은 django나 flask와 동일선상에서 비교하기는 어딘가 애매한 녀석입니다.
스스로를 battery-included full-stack web framework라고 칭합니다.
그런데 뭔가 허전하고 너무 간단해 보이는 것 같습니다.
그러면서도 뭔가 필요한 기능은 다 들어있는 것 같은 든든한 기분이 든단 말이죠.
짧은 공식문서를 여러 번 읽다 보니 그 이유를 알 것 같기도 합니다.

아, 고작 "이 만큼"이 pynecone이 제공하는 전부구나?


허전한 느낌의 이유를 알았습니다.  한계도 명확하게 느껴졌습니다.
(pynecone의 한계가 아니라, 제 역량의 한계)
제 역량 안에서 pynecone으로 할 수 있는 일과 할 수 없는 일의 구분선이 뚜렷합니다.
그래도 전혀 아쉽지 않습니다. 애초에 "그 이상"을 바라지는 않으니까요.
파이썬 초보(?)인 과학자나 데이터분석가,
혹은 저처럼 취미로 파이썬을 배운 사람들도
마치 streamlit처럼 빠르게 웹앱을 작성하고, 간편하게 배포할 수 있는
정말 본연의 기능에 충실하면서 군더더기 하나 없는 프레임워크!
문득 이런 생각이 들었습니다.
알면 알수록 pynecone이 참 좋습니다.

- 2023. 1. 18. 새벽감성에 흠뻑 취해 쓴 글, 지우기 아까워서 남겨 둠

 

pc init을 실행하면 무슨 일이 일어나는가?

이번 포스팅에서는 pc init을 통해 생성되는 프로젝트 구조에 대해서 가볍게 다뤄보겠습니다.
(어려운 걸 가볍게 설명하겠다는 게 아니라, 정말 가벼워서 그렇습니다.)

hello라는 프로젝트 폴더를 생성하고, 터미널에서 pc.init을 실행하면
아래와 같은 구조가 자동으로 만들어집니다.

hello ①
├── .web ②
├── assets ③
├── hello 
│      ├── __init__.py 
│      └── hello.py
└── pcconfig.py ⑤

웹앱을 만들기 위한 프로젝트 구조 치고는 엄청 간단해 보입니다.

각 요소를 하나씩 살펴봅시다.

hello: 프로젝트 루트 폴더

우리가 직접 생성한 프로젝트 폴더입니다.
재미있는 것은 프로젝트 폴더명이 곧 앱 이름의 기본값이 된다는 점입니다.

가급적 숫자로 시작하는 프로젝트명은 사용하지 말기를 바랍니다.
프로젝트 파일을 임포트하는 경우 오류가 발생할 수 있기 때문입니다.
(프로젝트명이 숫자로 시작하더라도 서버 실행시 오류가 나거나 하지는 않습니다.)

.web: 컴파일된 js파일 등이 저장되는 폴더

프로젝트파일에서 작성된 코드 중 프론트엔드 파트는 NextJS 앱으로 컴파일되어
동일한 이름의 js파일로 저장됩니다.
.web 폴더는 컴파일된 자바스크립트 파일들과, 이밖에도 node.js 관련모듈 등이 저장되는 곳입니다.
대부분 자바스크립트 파일로 구성되어 있으며, 웹팩이나 설정관련 json, favicon 및
각종 node.js 모듈이 전부 저장되어 있습니다.

자바스크립트 문법이나 컴파일 관련해서 오류가 발생하는 경우
이 폴더 하위에 생성된 자바스크립트 파일을 열어보면
오류의 구체적인 원인을 확인할 수 있습니다.
이 정보를 통해 디버깅 시에 참고할 수 있겠지요.
하지만 이렇게 생성된 js파일들을 직접 수정하는 것은
아무 의미가 없습니다.
pc run을 통해 서버를 구동하는 시점에
모든 js파일들이 다시 컴파일되기 때문입니다.

assets: 정적파일(static files) 저장소

이미지나 동영상, favicon 및 첨부파일 등 정적파일을 저장하는 곳입니다.
django의 경우에는 관례적으로 static 이라는 폴더이름을 사용하는데,
파인콘의 assets 폴더가 이와 동일한 역할을 맡고 있습니다.
assets 내부의 파일을 사용하는 방법은, 이후 예제에서 차근차근 상세히 다루겠습니다.

예를 들어 이미지파일을 삽입하려면 pc.image(src="image.png") 방식으로
컴포넌트를 만들어 쓰시면 됩니다.
이 때 image.png 파일은 assets 폴더 안에 있어야 합니다.

참고로 pc init 초기화시에 기본 favicon.ico가 복사됩니다.
솔방울을 형상화한 파인콘의 로고입니다.

hello/hello/hello.py: 앱 폴더 및 앱 파일

터미널에서 pc init을 실행하면 프로젝트 폴더명(hello)과 동일한 앱 폴더(hello)가 생성되고,
앱폴더를 파이썬패키지로 인식하기 위한 __init__.py 파일이 기본적으로 생성됩니다.

근데 대부분의 경우(?) __init__.py 없이도 앱은 잘 돌아갑니다.

마지막으로, 앱 폴더 안에 프로젝트 폴더명과 동일한 이름의 파이썬 파일(hello.py)이 생성됩니다.
이 파일이 우리 프로젝트의 기본 앱입니다.
대부분의 경우 이 파일 하나에만 코드를 추가하면 앱이 완성됩니다.
한마디로 우리 프로젝트의 주인공 같은 존재입니다.

 

pcconfig.py: 프로젝트 설정파일

마지막으로 설명드릴 파일은 pcconfig.py입니다.
pcconfig.py의 내용은 아래와 같습니다.(윈도우 OS 기준)

import pynecone as pc


config = pc.Config(
    app_name="hello",
    db_url="sqlite:///pynecone.db",
    env=pc.Env.DEV,
)

제일 윗줄부터 앱 이름, 데이터베이스(sqlite), 실행환경 (DEV, PROD) 등의 설정을 할 수 있는 라인들입니다.
지난 포스팅에서도 언급한 바 있지만,
pcconfig.py는 django의 settings.py에 비하면 너무너무너무 심플합니다.
심지어 여기에 추가할 수 있는 내용도 그리 많지 않아 보입니다.
참고로 가상환경폴더\Lib\site-packages\pynecone\config.py 는 이렇게 작성되어 있습니다.

pc.Config(
    *,
    app_name: str,
    username: Optional[str] = None,
    port: str = '3000',
    api_url: str = 'http://localhost:8000',
    db_url: str = 'sqlite:///pynecone.db',
    redis_url: Optional[str] = None,
    deploy_url: Optional[str] = None,
    env: pynecone.constants.Env = <Env.DEV: 'dev'>,
    bun_path: str = '$HOME/.bun/bin/bun',
    frontend_packages: List[str] = [],
) -> None

pcconfig에 대한 상세한 내용은 공식문서가 업데이트되면(?) 다시 확인해봐야겠습니다.

마지막으로 공식문서에는 pcconfig.py 파일에 한 줄이 더 들어가 있는데,
바로 최근 핫한 자바스크립트 런타임인 bun을 js라이브러리 관리 툴로 사용할 수 있는 라인입니다.(6번라인)

import pynecone as pc


config = pc.Config(
    app_name="hello",
    bun_path="$HOME/.bun/bin/bun",  <--
    db_url="sqlite:///pynecone.db",
    env=pc.Env.DEV,
)

bun은 node나 deno와 같은 js런타임으로,
아직은 윈도우OS에서는 지원되지 않으며, wsl에서는 설치 및 실행가능합니다.

출처 : https://bun.sh

파인콘을 다룰 때 직접 bun을 다룰 일은 많지 않지만,
대표적으로는 리액트 컴포넌트를 직접 파인콘에서 컴포넌트(클래스)로 활용하고자 할 때 사용됩니다.

윈도우OS의 경우 bun 대신 간단히 npm install을 통해서 리액트 라이브러리를 설치할 수 있습니다...
파인콘 공식문서에서 "가장 파워풀한 기능"이라고 자랑하는 바로 그 "리액트 래핑"입니다.
기본제공되는 Chakra-ui 컴포넌트 외에 리액트 생태계의 아름답고 강력한 컴포넌트들을
너무너무 손쉽게 설치하고, 래핑해서 파인콘에서 써먹을 수 있기 때문입니다.

그럼 이번 포스팅은 여기서 마치겠습니다.

다음 포스팅에서는 다시 간단한 튜토리얼을..

다음 포스팅에서는 react의 helloworld인 Todo 앱을 pynecone으로 구현해보겠습니다.

수고하셨습니다.


다음 포스팅

 

pynecone으로 Todo앱을 만들어봅시다.

 

martinii.fun

 


국내 유일의 파이썬+한컴오피스 자동화 입문강의

 

움짤로 빠르게 배우는 파이썬-아래아한글 자동화 레시피 - 인프런 | 강의

파이썬으로 아래아한글을 다루는 짧은 예제코드들을 소개하고, 중간중간의 결과를 GIF로 보여드립니다. 동영상 강의가 아니지만 오히려 빠르게 배울 수 있고, 따라하기도 쉽습니다., - 강의 소개

www.inflearn.com

 

댓글