[FastAPI](https://fastapi.tiangolo.com/ko/)
공식 닥스가 한글로 깔끔하네
캡스톤에서 진행한 내용이다.
세팅
가상환경 : pyenv
타이핑 : mypy
파이썬 버전 : 3.10.13
포매터 : black
requirements.txt로 라이브러리 관리도 진행한다.
# 먼저 가상환경 세팅하기 - pyenv
블로그를 참조했다.
### 설치
`brew install pyenv`
설치 후 쉘 설정 파일을 수정해야한다. 나의 경우에는 ~/.zshrc
```
export PATH="$HOME/.pyenv/bin:$PATH"
# pyenv가 설치되어 있다면, 현재 쉘에 대한 pyenv 초기화 스크립트를 실행
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
# pyenv-virtualenv-init 명령어가 설치되어 있는지 확인, 만약 설치되어 있다면, 현재 쉘에 대한 pyenv-virtualenv 초기화 스크립트를 실행
if command -v pyenv-virtualenv-init 1>/dev/null 2>&1; then
eval "$(pyenv virtualenv-init -)"
fi
```
이 코드를 추가한다.
이후
`brew install pyenv-virtualenv`
그 뒤에 파이썬 버전을 설치한다.
`pyenv install <파이썬 버전>`
나의 경우에는 3.10.13이라서
`pyenv install 3.10.13`
설치 후 버전을 변경하는 방법들도 있따.
### 가상환경 생성 및 실행
`pyenv virtualenv <파이썬 버전> <가상환경 이름>`
생성된 가상환경 리스트는 다음 명령어로 확인할 수 있다.
`pyenv virtualenvs`
그리고 실행 커맨드는 다음과 같다.
`pyenv activate <가상환경 이름>`
가상환경 종료하기
`pyenv deactivate`
가상환경 삭제
`pyenv uninstall <가상환경 이름>`
가상환경에서 라이브러리 설치 등을 진행할 때에는 그냥 pip하면 된다.
# FastAPI 설치 및 실행
- 다큐먼트 잘 따라가면 된다.
- 대신에 vscode에서 debugger configuration을 진행할 것.
# Cloudformation Template Validation on aws CLI
## 먼저 AWS CLI를 설치해야하는데..
[[AWS] 📚 AWS CLI 설치 & 등록 방법 - 쉽고 빠르게 설명](https://inpa.tistory.com/entry/AWS-📚-AWS-CLI-설치-사용법-쉽고-빠르게)
이 글을 참고한다.
`aws configure`
이걸 실행하면 configure 세팅이 나온다.
글을 참고하여 파악한 key를 기반으로 세팅했다.
## Template Validation Settings
[An error occurred (AccessDenied) when calling the CreateStack operation:](https://stackoverflow.com/questions/57935589/an-error-occurred-accessdenied-when-calling-the-createstack-operation)
템플릿 검증 작업을 cli에서 진행하기 위해서는 일종의 허가? 승인? 작업이 필요하다.
aws 권한 부분에 들어가서 template validation으로 검색 후 모든 권한을 추가했다. ( 잘 몰라서.. )
이상한 에러가 나오면서 취소된 두 개의 권한을 제외하고 모두 추가되었다.
그랬더니 잘 실행이 됐다.
## Template Validation
[템플릿 확인 - AWS CloudFormation](https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/using-cfn-validate-template.html)
위 닥스를 참고하여 커맨드를 작성했다.
# DB연결하기
배포는 이렇게 하나?
[4-14 PostgreSQL 데이터베이스 적용하기](https://wikidocs.net/177321)
그리고 퍼블릭 모드를 설정해야한다.
[[AWS] AWS Lightsail + PostgreSQL](https://yihoeyiho.tistory.com/39)
## 데이터베이스 연결
### 사용 라이브러리 : sqlalchemy
*alchemy는 연금술을 의미한다.
이는 파이썬에서 ORM(Object Relational Mapper)를 사용할 수 있게 해주는 SQL toolkit이다.
말 그대로, 객체(Object)와 관계(Relation)를 연결해주는 것이다.
데이터베이스의 데이터를 코드 상의 Object로 매핑한다고 생각하면 된다.
이 라이브러리를 통해서 다음 두 가지 작업을 진행해야한다.
- 모델 선언
- 엔진 생성
그러면 데이터베이스를 사용할 수 있다.
### 모델 선언
데이터베이스 스키마를 작성해주면 된다.
```python
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from .database import Base
from sqlalchemy.orm import relationship
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String, unique=True, index=True)
hashed_password = Column(String, default=True)
class PromptAns(Base):
__tablename__ = "promptAns"
id = Column(Integer, primary_key=True, autoincrement=True)
prompt = Column(String, index=True)
description = Column(String, index=True)
owner_id = Column(Integer, ForeignKey("users.id"))
class Test(Base):
__tablename__ = "test"
id = Column(Integer, primary_key=True, autoincrement=True)
test = Column(String, index=True)
```
문법과 라이브러리의 기능들을 참고해가면서 DB설계를 진행한다.
### 엔진 만들기
엔진은 새로운 데이터베이스를 만들고 연결하는 공장같은 곳이다.
여기서 DB 서버와 연결을 진행한다.
```python
# sqlalchemy database connection
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# load local .env
from dotenv import load_dotenv
import os
# get the base directory
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# load the .env file
load_dotenv(os.path.join(BASE_DIR, ".env"))
# get the database url
DB_URL = os.getenv("DB_URL")
# create the engine
engine = create_engine(DB_URL)
# create the session
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# create the base
Base = declarative_base()
```
DB_URL을 환경변수로 처리했는데 원본은 다음과 같다.
`DB_URL = "postgresql://postgres:postgres@localhost:5432/localtest”`
postgresql은 기본적으로 5432 포트를 사용한다고 한다.
DB는 여러 DBMS를 연결할 수 있다. 따라서 URL에 DBMS의 이름이 포함되어야 한다.
그리고 url은 다음과 같이 작성하면 된다.
“postgresql://{user_name}:{password}@localhost:5432/{database_name}”
이 url을 create_engine에 파라미터로 전달하면 DBMS서버와 연결이 된다.
그 다음은 세션을 만들어야 한다.
session은 엔진이 데이터베이스와 상호작용하도록 만들어주는 존재이다.
세션을 만든 뒤, 이를 사용하여 데이터베이스와 상호작용 할 수 있다.
## 의존성 주입
: 프로그램 디자인이 결합도를 느슨하게 되도록하고 의존관계 역전원칙(DIP)과 단일 책임 원칙(SRP)을 따르도록 클라이언트의 생성에 대한 의존성을 클라이언트의 행위로부터 분리하는 것.
즉, 우리는 데이터베이스를 직접 사용하지 않고, context manager pattern으로 만들어 사용할 것이다.
*context manage pattern : 원하는 타이밍에 정확하게 리소스를 할당하고 제공하는 역할을 하는 것
```python
from typing import Annotated
from sqlalchemy.orm import Session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
db_dependency = Annotated[Session, Depends(get_db)]
```
`get_db` 함수와 `db_dependency`는 FastAPI의 의존성 주입 시스템을 활용하여 데이터베이스 세션을 관리하는 데 사용된다.
`get_db` 함수는 새로운 데이터베이스 세션을 생성하고, 요청이 끝난 후에는 세션을 닫는다. 이는 context manager 패턴을 사용하여 구현되어 있다. 이 패턴을 사용하면, 세션을 수동으로 관리하는 것보다 안전하게 세션을 관리할 수 있다.
예를 들어, 예외가 발생하더라도 세션은 항상 닫히게 된다.
`db_dependency`는 `get_db` 함수를 FastAPI의 의존성으로 감싸서 정의한다. 이 의존성은 FastAPI 라우트에서 사용될 때마다 `get_db` 함수를 호출하여 새로운 데이터베이스 세션을 제공한다. 이를 통해, 각 요청은 독립적인 데이터베이스 세션을 사용하게 된다.
따라서, 이 코드는 각 요청이 독립적인 데이터베이스 세션을 사용하도록 하고, 세션의 생명 주기를 안전하게 관리하는 데 필요하다. 이는 데이터베이스 연결을 효율적으로 사용하고, 데이터베이스 오류를 방지하는 데 도움이 된다.
## API 개발
session만을 사용해서 CRUD를 개발할 수 있지만, 이는 다소 불안정한 구조를 갖는다.
데이터베이스에 저장되는 값들의 Type에 대한 유효성 검사 등의 조치가 추가로 필요하다.
### 사용 라이브러리 : pydantic
이는 파이썬의 데이터 유효성 검증 라이브러리이다.
데이터 타입을 명시하는 클래스를 만들어서 유효성 검증 기능을 강화할 수 있다.
```python
from pydantic import BaseModel
class Test(BaseModel):
test: str
class UserBase(BaseModel):
username: str
hashed_password: str
class PromptAnsBase(BaseModel):
prompt: str
description: str
owner_id: UserBase
```
이렇게 Object 내부 속성들에 대한 type들을 작성한 클래스를 정의해놓은 뒤, API를 개발할 때 다음과 같이 사용할 수 있다.
```python
@app.post("/test")
async def create_test(test: Test, db: db_dependency):
db_test = models.Test(test=test.test)
# print(test.test)
db.add(db_test)
db.commit()
db.refresh(db_test)
```
그러면 데이터의 유효성 검증을 진행할 수 있다.
'Application > Projucts' 카테고리의 다른 글
github wiki에 api 명세 작성하기 (0) | 2024.05.29 |
---|---|
캡스톤 프로젝트 중 학습 내용 정리 (0) | 2024.05.23 |
Postman 사용방법 (0) | 2024.03.13 |
Git Flow 전략에 맞는 개발방법 (0) | 2024.03.06 |
설 덕담은 여기서 (0) | 2022.01.09 |