
FastAPI를 사용한 이유는 이름대로 빠르게 만들고 싶었습니다.
지금까지는 SpringBoot를 사용하여 개발했었는데, 해당 프레임워크를 벗어나 다른걸 해보고 싶기도 했고, Python을 좀 더 써보고 싶었습니다.
상당히 간단하니 추천드립니다.
환경은 Rocky Linux 입니다.
코드는 git에 있는것을 내려 받아 사용하니, python으로 실행할 수 있는 환경만 갖추어 주면 됩니다.
python: 3.12.11
# 폴더 생성
/home/backend
# 저장소 받기 및 이동
git clone https://github.com/본인-저장소/back.git
cd back
# 가상환경 생성
python3 -m venv venv
# venv 활성화
source venv/bin/activate
# 패키지 설치 - 제가 사용하는 패키지들입니다.
pip install 'fastapi[all]' sqlalchemy python-dotenv psycopg2-binary requests pytz confluent-kafka tzdata redis python-slugify pillow minio nanoid setuptools
쉽게 끄거나, 켜기 위해서 shell script를 하나 작성 했습니다.
실행할 때 저는 worker를 9개 사용합니다.
명령어: ./restart.sh start(stop, restart)
restart.sh
#!/bin/bash
. venv/bin/activate
DEFAULT_PORT=9000
ACTION=$1
PORT=${2:-$DEFAULT_PORT}
PID_FILE=uvicorn.pid
start_server() {
if [ -f $PID_FILE ]; then
echo "이미 실행 중입니다 (PID: $(cat $PID_FILE))"
exit 1
fi
echo "FastAPI 서버 실행 (포트 $PORT)"
nohup uvicorn main:app \
--workers 9 \
--host=0.0.0.0 \
--port=$PORT \
--no-access-log \
> log.out 2>&1 &
echo $! > $PID_FILE
}
stop_server() {
if [ ! -f $PID_FILE ]; then
echo "실행 중인 서버가 없습니다"
return
fi
PID=$(cat $PID_FILE)
echo "FastAPI 서버 종료 (PID: $PID)"
kill -TERM $PID
# graceful wait
for i in {1..10}; do
if ps -p $PID > /dev/null; then
sleep 1
else
break
fi
done
# still alive → force kill
if ps -p $PID > /dev/null; then
echo "강제 종료(SIGKILL)"
kill -9 $PID
fi
rm -f $PID_FILE
}
case "$ACTION" in
start) start_server ;;
stop) stop_server ;;
restart) stop_server && sleep 1 && start_server ;;
*) echo "사용법: $0 {start|stop|restart} [포트번호]" ;;
esac
deactivate
초기에는 React를 사용해서 개발했었습니다.
학생때 개발 시작을 React로 시작해서 애착이 가는 라이브러리입니다.
그런데, B2B 개발만 해보고 대국민 커뮤니티는 처음 해봐서 SEO, sitemap, analytics 등을 뒤늦게 깨닫고 NextJS 프레임워크로 전환을 했습니다.
자세하게 보는게 아닌 간단하게 보는거지만 lightspeed에서 체감이 컸습니다.
저는 ISR 방식을 사용해서 주기적으로 데이터를 갱신합니다.
SSG 기반으로 주기적으로 데이터를 재생성 하는데 이게 정말 맛있습니다.
사용자 입장에서 로딩 없이 바로 화면에 떠서 좋습니다.
코드는 git에 있는것을 내려 받아 사용하니, nodeJS로 실행할 수 있는 환경만 갖추어 주면 됩니다.
NodeJS: 24.11.1
# 폴더 생성 - a로 한 이유는 개발용 페이지를 b로 하나 더 뒀었습니다..
/home/frontend_a
# 저장소 받기 및 이동
git clone https://github.com/본인-저장소/front.git
cd front
# node 24 script 추가
curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -
# node 24 설치
sudo dnf install -y nodejs
# 버전 확인
node -v
npm -v
# npm install
npm install
FastAPI와 동일하게 shell script를 하나 작성 했습니다.
#!/bin/bash
# 설정
APP_DIR="/home/frontend_a/eft-library-front"
NODE="/usr/bin/npm"
KILL="/bin/kill"
NETSTAT="/usr/bin/netstat"
GREP="/usr/bin/grep"
AWK="/usr/bin/awk"
CUT="/usr/bin/cut"
SLEEP="/bin/sleep"
NOHUP="/usr/bin/nohup"
DEFAULT_PORT=3000
# 인자 처리
ACTION=$1
PORT=${2:-$DEFAULT_PORT}
# 포트 사용 중인 프로세스 종료 함수
stop_server() {
pid=$($NETSTAT -tnlp 2>/dev/null | $GREP ":$PORT\b" | $AWK '{print $7}' | $CUT -d'/' -f1)
if [ -n "$pid" ]; then
echo "포트 $PORT를 사용 중인 프로세스(PID: $pid)를 종료합니다."
$KILL -9 "$pid"
else
echo "포트 $PORT를 사용 중인 프로세스가 없습니다."
fi
$SLEEP 1
}
# 애플리케이션 빌드 및 시작 함수
start_server() {
echo "앱 디렉토리로 이동: $APP_DIR"
cd "$APP_DIR" || { echo "디렉토리 이동 실패"; exit 1; }
echo ".next 디렉토리 제거 중..."
rm -rf .next/
echo "Next.js 빌드 시작..."
$NODE run build --prefix "$APP_DIR"
echo "Next.js 서버를 포트 $PORT에서 시작합니다."
$NOHUP bash -c "PORT=$PORT $NODE run start --prefix $APP_DIR" > "$APP_DIR/log.out" 2>&1 &
}
# 실행 분기
case "$ACTION" in
start)
start_server
;;
stop)
stop_server
;;
restart)
stop_server
start_server
;;
*)
echo "사용법: $0 {start|stop|restart} [포트번호]"
exit 1
;;
esac