[부스트캠프 AI Tech 5기] FastAPI

박상우·2023년 7월 1일
1

부스트캠프

목록 보기
53/54
post-thumbnail

FastAPI

백엔드 기초 지식

RestAPI

  • Resource, Method, Representation of Resource로 구성
  • API를 만들 때 합의한 규칙
  • REST란 형식의 API
  • CRUD를 사용

클라이언트

  • 요청을 하는 플랫폼
  • 브라우저 같은 웹이거나 앱
  • python을 사용해 요청하는 것도 클라이언트

Resource

  • Unique한 ID를 가지는 리소스, URI

Method

  • 서버에 요청을 보내기 위한 방식: Get, Post, Put, Patch, Delete 등

Get
  • 정보를 요청 (Read)
  • 어떤 정보를 가져와서 조회
  • URL에 변수를 포함시켜 요청
  • 데이터를 헤더에 포함하여 전송
  • URL에 데이터가 노출되어 보안에 취약
  • 캐싱할 수 있음 (비교적 빠르다)
Post
  • 정보를 입력 (Create)
  • 데이터를 서버로 제출해 추가 또는 수정하기 위해 사용
  • URL에 데이터가 노출되지 않음
  • 데이터를 바디에 포함
  • 캐싱할 수 없음
Header & Body
  • HTTP 통신은 Request하고 Response 받을 때, 정보를 패킷에 저장
  • 이 Packet의 구조가 Header/Body
  • Header : 보내는 주소, 받는 주소, 시간
  • Body : 실제 전달하려는 내용
Put, Patch
  • 정보를 업데이트 (Update)
Delete
  • 정보를 삭제 (Delete)

URL

  • Uniform Resource Locator - 인터넷 상 자원의 위치

URI

  • Uniform Resource Identifier - 인터넷 상의 자원을 식별하기 위한 문자열의 구성
  • URI는 URL을 포함하는 더 포괄적인 범위

HTTP

  • 정보를 주고받을 때 지켜야하는 통신 규약 및 약속
  • 기본적으로 80번 포트를 사용

Status code

동기와 비동기

IP

Port

FastAPI

  • 떠오르는 Python Web FrameWork
  • High Performance, Easy, Productivity
  • Flask보다 간결한 문법
  • 비동기 지원
  • Pydantic을 이용한 Serialization 및 Validation

아쉬운 점

  • 아직은 flask 유저가 더 많음
  • ORM 등 Database와 관련된 라이브러리가 적음

환경설정

프로젝트 구조

  • 하나의 파일에는 하나의 목적만

Poetry

기본 지식

Path Parameter, Query Parameter

  • 웹에서 Get Method를 사용해 데이터를 전송할 수 있음
  • ID가 402인 사용자 정보를 가져오고 싶은 경우의 방식

/users/402

  • Path Parameter
    *
    • 서버에 402라는 값을 전달하고 변수로 사용

/users?id=402

  • Query Parameter
    *

    • Query String
    • API 뒤에 입력 데이터를 함께 제공하는 방식으로 사용
    • Query String은 Key, Value 쌍으로 &로 연결하여 여러 데이터를 넘길 수 있음
  • 언제 어떤 방식을 사용해야 할까? - 상황마다 다름

  • Resource를 식별하고 싶음 (kyle은 없음)

  • Query Parameter를 사용하면 Error Handling을 해야 함

  • 즉 Resource 식별시에는 path parameter가, 정렬 필터링 시에는 Query Parameter가 적합

Path Parameter

  • Get Method: 정보를 read하기 위해 사용

Query Parameter

  • url 자체에는 parameter가 없음

Request Body

  • 클라이언트에서 API를 보낼 때, Request Body를 사용함

  • 클라이언트 => API : Request Body

  • API의 Response => 클라이언트 : Response Body

  • Request Body에 항상 데이터가 포함되어야 하는 것은 아님

  • Request Body에 데이터를 보내고 싶다면 Post Method를 사용
    * 참고 - Get Method는 URL, Request Header로 데이터 전달

Pydantic

  • FastAPI에서 Class 사용할 때 보이는 Pydantic
  • Data Validation / Setting Management 라이브러리
  • Type Hint를 Runtime에서 강제 - 안전한 데이터 핸들링
  • 두 가지 기능 Validation and config

Pydantic Validation

Python Class

  • 의미 없는 코드가 많아짐
  • 복잡한 검증 로직에는 Class도 복잡해짐 (Error Handling logic이 중요해짐)
Dataclass

  • 인스턴스 생성 시점에서 Validation 수행은 쉬움
  • 그러나 여전히 로직을 작성해야 함
  • 로직을 작성하지 않으면, 런타임에서 type checking은 지원하지 않음
Pydantic!

  • 검증 로직 매우 간단
  • 훨씬 코드 간결
  • 주로 쓰이는 타입에 대한 Validation 이미 존재
  • custom Type에 대한 Validation 쉽게 사용 가능

Pydantic Config

  • config를 체계적으로 관리 가능
기존 Config 설정
  • 설정을 종종 상수로 코드에 저장

  • 이는 Twelve-Factor 위반

  • Yaml

    유연하게 코드 변경 어려움
    결국 hard coding

  • flask style

    * overriding 시 코드량이 늘어남

  • Pydantic

  • 꼭 Pydantic을 사용할 필요는 없으나, Human Error를 줄이는 관점에서 Pydantic은 상당히 유용 ^^

Tip for FastAPI

익숙해지기

Event Handler

API Router

  • 기존 app.get, app.post가 아닌 따로 router 파일을 설정해 Import 하여 사용

프로젝트 구조


Error Handling

  • 웹 서버 운영을 위해 반드시 필요한 주제
  • 클라이언트가 대응할 수 있도록 해야 함
  • 서버 개발자는 Error Log도 수집해야 함
  • 예외 처리를 잘 만들 필요가 있음
EX

  • item_id 가 5 일경우 Internal error
  • 이럴 경우, client는 어떤 에러가 난 것 인지 정보를 얻을 수 없음
  • 에러 메시지와 이유를 잘 전달하도록 코드를 작성해야 함

Background Tasks

  • FastAPI는 Starlett이라는 비동기 프레임워크를 래핑해서 사용
  • FastAPI의 기능 중 Background Tasks 기능은 오래 걸리는 작업을 background에서 실행함

아직도 FastAPI가 어렵다면?

  • 처음에 백엔드 프로그래밍 할 때 어려운건 당연
  • 프로젝트 구조 잡기 어려움, 객체 지향의 어려움, 목표의 부재 등

프로젝트 구조

  • Cookiecutter
  • 많은 사람들이 프로젝트 구조에 대한 고민이 많아 템플릿을 공유

  • CLI 형태로 프로젝트 생성 과정을 도와줌
Cookiecutter for Data Science

Cookiecutter for fastapi

  • 백이랑 프론트 연결하는 템플릿도 있으니, 찾아보시길

객체 지향

  • 현재 가지고 있는 코드를 Class로 변경해보기
  • Pydantic Use Case 탐색해보기

Try & Error

  • 낯선 것은 당연
  • 조급해하지 말고 작은 규모의 프로젝트부터 만들어 보자
  • 기능을 정의하고 하나씩 구현해보자
profile
세상아 덤벼라

0개의 댓글