
이번에 프로젝트3에 들어가며 새로운 프로젝트를 진행할 것이다. 프로젝트 1, 2 에서는 books 프로젝트를 진행하였으나 이번에는 Todo Table 을 만들 것이다.
데이터베이스와 인증, 허가, 패스워드 알고리즘을 메인으로 학습할 것이다.
우리의 애플리케이션이 Todo Table Models 을 만들것이다. 우리는 Todo를 통해 DB와 연결하여 기록을 저장하는 것을 배울 것이다.

v1 -> v2 변한 것
.dict() => .model_dump()
schema_extra => json_schema_extra
=None => id: Optional[int] = None
데이터베이스란 컴퓨터 시스템에 저장된 구조화된 정보의 정리된 콜렉션이다.
데이터는 쉽게 이용 가능하고, 수정, 통제, 조직이 가능하다.
데이터는 어떤 오브젝트와도 연결가능하다. 예를 들어 애플리케이션의 사용자는 이름, 나이, 이메일, 패스워드 등을 가질 것이다. 이러한 모든게 데이터이다.
데이터베이스는 이러한 데이터를 관리하게 해준다.
많은 데이터베이스는 데이터를 수정하고 쓰는데 SQL 을 사용한다.
DBMS(데이터베이스 관리 시스템)에는 많은 종류가 있다. 예를 들어 MySQL, SQLite, PostgreSQL 등이 있다.
SQL 이란, 시퀄 혹은 S-Q-L 로 부른다. SQL 은 관계형 데이터베이스를 다루는 표준 언어이다.
SQL 은 Create, Read, Update, Delete 의 CRUD 기능을 가진다.
TODO 프로젝트 진행을 위해 DB 가 필요하다. 우선 프로젝트 패키지를 생성해보자.
기존에 작업하던 프로젝트 폴더 내부에 TodoApp 패키지를 생성하였다.
파이썬에서 패키지(packages)란 관련 있는 모듈의 집합을 말한다. 패키지는 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해 준다. 파이썬에서 모듈은 하나의 . py 파일이다.
해당 패키지 내부에 database.py 파일을 생성한다.
로직 작성 전에 SQLAlchemy 를 설치해줘야한다.
SQLAlchemy 는 ORM 라이브러리로 데이터베이스 테이블을 Python 클래스로 매핑하여 객체 지향 프로그래밍 방식으로 데이터베이스를 조작할 수 있도록 도와준다
작업하는 패키지 폴더 내부로 이동하여 pip install sqlalchemy 를 입력한다.

그리고 SQLALCHEMY_DATABASE_URL 변수를 입력해야한다.
이 URL 은 fastAPI 의 데이터베이스 위치를 만드는 데 사용된다.

다음으로 필요한 건 엔진을 만드는 것이다.
데이터베이스 엔진을 사용하면 create_engine() 함수를 통해 데이터베이스을 연결하고, execute() 함수를 통해 SQL 쿼리를 실행하고 결과를 반환할 수 있다.
from sqlalchemy import create_engine
이떄 다른 요청에서 같은 연결 공유 시 발생하는 문제 방지를 위해 check_same_thread 사용
# 다른 종류의 요청에 대해 같은 연결을 공유할 때 발생하는 문제 방지하고자 check_same_thread 사용
engine = create_engine(SQLALCHEMY_DATABASE_URL,comment_args={'check_same_thread': False} )
세션 로컬은 SQLAlchemy에서 데이터베이스와 상호 작용하는 데 사용되는 객체이다.
세션은 데이터베이스 연결을 나타내며, 데이터베이스 쿼리 실행, 객체 추가, 수정, 삭제 등의 작업을 수행하는 데 사용된다.
세션 로컬은 애플리케이션 내에서 여러 세션을 관리하는 데 사용될 수 있다.
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
엔진은 데이터베이스 연결 관리, 세션은 데이터베이스 작업 수행, 엔진은 연결 풀 관리, 세션은 엔진에서 연결 가져오기,
엔진은 SQL 쿼리를 실행, 세션은 ORM 기능을 사용하여 쿼리 작성, 엔진은 트랜잭션 관리, 세션은 트랜잭션 관리 지원, 엔진은 객체 관리 X , 세션은 객체 로딩 및 저장, 변경 추적을 담당한다. 아래 코드를 보면 이해가 갈 것이다.
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
SQLALCHEMY_DATABASE_URL = 'sqlite:///./todos.db'
# 기본적으로 SQLite 는 하나의 스레드만 통신을 허용한다.
# 다른 종류의 요청에 대해 같은 연결을 공유할 때 발생하는 문제 방지하고자 check_same_thread 사용
engine = create_engine(SQLALCHEMY_DATABASE_URL,comment_args={'check_same_thread': False} )
# 애플리케이션에서 사용할 세션로컬 : 엔진에 바인딩하고 자동 커밋 X, 자동 플러시 X
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 데이터베이스 오브젝트 만들기
Base = declarative_base()
이때 declarative_base() 함수는 데이터베이스 테이블과 매핑되는 Python 클래스의 기반 클래스를 정의하는 함수이다. 이 함수는 데이터베이스 테이블 구조를 나타내는 Python 클래스 정의를 위한 기반 클래스를 제공한다.