[점프 투 FastAPI] FastAPI 시작하기1

seongmin0302·2025년 4월 15일

plango 프로젝트

목록 보기
4/10

plango 서비스를 만들면서 FastAPI의 전체적인 흐름을 한번 빠르게 잡는것의 필요성을 느끼게 되었다.

구글에 찾아보니 작은 게시판 만들기 프로젝트를 하며 FastAPI를 매우 잘 설명해주는 문서가 있었다. 나는 이문서를 얼른 열심히 공부하고 감을 잡으려고 한다.

아래는 문서를 보며 개념들을 요약해보았다. 이문서를 얼른 다 보고 plango 멋지게 만들어야지!

아래의 모든 글은 점프 투 FastAPI(박응용)의 내용을 정리한 내용입니다.
출처는 아래 입니다!


FastAPI란?

빠르게 작성할 수 있다

테스트 가능한 API 문서

API 문서가 자동으로 생성된다.

데이터베이스

SQLAlchemy를 사용하여 ORM을 사용할 수 있다.

파이썬 설치하기

FastAPI 개발 환경 준비하기

가상 환경 디렉터리 생성하기

파이썬 가상 환경은 파이썬 프로젝트를 진행할 때 독립된 환경을 만들어 주는 고마운 도구다.

venvs 디렉터리는 파이썬 가상 환경의 루트 디렉터리로 사용할 것이다. 만약 또 다른 가상 환경을 추가하고 싶다면 이 디렉터리 아래에 설치하면 된다.


가상 환경 만들기

파이썬 가상 환경을 만들어 주는 다음 명령어를 입력해 실행하자.

명령을 잘 수행했다면 C:\venvs 디렉터리 아래에 myapi라는 디렉터리가 생성되었을 것이다.

가상 환경에 진입하기

가상 환경에 진입하려면 우리가 생성한 myapi 가상 환경에 있는 Scripts 디렉터리의 activate라는 명령을 수행해야 한다.

C:\venvs> cd C:\venvs\myapi\Scripts
C:\venvs\myapi\Scripts> activate
(myapi) C:\venvs\myapi\Scripts>

C:\ 왼쪽에 (myapi)라는 프롬프트를 확인할 수 있다. 현재 어떤 가상 환경에 진입한 상태인지 알 수 있다.

가상 환경에서 벗어나기
현재 진입한 가상 환경에서 벗어나려면 deactivate라는 명령을 실행하면 된다. 이 명령은 어느 위치에서 실행해도 상관없다.


가상 환경에서 FastAPI 설치하기

pip은 파이썬 라이브러리를 설치하고 관리해 주는 파이썬 도구다.

pip 최신 버전으로 설치하기

FastAPI 프로젝트 생성하기

나는 미리 C:아래 fastapi_study 라는 폴더를 미리 만들어 놓았다!
또한 C:아래 fastapi_study 아래 myapi라는 폴더도 미리 만들어 놓았다!

이번 프로젝트는 myapi라는 폴더에서 할 것이다!

myapi에서 myapi가상환경에 접근해 보자!

cd C:\fastapi_study\myapi
C:\venvs\myapi\scripts\activate

VSC인터프리터 설정하기

지금은 가상 환경을 사용하므로 파이썬 인터프리터 위치를 가상 환경위치로 해줘야 된다!

CTRL + SHIFT + P




이제 C:\venvs\myapi\Scripts\python.exe를 클릭하면 된다!

Svelte 서버 실행하기(프론트엔드 서버 실행하기)

나는 vsc에서 프론트와 벡엔드를 모두 진행하기로 결정했다!
따라서 VSCode에서 터미널을 열고
우선 frontend 폴더로 이동한 다음
npm run dev 명령을 실행해보자.

성공


Hello API 만들기

FastAPI 클래스로 생성한 app객체가 바로 FastAPI의 핵심 객체이다. 모든 동작은 이 객체로부터 비롯된다.

hello 함수에서는 딕셔너리를 리턴했지만 FastAPI는 이를 자동으로 json 형태의 응답으로 리턴한다.

유비콘(Uvicorn)

FastAPI로 작성한 프로그램을 실행하기 위해서는 FastAPI 프로그램을 구동할 서버가 필요하다. 유비콘(Uvicorn)은 비동기 호출을 지원하는 파이썬용 웹 서버이다.

FastAPI 서버를 실행하기 (백엔드 서버 실행하기)

myapi 디렉터리에서 아래 명령어를 실행하자

uvicorn main:app --reload

main:app에서

  • main은 main.py 파일을 의미하고
  • app은 main.py의 app 객체를 의미한다.
  • --reload 옵션은 프로그램이 변경되면 서버 재시작 없이 그 내용을 반영하라는 의미이다.

API 테스트하기

FastAPI가 실행되면 FastAPI로 작성한 API는 /docs URL을 호출하여 테스트해 볼 수 있다. API를 테스트하는 가장 간단한 방법은 FastAPI의 docs 문서를 사용하는 것이다.


FastAPI 프로젝트 구조

앞으로 만들 프로젝트의 전체 구조는 다음과 같다.

도메인

도메인은 "질문", "답변", "사용자" 처럼 굵직한 요구사항 또는 문제 영역을 대표하는 말이다.

그리고 각 도메인은 API를 생성하기 위해서 다음과 같은 파일들이 필요하다.

  • 라우터 파일
  • 데이터베이스 처리 파일
  • 입출력 관리 파일

alembic

alembic은 SQLAlchemy로 작성한 모델을 기반으로 데이터베이스를 쉽게 관리할 수 있게 도와주는 도구이다. 예를들어 models.py 파일에 작성한 모델을 이용하여 테이블을 생성하고 변경할수 있다.

migrations 디렉터리는 alembic 도구를 사용할 때 생성되는 리비전 파일들을 저장하는 용도로 사용되고
alembic.ini 파일은 alembic의 환경설정 파일이다.

alembic을 이용하여 테이블을 생성 또는 변경할 때마다 작업 파일이 생성되는데 이 작업 파일을 리비전 파일이라고 한다.

리비전 파일

생성하기

alembic revision --autogenerate

그러면 migrations/versions 디렉터리에 fed28bf52b05_.py와 같은 리비전 파일이 생성된다.

실행하기

alembic revision --autogenerate

alembic revision --autogenerate 명령으로 만들어진 리비전 파일을 alembic upgrade head 명령으로 실행.

데이터베이스에 모델에 정의한 questionanswer라는 이름의 테이블이 생성된다. projects/myapi 디렉터리에 myapi.db 파일이 생성되었을 것이다. myapi.db가 바로 SQLite 데이터베이스의 데이터 파일이다.

질문 저장 조회 수정 삭제하기

작성한 모델을 테스트하는 가장 좋은 방법은 파이썬 셸을 사용하는 것이다. 터미널에서 "python"이라고 입력하자.

질문 저장하기

from models import Question, Answer
from datetime import datetime
q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=datetime.now())

from database import SessionLocal
db = SessionLocal()
db.add(q)
db.commit()

q.id

조회하기

db.query(Question).all()
db.query(Question).filter(Question.id==1).all()
db.query(Question).get(1) # SQLAlchemy 2.0 이상: db.get(Question, 1)
db.query(Question).filter(Question.subject.like('%FastAPI%')).all()

데이터 수정하기

q = db.query(Question).get(2)   # db.get(Question, 2)
q.id
q.subject = 'FastAPI Model Question'
db.commit()

데이터를 변경한 후에는 반드시 커밋을 수행해야 데이터베이스에 반영된다.


데이터 삭제하기

>>> q = db.query(Question).get(1) # db.get(Question, 1)
>>> q.id
1
>>> db.delete(q)
>>> db.commit
>>> db.query(Question).all()

파이썬 셸을 종료

파이썬 셸에서 빠져 나오려면 <Ctrl+Z>를 누르고 를 입력한다. 또는 quit()를 입력한다.


라우팅

라우팅이란 FastAPI가 요청받은 URL을 해석하여 그에 맞는 함수를 실행하여 그 결과를 리턴하는 행위를 말한다.

db.close()

db.close() 함수는 사용한 세션을 컨넥션 풀에 반환하는 함수이다. (세션을 종료하는 것으로 착각하지 말자.)
db 세션 객체를 생성한 후에 db.close()를 수행하지 않으면 SQLAlchemy가 사용하는 컨넥션 풀에 db 세션이 반환되지 않아 문제가 생긴다.

반복 가능(iterable) 객체

for문과 같은 반복 구문을 적용할 수 있는 리스트와 같은 객체를 반복 가능(iterable) 객체라 한다. 반복 가능한 객체에는 리스트, 튜플, 딕셔너리, 집합등이 있다.

이터레이터(iterator)

이터레이터는 next() 함수 호출 시 계속 그다음 값을 반환하는 객체이다. 반복 가능(iterable)하다고 해서 이터레이터는 아니다. 하지만, 반복 가능하다면 iter() 함수를 이용하여 이터레이터로 만들 수 있다.

제너레이터

제너레이터(generator)는 이터레이터를 생성해 주는 함수이다. 제너레이터 함수로 생성한 객체는 이터레이터와 마찬가지로 next() 함수 호출 시 그 값을 차례대로 얻을 수 있다. 이때 제너레이터에서는 차례대로 결과를 반환하고자 return 대신 yield 키워드를 사용한다.

파이썬 with문

위 코드에서의 흐름은 아래와 같다.

with Hello() as h: 를 만나면..

  • Hello() 객체가 생성되고,

  • 그 객체의 __enter__() 메서드를 호출 한다.

  • __enter__()return self를 하면, 그 리턴된 값이 h에 할당 된다.

  • 따라서 h.sayHello('obama')가 실행될 수 있는것 이다

  • 블록이 끝나면 __exit__()가 호출된다.


아래의 글도 참고하자

with문은 객체의 Life Cycle을 설계할 수 있다.

Context manager

이 개념을 이해 하기 위해서는 바로 위의 파이썬 with문을 이해하고 와야 된다!

우리가 직접 context manager를 만들 수 있다.

  • .__enter__().__exit__() 메서드를 구현하는 방법과
  • contextlib.contextmanager() 함수 데코레이터를 사용하는 방법이다

파이썬 타입 어노테이션

프로그램 실행 중에 변수의 타입을 동적으로 바꿀 수 있으므로 파이썬을 동적 프로그래밍 언어라 한다.
자바는 한 번 변수에 타입을 지정하면 지정한 타입 외에 다른 타입은 사용할 수 없으므로 정적 프로그래밍 언어라 한다.

FastAPI Depends

매개변수로 전달받은 함수를 호출하여 그 결과를 리턴한다.

Pydantic

Pydantic은 FastAPI의 입출력 스펙을 정의하고 그 값을 검증하기 위해 사용하는 라이브러리이다.

Pydantic은 API의 입출력 항목을 다음과 같이 정의하고 검증할수 있다.

  • 입출력 항목의 갯수와 타입을 설정
  • 입출력 항목의 필수값 체크
  • 입출력 항목의 데이터 검증

스키마

스키마는 프로그래밍 세계에서 보통 데이터의 구조와 명세를 의미한다. 즉, 출력 스키마라고 하면 출력 항목이 몇 개인지, 제약 조건은 어떤한 것이 있는지 등을 기술하는 것을 말한다.

URL주소 네이밍

각각의 화면에 다음과 같은 URL 규칙을 지정할 것이다.

해당 URL을 호출하면 그에 매핑되는 svelte 파일이 화면을 렌더링하도록 설계할 것이다. 예를 들어 / 에 해당되는 주소가 요청되면 Home.svelte 파일이 동작하여 화면을 생성해야 한다.

use:link 속성을 사용한 경우는 항상 /# 문자가 선행되도록 경로가 만들어진다. 웹 페이지에서 어떤 경로가 /#으로 시작하면 브라우저는 이 경로를 하나의 페이지로 인식한다.

입력 항목 처리 스키마

  • get이 아닌 다른 방식(post, put, delete)의 입력 값은 Pydantic 스키마로만 읽을 수 있다.
  • 반대로 get 방식의 입력 항목은 Pydantic 스키마로 읽을 수 없고 각각의 입력 항목을 라우터 함수의 매개변수로 읽어야 한다.

이러한 구분은 다음의 규칙을 따른다.

status_code

출력은 response_model 을 사용하는 대신 status_code=status.HTTP_204_NO_CONTENT 를 사용했다. 이렇게 리턴할 응답이 없을 경우에는 응답코드 204 를 리턴하여 응답 없음을 나타낼 수 있다.

HTTP 상태 코드중 204 번호 는 응답 결과가 없음을 의미한다. (No content)


필드 오류

만약 빈 값으로 답변 등록을 시도 한다면 다음과 같은 오류가 리턴될 것이다.


일반 오류

해당하는 질문이 없을 경우에는 HTTPException을 발생시킨다. 따라서 해당 질문이 존재하지 않을 경우 프론트엔드에는 다음과 같은 오류가 전달될 것이다.

profile
컴튜터공학과 재학중

0개의 댓글