소개/소소한공부

FastAPI로 "Hello, World!" 만들고 서버 재시작해도 자동 실행되게 하기!

leeveoh 2025. 4. 11. 17:18
728x90

오늘 목표

  1. FastAPI 설치하고 Hello, World 예제 만들기
  2. 실행해서 작동 확인
  3. 서버 재부팅해도 자동 실행되도록 systemd 설정

FastAPI 프로젝트 만들기

1.1 작업 폴더 만들기

mkdir fastapi-app
cd fastapi-app

Tip: 나중에 관리 쉽게 하려면 한 폴더에 모아두는 게 좋아요!

1.2 가상환경 만들고 활성화하기 (선택이지만 강력 추천!)

python3 -m venv venv
source venv/bin/activate

가상환경을 쓰면 프로젝트마다 필요한 패키지를 따로 설치할 수 있어요. 안 쓰면 시스템 전체에 설치돼서 꼬일 수 있어요 😱

1.3 필요한 패키지 설치

pip install fastapi uvicorn
  • fastapi: 웹 프레임워크
  • uvicorn: FastAPI를 실행해주는 서버

1.4 main.py 만들기

# main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

이게 바로 FastAPI의 기본 구조! 경로(/)에 요청이 오면 메시지를 리턴해요.

FastAPI 실행해보기

실행 명령어

uvicorn main:app --host 0.0.0.0 --port 8000 --reload
  • main:app: main.py 파일에 있는 app 객체 실행
  • --reload: 코드 수정 시 자동 반영 (개발용)

브라우저에서 확인

  • 기본 페이지: http://서버IP:8000
    {"message": "Hello, World!"} 가 나오면 성공!

  • 자동 문서: http://서버IP:8000/docs
    Swagger UI도 자동으로 생겨요! (완전 멋짐)

서버 재부팅해도 자동 실행되게 하기 (systemd)

3.1 systemd 서비스 파일 만들기

sudo nano /etc/systemd/system/fastapi.service

아래 내용 붙여넣기 (경로는 본인 서버 기준으로 수정!)

[Unit]
Description=FastAPI application
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/fastapi-app
ExecStart=/home/ubuntu/fastapi-app/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000
Restart=always

[Install]
WantedBy=multi-user.target

User, WorkingDirectory, ExecStart는 본인 환경에 맞게 수정!
which uvicorn 으로 정확한 경로 확인 가능해요.

3.2 서비스 등록 & 실행

sudo systemctl daemon-reload
sudo systemctl enable fastapi
sudo systemctl start fastapi
  • enable: 서버 재부팅 시 자동 실행
  • start: 지금 바로 실행

3.3 서비스 상태 확인

sudo systemctl status fastapi

active (running) 이 나오면 성공!

보너스: 진짜 잘 되는지 테스트!

서버 재부팅

sudo reboot

재접속 후 확인

  • 브라우저에서 다시 접속: http://서버IP:8000 여전히 "Hello, World!" 가 나오면 완전 성공입니다!!

오늘 배운 것 요약

단계 내용
1 FastAPI 프로젝트 만들고 Hello, World 작성
2 uvicorn으로 실행하고 브라우저로 확인
3 systemd로 서버 부팅 시 자동 실행되게 설정

느낀 점

  • FastAPI는 생각보다 간단하면서도 엄청 강력하다!
  • systemd는 처음이라 헷갈렸지만, 한번 해보니 의외로 쉬움!
  • 다음에는 Docker로도 한번 실행해보고 싶다!