3.1.1 FastAPI
백앤드로 사용되는 FastAPI에 대해 알아보고 구현하기
1. 백앤드 프로그래밍
1.1. Server 구성
웹, 앱 서버
머신러닝 서비스의 서버
모놀리식 아키텍처(Monolithic Architecture)
통서버
마이크로서비스 아키텍처(Mircroservice Architecture - MSA)
분할서버
1.2. RestAPI
정보를 주고 받을때 널리 사용되는 형식
HTTP(Hyper Text Transfer Protocol) : 정보를 주고 받을 때 지켜야 하는 통신 프로토콜(규약), 약속
REST(Representational State Transfer)란 형식의 API
각 요청이 어떤 동작이나 정보를 위한 것을 요청 모습 자체로 추론할 수 있음
기본적인 데이터 처리 : 조회 작업, 새로 추가, 수정, 삭제
CRUD : Create, Read, Update, Delete
Resource, Method, Representation of Resource로 구성
Resource : Unique한 ID를 가지는 리소스, URI
URL : Uniform Resource Locator로 인터넷 상 자원의 위치
URI : Uniform Resource Identifier로 인터넷 상의 자원을 식별하기 위한 문자열의 구성 URI는 URL을 포함하게 되며, URI가 더 포괄적인 범위
Method : 서버에 요청을 보내기 위한 방식 : GET, POST, PUT, PATCH, DELETE
GET : 정보를 요청하기 위해 사용(Read)
POST : 정보를 입력하기 위해 사용(Create)
PUT : 정보를 업데이트하기 위해 사용(Update)
PATCH : 정보를 업데이트하기 위해 사용(Update)
DELETE : 정보를 삭제하기 위해 사용(Delete)
1.3. GET과 POST
GET
어떤 정보를 가져와서 조회하기 위해 사용되는 방식
URL에 변수(데이터)를 포함시켜 요청함
데이터를 Header(헤더)에 포함하여 전송함
URL에 데이터가 노출되어 보안에 취약
캐싱할 수 있음
POST
데이터를 서버로 제출해 추가 또는 수정하기 위해 사용하는 방식
URL에 변수(데이터)를 노출하지 않고 요청
데이터를 Body(바디)에 포함
URL에 데이터가 노출되지 않아 기본 보안은 되어 있음
캐싱할 수 없음(다만 그 안에 아키텍처로 캐싱할 수 있음)
1.4. Header와 Body
http 통신은 패킷에 정보를 담아 Request/Response 하게 된다. 이 패킷의 구조가 Header/Body로 구성되어 있다.
Header: 패킷에 대한 정보(보내는 주소, 받는 주소, 시간)
Body: 실제 전달하려는 Data
1.5. Status Code
웹페이지를 보다보면 404 에러를 종종 볼수 있을 것이다. 이런 코드 값이 클라이언트 요청에 대한 서버의 Status Code 값이다.
1xx(정보) : 요청을 받았고, 프로세스를 계속 진행함
2xx(성공) : 요청을 성공적으로 받았고, 실행함
3xx(리다이렉션) : 요청 완료를 위한 추가 작업이 필요
4xx(클라이언트 오류) : 요청 문법이 잘못되었거나 요청을 처리할 수 없음
5xx(서버 오류) 서버가 요청에 대해 실패함
1.6. 동기와 비동기
동기(Sync) : 서버에서 요청을 보냈을 때, 응답이 돌아와야 다음 동작을 수행할 수 있음. A 작업이 모두 완료될 때까지 B 작업은 대기해야 함 (Java, Python)
비동기(Async) : 요청을 보낼 때 응답 상태와 상관없이 다음 동작을 수행함. A작업과 B 작업이 동시에 실행됨 (Javascript)
1.7. IP / Port
IP
네트워크에 연결된 특정 PC의 주소를 나타내는 체계
Internet Protocol의 줄임말, 인터넷상에서 사용하는 주소체계
4덩이의 숫자로 구성된 IP 주소 체계를IPv4라고 함
각 덩어리마다 0~255로 나타낼 수 있음. 2^32 = 43억개의 IP 주소를 표현할 수 있음
몇가지는 용도가 정해짐
localhost, 127.0.0.1 : 현재 사용 중인 Local PC
0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소
개인 PC 보급으로 누구나 PC를 사용해 IPv4로 할당할 수 있는 한계점 진입, IPv6이 나옴
Port
IP 주소 뒤에 나오는 숫자
PC에 접속할 수 있는 통로(채널)
사용 중인 포트는 중복할 수 없음
Jupyter Notebook은 8888
Port는 0 ~ 65535까지 존재
그 중 0~1024는 통신을 위한 규약에 정해짐
22 : SSH
80 : HTTP
443 : HTTPS
2. Fast API
아직 Flask와 Django에 비해 활용 비중이 적지만, 점차 떠오르는 프레임워크이다.
2.1. 특징
FastAPI vs Flask
장점
Flask보다 간결한 Router 문법
Asynchronous(비동기) 지원
Built-in API Documentation(Swagger)
Pydantic을 이용한 Serialization 및 Validation
아쉬운 점
아직까지는 Flask의 유저가 더 많음
ORM 등 Database와 관련된 라이브러리가 적음
3. 환경설정
3.1. 기본 프로젝트 구조
프로젝트의 코드가 들어갈 모듈 설정(app). 대안 : 프로젝트 이름, src 등
main.py는 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할 (참고)
Entrypoint : 프로그래밍 언어에서 최상위 코드가 실행되는 시작점 또는 프로그램 진입점
main.py 또는 app.py : FastAPI의 애플리케이션과 Router 설정
model.py는 ML model에 대한 클래스와 함수 정의
3.2. Poetry
Dependency Resolver로 복잡한 의존성들의 버전 충돌을 방지
Virtualenv를 생성해서 격리된 환경에서 빠르게 개발이 가능해짐
기존 파이썬 패키지 관리 도구에서 지원하지 않는 Build, Publish가 가능
pyproject.toml을 기준으로 여러 툴들의 config를 명시적으로 관리
새로 만든 프로젝트라면 poetry를 사용해보고, virtualenv 등과 비교하는 것을 추천
4. FastAPI 샘플 프로젝트
위 두개의 패키지를 설치
Swagger
{주소}/docs
{주소}/redoc
API 패킷정보를 확인하고 , 명세서없이 파라미터 확인이 가능하다.
Last updated