FastAPI -1

-·2022년 1월 13일
4

강의정리 - MLOps

목록 보기
9/18

목차

  • 백엔드 프로그래밍
    -- server 구성 Use Case
    -- Server의 형태
    -- REST API
    -- HTTP Method
    -- Header와 Body
    -- Status Code
    -- 동기와 비동기
    -- IP
    -- Port

  • FastAPI
    -- FastAPI소개 & 특징
    -- FastAPI vs Flask
    -- Poetry
    -- Swagger
    -- Simple Web Server

백엔드 프로그래밍

Part2 잠깐 정리 !!

  • 프로토타입 개발 : Voila, Streamlit

  • 프론트 : Streamlit

  • 백엔드 : Streamlit에서 함수 실행 => FastAPI로 대체

server 구성 Use Case

실제 회사 Use Case
머신러닝 서버가 따로 존재하거나, 큰 서버안에 머신러닝 파트가 존재하는 경우가 있다.

회사에 입사하게 되면 어떻게 서버가 구성되어있는지 확인해보자 !

  • 앱/웹 서비스의 서버가 존재
  • 머신러닝 서비스의 서버가 존재
  • 서비스 서버에서 머신러닝 서버에 예측 요청하며 통신함(혹은 서비스 서버의 한 프로세스로 실행)

Server의 형태

모놀리식 아키텍처(Monolithic Architecture)
하나의 큰 서버 = 종업원, 요리사, 서랍, 계산 등을 모두 하나에서 처리하는 경우(큰 범주로 모두 서버)

  • 문제점 :
    -- 배포가 전체 서버를 같이 배포해야되는데 배포가 빨라지기 힘들다.
    -- 여러 사람들이 사이드 이펙트를 고려해야한다.

마이크로서비스 아키텍처(Microservice Architecture - MSA)
종업원, 요리사, 서랍, 계산 등을 각각의 개별 서버로 구성하고 서로 통신하도록 하는 경우

REST API

  • REST API
    -- 정보를 주고 받을때 널리 사용되는 형식

개발할 때 API를 임의로 만들 수도 있음
-> www.naver.com/1 네이버 블로그 접속
-> www.naver.com/2 네이버 카페 접속
이런 경우라면 1,2가 무엇을 의미하는지 알아야 함 => 협업이 힘들어진다.

HTTP(Hypter Text Transfer Protocol): 정보를 주고 받을 때 지켜야 하는 통신 프로토콜(규약),약속
약속이 없으면 사람마다 다르게 쓰게 됨
예:"XXXX" 주문 요청합니다 가 아닌 "즉당히 따땃한데 시원하고 느낌있는 음식 만들어주세요!" ?!

  • 한번 더 질문하거나 예외처리할 수 있지만, 정말 많은 정보가 오고 갈 땐 이 부분이 이슈가 됨

HTTP는 기본적으로 80번 포트를 사용하고 있으며, 서버에서 80번 포트를 열어주지 않으면 HTTP 통신이 불가능

REST란 형식의 API

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

Representational State Transfer의 약자

  • Resource, Method, Representation of Resource로 구성

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

-Resource : Unique한 ID를 가지는 리소스, URI
-Method: 서버에 요청을 보내기 위한 방식: GET, POST, PUT, PATCH, DELETE

URI vs URL
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의 차이

  • GET www.DoNgineer.com/write?id=123w831 와 같은 형식.
    -- 어떤 정보를 가져와서 조회하기 위해 사용되는 방식
    -- URL에 변수(데이터)를 포함시켜 요청함
    -- 데이터를 Header(헤더)에 포함하여 전송함
    -- URL에 데이터가 노출되어 보안에 취약
    -- 캐싱할 수 있음

  • POST
    -- 데이터를 서버로 제출해 추가 또는 수정하기 위해 사용하는 방식
    -- URL에 변수(데이터)를 노출하지 않고 요청
    -- 데이터를 Body(바디)에 포함
    -- URL에 데이터가 노출되지 않아 기본 보안은 되어 있음
    -- 캐싱할 수 없음(다만 그 안에 아키텍처로 캐싱할 수 있음)

GETPOST
URL에 데이터 노출 여부OX
URL예시localhost:8080/login?id=jodong2localhost:8080/login
데이터의 위치HeaderBody
캐싱 가능 여부OX

if URL에 데이터가 노출된다?! return GET
else : POST

Header와 Body

  • HTTP통신은 Request하고, Response를 받을 때 정보를 패킷(Packet)에 저장

  • Packet 구조 : HEADER/BODY

  • HEADER: 보내는 주소, 받는주소, 시간,

  • Body: 실제 전달하려는 내용

크롬창에 개발자도구 같은거 키고 네트워크 탭에서 새로고침 좀 시키면 Response Header, Request Header 등등을 볼 수 있음.

PUT vs PATCH

Status Code

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

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

200번대를 많이 보시게 될거예요 ! -> 저는 4~500번대를 더 많이 봤어요 ㅠ^ㅠ

동기와 비동기

  • 동기(Sync) : 서버에서 요청을 보냈을 때, 응답이 돌아와야 다음 동작을 수행할 수 있음. A작업이 모두 완료될떄까지 B작업은 대기해야 함
    -- 종속사건이면 동기 사용

-비동기(Async) : 요청을 보낼 때 응답 상태와 상관없이 다음 동작을 수행함. A작업과 B작업이 동시에 실행됨
-- 독립사건이면 비동기 사용

파이썬의 함수는 전부 동기식으로 처리 됨. -> Async를 붙이게 되면 비동기방식으로 처리 됨

IP

  • IP
    -- 네트워크에 연결된 특정 PC의 주소를 나타내는 체계
    -- Internet Protocol의 줄임말, 인터넷상에서 사용하는 주소체계
    -- 4덩이의 숫자로 구성된 IP주소 체계를 IPv4라고 함
    -- 각 덩어리마다 0~255로 나타낼 수 있음. 2^32 = 43억개의 IP주소를 표현할 수 있음
43억개가 모잘랐다고?.. 콤퓨타.. 위대하다..

-- localhost, 127.0.0.1 : 현재 사용중인 Local PC -> 내 컴퓨터
-- 0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소 -> 클라우드때 자주 봤던 숫자들.. 모든것들을 열 수 있다(?!)
-- 개인 PC보급으로 누구나 PC를 사용해 IPv4로 할당할 수 있는 한계점 진입, IPv6이 나옴

Port

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

Fast API

FastAPI소개 & 특징

최근 떠오르는 Python Web Framework

Jetbrain Python Developer Survey 기준

FastAPIFlaskDjango
202114%46%45%
202012%46%43%
20190%48%44%
뭐지?! 여러개를 사용하는건가?
100%를 넘어가네 ㅎㅎ.. 

FastAPI특징

  • High Performance
    -- Node.js, go와 대등한 성능

  • Easy
    -- Flask와 비슷한 구조
    -- Microservice에 적합

  • Productivity
    -- Swagger 자동생성
    -- Pydantic을 이용한 Serialization

장고의 경우 ml서비스 만들땐 좀 무겁다 !!

FastAPI vs Flask

  • 장점
    -- Flask보다 간결한 Router 문법
    -- FastAPI는 데코레이터로 감쌀때 인자를 작성하고 함수 내부에서 사용할 수 있음
    -- Asynchronous(비동기) 지원
    -- Built-in API Documentation(Swagger 내장)
    -- Pydantic을 이용한 Serialization 및 Validation
간결한 Router문법 예시

Flask : 
	@app.route("/",methods=["GET"])
	@app.route("/",methods=["POST"])
FastAPI:
	@app.get("/")
	@app.post("/")
  • 아쉬운 점
    -- 아직까지는 Flask의 유저가 더 많음
    -- ORM 등 Database와 관련된 라이브러리가 적음

환경설정

FastAPI에서 자주 사용되는 프로젝트 구조 소개
Poetry라는 가상 환경 및 의존성 관리 소개

프로젝트 구조 (v1)

  • 프로젝트의 코드가 들어갈 모듈 설정(app). 대안 : 프로젝트 이름, src 등

  • main.py는 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할
    -- Entrypoint: 프로그래밍 언어에서 최상위 코드가 실행되는 시작점 또는 프로그램 진입점

  • main.py 또는 app.py : FastAPI의 애플리케이션과 Router 설정

  • model.py는 ML model에 대한 클래스와 함수 정의

  • 어렵다면 노트북으로 만들고 하나하나 옮기는 방식으로 연습해보기

앞으로는 하나의 파일에는 하나의 목적성에 맞는 함수들만 저장한다 !!
utils.py보다 유틸도 목적에 맞게 나눠서 저장.
model.py predict.py 등

Poetry

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

poetry 설치하기

Requirements: Python2.7 or 3.5+

MAC OSX/Linux:
curl -SSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

Windows(Powershell)
(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python -

설치 후
터미널에서 poetry 입력시 명렁어 help(?) docs(?)가 보임

  • poetry 사용 흐름
    -- 프로젝트 init
    -- Poetry Shell 활성화
    -- Poetry Install
    -- Poetry Add

FastAPI 프로젝트를 만들기 위해 아래 패키지들이 필요

  • fastapi
  • uvicorn or gunicorn
  • 프로젝트 init
    -- 사용할 라이브러리 지정
    -- package name:
    -- version:
    -- Description:
    -- License:
    -- Compatible Python versions:
    -- >=3.6.2, <3.10 과 같이 버전 지정 가능

  • 대화형식으로 패키지 설치 가능
    -- 패키지 이름 검색 및 선택
    -- 패키지 버전 명시
    -- Dependency(프로덕션용)
    -- Development Dependency(Dev용)
    -- 개발서버, 프로덕션서버를 나눌 수 있음
    -- 개발 환경마다 필요한 패키지 분리

  • 프로젝트 init
    -- 사용할 라이브러리 지정
    -- pyproject.toml에 설정 저장됨

  • Poetry Shell 활성화 : poetry shell
    -- Poetry 친구들이 알아서 virtual env를 만들어줌

  • Poetry Install : pyproject.toml에 저장된 내용에 기반해 라이브러리 설치

  • Poetry Add : 필요한 패키지를 추가하고 싶은 경우 사용

poetry.lock파일

  • writing lock file에서 생성되는 파일
  • 이 파일이 존재하면 작성하고 있는 프로젝트 의존성과 동일한 의존성을 가질 수 있음
  • Github Repository에 꼭 커밋!

Simple Web Server띄우기

아주 기초적인 웹 서버 : 루트("/")로 접근하면 Hello World가 출력되는 웹 서버

from fastapi import FastAPI

#FastAPI객체 생성
app= FastAPI()

#"/"로 접근하면 return을 보여줌
@app.get("/")
def read_root():
	return {"Hello": "World"}

터미널 혹은 CLI에서
uvicorn 01_simple_webserver:app --reload

--reload: 코드가 변경되면 바로 다시 load해줌.

터미널에서 uvicorn을 작성하기 싫다면 파일 추가 main에 추가

from fastapi import FastAPI
import uvicorn

#FastAPI 객체 생성
app = FastAPI()

# "/"로 접근하면 return을보여줌
@app.get("/")
def read_root():
	return {"Hello":"World"}

if __name__ == '__main__':
	uvicorn.run(app, host="0.0.0.0", port = 8000) 

이젠 아래의 명령어로 실행 가능
python 01_simple_sebserver:app --reload

localhost:8000에 접근하면 GET결과를 볼 수 있음

localhost:8000/docs로 이동하면 Swagger를 확인할 수 있음
localhost:8000/redoc -> 다른 형태로 저장되어 있음

Swagger

Swagger가 유용한 이유

  • 만든 API를 클라이언트에서 호출하는 경우(협업)
    -- Q) 어떻게 Request해야 하죠?
    -- A) 이 인자를 주시면 돼요 ~~!
    -- 1~2번은 말할 수 있지만 만약 50명이 계속 물어본다면...?

  • REST API 설계 및 문서화할 때 사용

  • 다른 개발팀과 협업하는 경우

  • 구축된 프로젝트를 유지보수하는 경우

  • 하지만 코드짜기도 바쁜데 문서도 가서 수정해야함...

postman이나 curl을 통해 테스트해볼 수 있지만 Swagger에서 사용하면 편함.

  • 기능
    -- API디자인
    -- API빌드
    -- API문서화
    -- API테스팅

정리

  • 백엔드 프로그래밍 기초 지식은 굉장히 많은 편 => 자주 접해서 익숙해지기
  • FastAPI를 사용하는 것보다 이런 기초지식이 존재해야 백엔드 프로그래밍을 수월하게 할 수 있음
변성윤 강사님의 백엔드를 공부하며 이런걸 먼저 알았다면 좋았겠다.를 모은 강의였다. 
Fast API만 앞으로 2시간의 강의가 더 남았다. 신나는군.
API?! REST API?! RESTful API?! 
API : 애플리케이션과 운영체제, 애플리케이션과 프로그래밍 언어가 제공하는 기능 사이 
상호작용을 도와준다 !
예를 들어 사람은 에어컨과 상호작용하기위해 리모콘을 쓴다. 
여기서 리모콘은 API라고 볼 수 있다. 

웹API: 웹은 기본적으로 요청(Request)와 응답(Response)으로 작동한다.


사용자 -> 브라우저 <->서버 

브라우저는 서버로 요청하고 
서버는 브라우저에게 응답한다.

웹 API의 역할 
- 서버와 데이터베이스안의 리소스에 접근할 수 있게 해준다.
  - API가 접근권한이 있는 사람에게만 서버와 DB에 접근할 수 있게 도와준다. 
- 모든 요청과 응답을 표준화한다.
 
REST API : 
- 리소스에 대한 행위는 HTTP Method(POST,GET,PUT,PATCH,DELETE)로 표현한다.
- "/"는 계층관계를 나타낼때 사용한다
- URI에 "_"는 사용하지 않도록 한다. 대문자보다는 소문자를 사용한다.
- 동사가 아니라 명사를 사용한다. 
  - HTTP Method가 동사를 사용해서?!.. 
- URI에 파일의 확장자(예를들어 .json, .jpg, .png)를 포함하지 않는다.

API의 목적이 무엇인지 명확하게 하기위해 RESTful함을 지향한다. 

profile
-

2개의 댓글

HTTP Header는 GET과 POST 둘 다 사용할 수 있어서 GET 메소드가 Header를 이용하여 데이터를 보낸다는 내용은 잘못된 것 같습니다

1개의 답글