ASAC-SK플래닛 T아카데미 데이터 엔지니어

25.11.10 23일차 [fastapi_데이터베이스 생성, orm 문법]

Datadesigner 2025. 11. 10. 17:46

감격적인 조회수 2회

오늘은 오전에 컨디션이 안좋아서 오전수업 못 들음...

근데 진짜 반나절 빠졌는데 그냥 진도 확나가버렸다.

진짜 특정한 일 있는거 아니면 웬만하면 빠지면 안될거같다는걸 느꼈다

그래도 수업량이 엄청나게 많진 않아서 금방 따라잡았다.

그리고 깃허브를 시작해서 수업 순서와 내용등을 파악할 수 있게 되니 좋은 것 같다.

깃허브는 신이야


fastapi남은 주제 => 개발

- DB 관련 - ORM (코드레벨에서 DB를 컨트롤(sql 대리))
- 프레임웍(혹은 MVC 구조(모델)) 
    - apirouter(fastapi)<->blueprint(flask) : 고급기능
    - Model(db관련) Veiw(템플릿) Controller(비즈니즈로직, 라우터)
- 간단한 서비스 구성 (로그인(기본+암호화+JWT or oAuth2(외부인증:네이버, 카카오, 구글 로그인 붙임) )
+ 메모(게시판, todo유사성), 웹소켓이용한채팅(봇)=>LLM 사용시, 
대시보드(차트구성=>JS 활용)->데이터및AI주제를 다룰때 사용 )

 

docker & CI / CD => 관리 및 운영에 좀 더 가까움

- CI/CD : 지속적 개발 및 배포 -> 프로젝트 초기에 세팅함(환경 구성)
    - github + gitaction(깃허브에서 제공하는 CI/CD용 기술) + aws EC2서비스(웹서비스를 위해 서버 임대)

- docker -> docker 서버가 설치가 미리 설치되어 잇어야함(나름 고사양 필요)
    - 구성, 특징, 사용이유
    - cli : command line interface 명령어
    - docker file : 컨테이너 1개에 대한 세부 구성 설계가능
    - docker compose : 컨테이너 n개에 대한 세부 구성 설계가능

- docker 기반 CI/CD
    - docker hub 개입

- 쿠버네티스 -> 뒤쪽으로 이동(스케줄)
    - 운영에 대한 오케스트레이션
        - n개의 서버, n개의 디비, 등등... -> auto scaling

 

 


  • FastAPI_memo
    • 목적
    • 메모 관리 프로젝트 통한 fastapi 전체적 기능 실습, 적용
  • 목표
    • fastapi 심화과정
    • db관련 CRUD 작업 모두 구현
    • 사용자 인증 (로그인 등) 관련 작업 모두 구현 (JWT 체크 후 )
    • APIRouter를 이용한 도메인(혹은 작업별) 분리 처리
    • Pydantic을 이용한 입력값 유효성 검사,(지난번에 한거) 데이터 (역)직렬화 처리
    •  

 

먼저 실습을 위해서 웹서비스 엔트리포인트(시작점)을 구성한다.

라이브러리를 불러오고, 적용시킨다.

 

  • ORM
    • Object-Relational Mapping의 약자로
    • 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑해주는 기술
    • sql 쿼리문을 사용하는 대신, 파이썬 class의 객체를 통해서 데이터베이스에 직접 조작
    • 테이블 생성, 데이터 추가/조회/삭제/수정 등
  • 사용 패키지
    • sqlalchemy 
      • 모든 데이터베이스 지원-> 제품별 데이터베이스를 지원하는 드라이버는 미지원(별도 전용드라이버 패키지를 같이 사용)
    • pymysql
      • 풀링기능 지원 -> 큐 자료구조 기반(선착순, 선입선출 + 돌려쓰기 => 최소 자원으로 커버가능)
      • 데이터베이스는 최대 세션수를 가지고있음
        • ex -> 200이라면 동시에 200명이 사용 가능함 -> 동접자수
      • 미리 접속 세션을 200개 등 세팅한만큼 준비함
        • 접속및 접속해제 과정 생략 ( 미루 구성, 돌려씀 -> 서비스 가동되면 처음에 무조건 200개의 세션을 만듬
        • 고객 접속 -> 풀에서 한개 꺼내서 제공 -> 쿼리 수행 -> 반납 : 반복
        • 디비 커넥션 풀(pool)
ORM 기본 구성, 테이블 생성 및 연동

먼저 DOCKER에서 새로운 데이터베이스 memos를 만들어준다
mysql로 새 데이터베이스 memos를 만들었다.
그 이후 orm작업을 위한 작업을 시작한다.
먼저 데이터베이스 연동 url을 구성한다, 그냥 외워!
그리고 연결담당할 엔진을 만들고
테이블 구성에 필요한 모든 orm모델이 상속받아야하는 클래스를 구성한다,
그리고 그 데이터베이스에 테이블을 만들고 컬럼을 구성한다.
이것을 sql프로그램으로 하지 않고 파이썬에서 코드로 가능하게 해주는게 orm이다.
basetablemodel은 잘 모르겠다 봐도

하이디sql, 새 데이터베이스와 테이블, 컬럼이 생성된것을 확인할 수 있다.

 

ORM DTO 구성 및 디비 세션 획득 및 반납에 대한 함수 구성
37~39
메모 작성용 클래스
사용자가 작성한 데이터를 본 객체에 담아서 디비에 반영
MemoInsert -> 데이터를 담는 그릇 -> DTO라고  자바 진영에서 표현함
DTO = (Data Transfer Object, 데이터 전송 객체) 란 프로세스간에 데이터를 전달하는 객체 = MemoInsert

44~46
메모 수정용 클래스
null이 가능하게 구성해서 Optional로 결측도 가능하게 구성

51~69
db 커넥션, 반납에 관련된 함수


Hotfix 
ORM MemoInsert, MemoUpdate의 부모클래스를 pydantic의 BaseModel로 수정하여 DTO 본질에 집중구성
잘은 머르겠는데 이렇게 바꼈다고 한다
ORM 메모서비스의 기본 CRUD 처리를 위한 라우팅 기본 구성

async def vs def
함수 실행 방식의 차이
async def : 비동기식 함수
def : 동기식 함수
특징
def로 구성할 시
쓰레드 풀에서 실행됨
동접수가 많으면 그 수만큼 쓰레드가 운용(성능 제한 두고 실행)
특정 요청은 특정 쓰레드가 전담하여 운영 -> 동기식, IO작업 시 블러킹됨
FASTAPI는 별도의 쓰레드풀에 해당 요청을 보내서 처리(동시처리 수행)
장점
비동기를 미지원하는 작업에서는 유용함(오래된 라이브러리 등)
복잡한 계산, 이미지처리 등 CPU집약 작업에 유용함

async def 로 구성할 시
fastapi에서 관리하는 메인이벤트루프 에서 실행됨
await 키워드를 사용하여 IO작업 수행하여 대기할 수 있음
해당 키워드를 만나면 점유하는 프로세스를 넘길 수 있음
기다리는 동안 다른 작업 가능함

CRUD
생성 (Create), 읽기 (Read), 갱신 (Update), 삭제(Delete) 의 네 가지 기본적 데이터 관리 기능
데이터베이스 애플리케이션에서 데이터를 생성, 조회, 수정, 삭제하는 기본적인 작업이제 핵심 기능
웹서비스에서 디비 연동은 테이블당 CRUD를 구성하는것이 기본임
이렇게 네 가지 함수로 기본 CRUD를 구성하였고, async def 함수로 정의하였다.

 

ORM 메모 추가 API 구성
/memo/ url에 기능을 추가해준다, 나머지는 주석을 읽어보시길!
이제 thunderclient로 post를 확인해보면 
데이터가 넘어간다. 
하이디sql에서 확인해도 데이터를 확인할 수 있다.

 

ORM 메모 조회
별거 없다, 그저 사용방법만 익히면 된다.
all()함수가 sql상에서의 select * from memo의 기능을 수행하는것이다, 훨씬 간편하게
get방식으로 모든 데이터를 불러온다.

이게 게시판 번호같은 느낌이라고 한다, 

사이트에서도 확인 가능하다

 

ORM 메모 삭제 
메모 삭제는 특정 키워드를 찾아서 지워야하기 때문에 경로 매개변수를 사용한다.
그래서 URL에 번호가 추가되고 다른 문법은 동일하다.
URL에 6을 입력하고 전송을 누르면 성공, 메모가 삭제되었습니다가 뜬다

한번 더 누르면 데이터가 없다고 뜬다

SQL에서도 지워진 모습이다

 

ORM 메모 수정
ID = 1인 정보가 없어서 오류가 나는 모습

 

타이틀만 올려서 타이틀만 수정되는 모습이다.
SQL에서 확인

 

JINJA2 memo.html 디자인 추가
강사님이 준비해주신 html을 추가한다.

이런 세팅을 해두셨다.
이후 메인 페이지에 라우팅을 기본값에서 바꿔준다

html상에서 이 부분이 입력, 게시판 부분이다.
여기 밑에 익숙한 for문이 보인다.
우리 데이터베이스에 있는 데이터들을 for문을 통해서 웹 사이트에 뿌리면 게시판이 되는것이다

지금까지 썼던 기술들을 활용하여 데이터를 가져오는 함수를 구성한다.
어떤 데이터베이스에서 / 데이터를 모두 가져와서 / memo.html에 뿌려주는 내용이다. 자세한것은 챗gpt한테 더 물어보시

결과값, 데이터베이스에 있던 데이터들이 출력되는 모습이다.

이후 진도는 게시판, 보안 인증 로그인 등등 예정되어다고 한다.

 

하 오늘 늦게와서 진짜 못따라갈 줄 알았는데 오늘도 세팅이나 이런게 많아서 겨우 따라잡을수 있었던 것 같다

 

다시 오늘부터 열심히 해보자고