백엔드 프로그래밍
-- server 구성 Use Case
-- Server의 형태
-- REST API
-- HTTP Method
-- Header와 Body
-- Status Code
-- 동기와 비동기
-- IP
-- Port
FastAPI
-- FastAPI소개 & 특징
-- FastAPI vs Flask
-- Poetry
-- Swagger
-- Simple Web Server
프로토타입 개발 : Voila, Streamlit
프론트 : Streamlit
백엔드 : Streamlit에서 함수 실행 => FastAPI로 대체
실제 회사 Use Case
머신러닝 서버가 따로 존재하거나, 큰 서버안에 머신러닝 파트가 존재하는 경우가 있다.
회사에 입사하게 되면 어떻게 서버가 구성되어있는지 확인해보자 !
모놀리식 아키텍처(Monolithic Architecture)
하나의 큰 서버 = 종업원, 요리사, 서랍, 계산 등을 모두 하나에서 처리하는 경우(큰 범주로 모두 서버)
마이크로서비스 아키텍처(Microservice Architecture - MSA)
종업원, 요리사, 서랍, 계산 등을 각각의 개별 서버로 구성하고 서로 통신하도록 하는 경우
개발할 때 API를 임의로 만들 수도 있음
-> www.naver.com/1 네이버 블로그 접속
-> www.naver.com/2 네이버 카페 접속
이런 경우라면 1,2가 무엇을 의미하는지 알아야 함 => 협업이 힘들어진다.
HTTP(Hypter Text Transfer Protocol): 정보를 주고 받을 때 지켜야 하는 통신 프로토콜(규약),약속
약속이 없으면 사람마다 다르게 쓰게 됨
예:"XXXX" 주문 요청합니다 가 아닌 "즉당히 따땃한데 시원하고 느낌있는 음식 만들어주세요!" ?!
HTTP는 기본적으로 80번 포트를 사용하고 있으며, 서버에서 80번 포트를 열어주지 않으면 HTTP 통신이 불가능
REST란 형식의 API
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가 더 포괄적인 범위
GET,POST의 차이
GET www.DoNgineer.com/write?id=123w831 와 같은 형식.
-- 어떤 정보를 가져와서 조회하기 위해 사용되는 방식
-- URL에 변수(데이터)를 포함시켜 요청함
-- 데이터를 Header(헤더)에 포함하여 전송함
-- URL에 데이터가 노출되어 보안에 취약
-- 캐싱할 수 있음
POST
-- 데이터를 서버로 제출해 추가 또는 수정하기 위해 사용하는 방식
-- URL에 변수(데이터)를 노출하지 않고 요청
-- 데이터를 Body(바디)에 포함
-- URL에 데이터가 노출되지 않아 기본 보안은 되어 있음
-- 캐싱할 수 없음(다만 그 안에 아키텍처로 캐싱할 수 있음)
GET | POST | |
---|---|---|
URL에 데이터 노출 여부 | O | X |
URL예시 | localhost:8080/login?id=jodong2 | localhost:8080/login |
데이터의 위치 | Header | Body |
캐싱 가능 여부 | O | X |
if URL에 데이터가 노출된다?! return GET
else : POST
Header와 Body
HTTP통신은 Request하고, Response를 받을 때 정보를 패킷(Packet)에 저장
Packet 구조 : HEADER/BODY
HEADER: 보내는 주소, 받는주소, 시간,
Body: 실제 전달하려는 내용
크롬창에 개발자도구 같은거 키고 네트워크 탭에서 새로고침 좀 시키면 Response Header, Request Header 등등을 볼 수 있음.
PUT vs PATCH
클라이언트 요청에 따라 서버가 어떻게 반응하는지를 알려주는 Code
Status Code
1xx(정보) : 요청을 받았고, 프로세스를 계속 진행함
2xx(성공) : 요청을 성공적으로 받았고 실행함
3xx(리다이렉션) : 요청 완료를 위한 추가 작업이 필요
4xx(클라이언트 오류) : 요청 문법이 잘못되었거나 요청을 처리할 수 없음
5xx(서버 오류) : 서버가 요청에 대해 실패함
200번대를 많이 보시게 될거예요 ! -> 저는 4~500번대를 더 많이 봤어요 ㅠ^ㅠ
-비동기(Async) : 요청을 보낼 때 응답 상태와 상관없이 다음 동작을 수행함. A작업과 B작업이 동시에 실행됨
-- 독립사건이면 비동기 사용
파이썬의 함수는 전부 동기식으로 처리 됨. -> Async를 붙이게 되면 비동기방식으로 처리 됨
43억개가 모잘랐다고?.. 콤퓨타.. 위대하다..
-- localhost, 127.0.0.1 : 현재 사용중인 Local PC -> 내 컴퓨터
-- 0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소 -> 클라우드때 자주 봤던 숫자들.. 모든것들을 열 수 있다(?!)
-- 개인 PC보급으로 누구나 PC를 사용해 IPv4로 할당할 수 있는 한계점 진입, IPv6이 나옴
최근 떠오르는 Python Web Framework
Jetbrain Python Developer Survey 기준
FastAPI | Flask | Django | |
---|---|---|---|
2021 | 14% | 46% | 45% |
2020 | 12% | 46% | 43% |
2019 | 0% | 48% | 44% |
뭐지?! 여러개를 사용하는건가?
100%를 넘어가네 ㅎㅎ..
FastAPI특징
High Performance
-- Node.js, go와 대등한 성능
Easy
-- Flask와 비슷한 구조
-- Microservice에 적합
Productivity
-- Swagger 자동생성
-- Pydantic을 이용한 Serialization
장고의 경우 ml서비스 만들땐 좀 무겁다 !!
간결한 Router문법 예시
Flask :
@app.route("/",methods=["GET"])
@app.route("/",methods=["POST"])
FastAPI:
@app.get("/")
@app.post("/")
FastAPI에서 자주 사용되는 프로젝트 구조 소개
Poetry라는 가상 환경 및 의존성 관리 소개
프로젝트의 코드가 들어갈 모듈 설정(app). 대안 : 프로젝트 이름, src 등
main.py는 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할
-- Entrypoint: 프로그래밍 언어에서 최상위 코드가 실행되는 시작점 또는 프로그램 진입점
main.py 또는 app.py : FastAPI의 애플리케이션과 Router 설정
model.py는 ML model에 대한 클래스와 함수 정의
어렵다면 노트북으로 만들고 하나하나 옮기는 방식으로 연습해보기
앞으로는 하나의 파일에는 하나의 목적성에 맞는 함수들만 저장한다 !!
utils.py보다 유틸도 목적에 맞게 나눠서 저장.
model.py predict.py 등
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(?)가 보임
FastAPI 프로젝트를 만들기 위해 아래 패키지들이 필요
프로젝트 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파일
아주 기초적인 웹 서버 : 루트("/")로 접근하면 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가 유용한 이유
만든 API를 클라이언트에서 호출하는 경우(협업)
-- Q) 어떻게 Request해야 하죠?
-- A) 이 인자를 주시면 돼요 ~~!
-- 1~2번은 말할 수 있지만 만약 50명이 계속 물어본다면...?
REST API 설계 및 문서화할 때 사용
다른 개발팀과 협업하는 경우
구축된 프로젝트를 유지보수하는 경우
하지만 코드짜기도 바쁜데 문서도 가서 수정해야함...
postman이나 curl을 통해 테스트해볼 수 있지만 Swagger에서 사용하면 편함.
변성윤 강사님의 백엔드를 공부하며 이런걸 먼저 알았다면 좋았겠다.를 모은 강의였다.
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함을 지향한다.
HTTP Header는 GET과 POST 둘 다 사용할 수 있어서 GET 메소드가 Header를 이용하여 데이터를 보낸다는 내용은 잘못된 것 같습니다