AI TECH

Fast API (1)

prefer_all 2023. 1. 12. 15:07
지금까지 프론트엔드와 백엔드 모두 Streamlit으로 구현했다면 백엔드에서 Fast API로 대체하고자 한다

<목차>
1. 백엔드 프로그래밍
2. FAST API


백엔드 프로그래밍

[기본용어] 클라이언트 
  요청을 하는 플랫폼. 브라우저 같은 웹일 수 있고, 앱일수도 있음. 우리가 Python을 사용해 요청하는 것도 클라이언트

 

Server의 형태

- 하나의 서버에서 모든 작업을 처리하는 경우 모놀리식 아키텍쳐(Monolithic Architecture)라고 하고, 각 역할에 맞게 개별 서버로 구성하고 각 서버간 통신을 하는 경우를 마이크로서비스 아키텍쳐(Microservice Architecture)라고 한다.

 

REST API

- Rest API는 API 요청 시 활용하는 정해진 형식으로, 정보를 주고 받을 때 널리 사용된다. 
  즉, REST란 형식의 API를 의미한다.

- 각 요청이 어떤 동작이나 정보를 위한 것을 요청 모습 자체로 추론할 수 있다.
- 기본적인 데이터 처리 : 조회 작업, 새로 추가, 수정, 삭제 (CRUD : Create, Read, Update, Delete)

 

HTTP(Hyper Text Transfer Protocol)

HTTP는 정보를 주고 받을 때 지켜야 하는 통신 프로토콜(규약). 즉, 약속이다.
HTTP는 기본적으로 80번 포트를 사용하고 있으며, 서버에서 80번 포트를 열어주지 않으면 HTTP 통신이 불가능하다.

 

URL VS URI


URL : Uniform Resource Locator로 인터넷 상 자원의 위치
URI : Uniform Resource Identifier로 인터넷 상의 자원을 식별하기 위한 문자열의 구성
URI는 URL을 포함하게 되며, URI가 더 포괄적인 범위



 HTTP Method( 서버에 요청을 보내기 위한 방식)

   GET : 정보를 요청하기 위해 사용(Read)
   POST : 정보를 입력하기 위해 사용(Create)
   PUT : 정보를 업데이트하기 위해 사용(Update)
   PATCH : 정보를 업데이트하기 위해 사용(Update)
   DELETE : 정보를 삭제하기 위해 사용(Delete)

GET POST
- 어떤 정보를 가져와서 조회하기 위해 사용되는 방식
- URL에 변수(데이터)를 포함시켜 요청함
- 데이터를 Header(헤더)에 포함하여 전송함
- URL에 데이터가 노출되어 보안에 취약
- 캐싱할 수 있음
- 데이터를 서버로 제출해 추가 또는 수정하기 위해 사용하는 방식
- URL에 변수(데이터)를 노출하지 않고 요청
- 데이터를 Body(바디)에 포함
- URL에 데이터가 노출되지 않아 기본 보안은 되어 있음
- 캐싱할 수 없음(다만 그 안에 아키텍처로 캐싱할 수 있음)


Header VS Body


- Http 통신은 Request 하고, Response를 받을 때 정보를 패킷(Packet)에 저장
- Packet 구조 : Header / Body
- Header : 보내는 주소, 받는 주소, 시간 / Body : 실제 전달하려는 내용

 

status code 

클라이언트 요청에 따라 서버가 어떻게 반응하는지를 알려주는 Code

1xx(정보) : 요청을 받았고, 프로세스를 계속 진행함
2xx(성공) : 요청을 성공적으로 받았고, 실행함
3xx(리다이렉션) : 요청 완료를 위한 추가 작업이 필요
4xx(클라이언트 오류) : 요청 문법이 잘못되었거나 요청을 처리할 수 없음
5xx(서버 오류) 서버가 요청에 대해 실패함

 

동기 VS 비동기


- 동기(Sync) : 서버에서 요청을 보냈을 때, 응답이 돌아와야 다음 동작을 수행할 수 있음. A 작업이 모두 완료될 때까지 B 작업은 대기해야 함
- 비동기(Async) : 요청을 보낼 때 응답 상태와 상관없이 다음 동작을 수행함. A작업과 B 작업이 동시에 실행됨

IP(Internet Protocol)


네트워크에 연결된 특정 PC의 주소를 나타내는 체계 
4덩이의 숫자로 구성된 IP 주소 체계를IPv4라고 함
- 몇가지는 용도가 정해짐
  localhost, 127.0.0.1 : 현재 사용 중인 Local PC 
  0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소

Port


IP 주소 뒤에 나오는 숫자, PC에 접속할 수 있는 통로(채널)
사용 중인 포트는 중복할 수 없음
- Jupyter Notebook은 8888
- Port는 0 ~ 65535까지 존재
- 그 중 0~1024는 통신을 위한 규약에 정해짐
   22 : SSH
   80 : HTTP
   443 : HTTPS


Fast API

Fast API는 최근 떠오르는 Python Web Framework로 특징은 아래와 같다.
- High performance : Node.js, go와 대등한 성능을 가졌다
- Easy : Flask와 비슷한 구조로 Microservice에 적합하다
- Productivity : Swagger 자동 생성, Pydantic을 이용한 Serialization이 가능하다.

 

FastAPI vs Flask

FastAPI의 장점
- Flask보다 간결한 Router 문법
- Asynchronous(비동기) 지원
- Built-in API Documentation(Swagger)
- Pydantic을 이용한 Serialization 및 Validation

FastAPI의 아쉬운 점
- 아직까지는 Flask의 유저가 더 많음
- ORM 등 Database와 관련된 라이브러리가 적음

 

Fast API 환경 설정

✅ 프로젝트 구조는 다음과 같이 설정한다

- __main__.py는 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할
  * Entrypoint : 프로그래밍 언어에서 최상위 코드가 실행되는 시작점 또는 프로그램 진입점
- main.py 또는 app.py : FastAPI의 애플리케이션과 Router 설정
- model.py: ML model에 대한 클래스와 함수 정의

 

✅ Poetry라는 가상 환경을 사용해보자

Poetry란?

- Dependency Resolver로 복잡한 의존성들의 버전 충돌을 방지
- Virtualenv를 생성해서 격리된 환경에서 빠르게 개발이 가능해짐
- 기존 파이썬 패키지 관리 도구에서 지원하지 않는 Build, Publish가 가능
- pyproject.toml을 기준으로 여러 툴들의 config를 명시적으로 관리
- 새로 만든 프로젝트라면 poetry를 사용해보고, virtualenv 등과 비교하는 것을 추천


Poetry 설치하기

설치를 위한 공식 홈페이지: Introduction | Documentation | Poetry - Python dependency management and packaging made easy (python-poetry.org)

혹시 서버에 peotry를 설치할 때 아래와 같은 에러가 뜬다면
bash: curl: command not found
apt-get install sudo
sudo apt update
sudo apt install curl

 

poetry를 설치했음에도 poetry 명령어가 작동하지 않는다면 아래 두 가지 방법을 시도해보자

bash: poetry: command not found
export PATH="$HOME/.poetry/bin:$PATH"
pip install poetry

 

Poetry 사용해보기 

Poetry 사용 흐름은 다음과 같다.
프로젝트 init -> Poetry shell 활성화 -> Poetry install -> Poetry add

poetry  #명령어 확인
poetry init

아래 사진과 같이 Poetry를 사용하면 대화 형식으로 패키지 설치 가능하다.
- 패키지 이름 검색 및 선택
- 패키지 버전 명시
- Dependency(프로덕션용)
- Development Dependency(Dev용)
- 개발 환경마다 필요한 패키지 분리



# pyproject.toml에서 설정이 저장되므로 아래 명령어로 내용 확인
cat pyproject.toml

 

poetry shell # shell 활성화
poetry install #pyproject.toml에 저장된 내용에 기반해 라이브러리 설치
poetry add #필요한 패키지를 추가하고 싶은 경우 사용
poetry.lock 파일이란?
- Writing lock file에서 생성되는 파일
- 이 파일이 존재하면 작성하고 있는 프로젝트 의존성과 동일한 의존성을 가질 수 있음
- Github Repository에 꼭 커밋!

 

 

'AI TECH' 카테고리의 다른 글

Fast API (3)  (0) 2023.01.16
Fast API (2)  (0) 2023.01.14
Product Serving  (1) 2023.01.12
Passage Retrieval  (0) 2022.12.20
MRC  (0) 2022.12.20