plango 서비스를 만들면서 FastAPI의 전체적인 흐름을 한번 빠르게 잡는것의 필요성을 느끼게 되었다.
구글에 찾아보니 작은 게시판 만들기 프로젝트를 하며 FastAPI를 매우 잘 설명해주는 문서가 있었다. 나는 이문서를 얼른 열심히 공부하고 감을 잡으려고 한다.
아래는 문서를 보며 개념들을 요약해보았다. 이문서를 얼른 다 보고 plango 멋지게 만들어야지!
아래의 모든 글은
점프 투 FastAPI(박응용)의 내용을 정리한 내용입니다.
출처는 아래 입니다!
빠르게 작성할 수 있다
테스트 가능한 API 문서
API 문서가 자동으로 생성된다.
데이터베이스
SQLAlchemy를 사용하여 ORM을 사용할 수 있다.

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

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 최신 버전으로 설치하기

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

이번 프로젝트는 myapi라는 폴더에서 할 것이다!
myapi에서 myapi가상환경에 접근해 보자!

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

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



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


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


FastAPI 클래스로 생성한 app객체가 바로 FastAPI의 핵심 객체이다. 모든 동작은 이 객체로부터 비롯된다.
hello 함수에서는 딕셔너리를 리턴했지만 FastAPI는 이를 자동으로 json 형태의 응답으로 리턴한다.
FastAPI로 작성한 프로그램을 실행하기 위해서는 FastAPI 프로그램을 구동할 서버가 필요하다. 유비콘(Uvicorn)은 비동기 호출을 지원하는 파이썬용 웹 서버이다.
myapi 디렉터리에서 아래 명령어를 실행하자
uvicorn main:app --reload

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

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

도메인은 "질문", "답변", "사용자" 처럼 굵직한 요구사항 또는 문제 영역을 대표하는 말이다.
그리고 각 도메인은 API를 생성하기 위해서 다음과 같은 파일들이 필요하다.
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 명령으로 실행.
데이터베이스에 모델에 정의한 question과 answer라는 이름의 테이블이 생성된다. 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 세션 객체를 생성한 후에 db.close()를 수행하지 않으면 SQLAlchemy가 사용하는 컨넥션 풀에 db 세션이 반환되지 않아 문제가 생긴다.
for문과 같은 반복 구문을 적용할 수 있는 리스트와 같은 객체를 반복 가능(iterable) 객체라 한다. 반복 가능한 객체에는 리스트, 튜플, 딕셔너리, 집합등이 있다.
이터레이터는 next() 함수 호출 시 계속 그다음 값을 반환하는 객체이다. 반복 가능(iterable)하다고 해서 이터레이터는 아니다. 하지만, 반복 가능하다면 iter() 함수를 이용하여 이터레이터로 만들 수 있다.
제너레이터(generator)는 이터레이터를 생성해 주는 함수이다. 제너레이터 함수로 생성한 객체는 이터레이터와 마찬가지로 next() 함수 호출 시 그 값을 차례대로 얻을 수 있다. 이때 제너레이터에서는 차례대로 결과를 반환하고자 return 대신 yield 키워드를 사용한다.
위 코드에서의 흐름은 아래와 같다.
with Hello() as h: 를 만나면..
Hello() 객체가 생성되고,
그 객체의 __enter__() 메서드를 호출 한다.
__enter__()가 return self를 하면, 그 리턴된 값이 h에 할당 된다.
따라서 h.sayHello('obama')가 실행될 수 있는것 이다
블록이 끝나면 __exit__()가 호출된다.
아래의 글도 참고하자
with문은 객체의 Life Cycle을 설계할 수 있다.
이 개념을 이해 하기 위해서는 바로 위의 파이썬 with문을 이해하고 와야 된다!
우리가 직접
context manager를 만들 수 있다.
.__enter__()와.__exit__()메서드를 구현하는 방법과contextlib.contextmanager()함수 데코레이터를 사용하는 방법이다
프로그램 실행 중에 변수의 타입을 동적으로 바꿀 수 있으므로 파이썬을 동적 프로그래밍 언어라 한다.
자바는 한 번 변수에 타입을 지정하면 지정한 타입 외에 다른 타입은 사용할 수 없으므로 정적 프로그래밍 언어라 한다.

매개변수로 전달받은 함수를 호출하여 그 결과를 리턴한다.
Pydantic은 FastAPI의 입출력 스펙을 정의하고 그 값을 검증하기 위해 사용하는 라이브러리이다.
Pydantic은 API의 입출력 항목을 다음과 같이 정의하고 검증할수 있다.
스키마는 프로그래밍 세계에서 보통 데이터의 구조와 명세를 의미한다. 즉, 출력 스키마라고 하면 출력 항목이 몇 개인지, 제약 조건은 어떤한 것이 있는지 등을 기술하는 것을 말한다.
각각의 화면에 다음과 같은 URL 규칙을 지정할 것이다.

해당 URL을 호출하면 그에 매핑되는 svelte 파일이 화면을 렌더링하도록 설계할 것이다. 예를 들어 / 에 해당되는 주소가 요청되면 Home.svelte 파일이 동작하여 화면을 생성해야 한다.
use:link 속성을 사용한 경우는 항상 /# 문자가 선행되도록 경로가 만들어진다. 웹 페이지에서 어떤 경로가 /#으로 시작하면 브라우저는 이 경로를 하나의 페이지로 인식한다.
이러한 구분은 다음의 규칙을 따른다.


출력은 response_model 을 사용하는 대신 status_code=status.HTTP_204_NO_CONTENT 를 사용했다. 이렇게 리턴할 응답이 없을 경우에는 응답코드 204 를 리턴하여 응답 없음을 나타낼 수 있다.
HTTP 상태 코드중
204 번호는 응답 결과가 없음을 의미한다.(No content)

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


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