Fast API 가상환경 구축하고 API 만들기
SSH 원격접속에 성공했으니, 이제 Python Fast API로 가상환경을 생성해서 데이터와 API를 만들어볼 차례다.
이 부분은 SSH 원격접속이 되지 않아서 삽질하면서 틈틈이 공부했기 때문에 그리 어려운 부분이 없었다.
하나씩 차근차근 살펴보자.👀
※ 삽질 기록 - https://hjinn0813.tistory.com/139
VS code에서 SSH 원격접속하기
며칠 고생했던걸 기록해둬야할 것 같아서 적어보는, 일기 같은 실험기록.✍
hjinn0813.tistory.com
디렉토리 생성
SSH 원격접속에 성공한 후에 가장 먼저 할 일은 가상환경을 만들 디렉토리를 생성하는 일이었다.
기존에 VS code 터미널에서 사용했던 mkdir, cd 명령어로 디렉토리를 만들고 이동했다.
# 디렉토리 생성
mkdir python-venv
# 디렉토리로 이동
cd python-venv
그 다음 순서로 가상환경을 생성하려고 했으나, venv 모듈이 없다는 에러가 발생해서 Python 버전을 확인했다. 두 가지 버전이 설치되어 있었고, 가상환경을 만들려면 Python 3 명령어를 사용하라고 ChatGPT가 추천해줘서 시키는대로 했다.
# 가상환경 생성 시도
$ python -m venv .venv
/usr/bin/python: No module named venv
# Python 버전 확인
$ python --version
Python 2.7.5
$ python3 --version
Python 3.12.4
- venv는 "Virtual Environment"의 약자로, 가상환경을 만들어주는 Python 내장 모듈이다.
- 가상환경은 Python 프로젝트마다 독립된 환경을 만들어주는 기능이다. 여러 프로젝트를 진행하면 각각 필요한 Python 버전이나 패키지가 다를 수 있는데, 이때 가상환경을 사용하면 프로젝트 간의 충돌을 방지해준다.
가상환경 생성
# 가상환경 생성
$ python3 -m venv fastapi
- ChatGPT가 추천해준대로 Python 3 버전으로 가상환경을 생성하고 활성화했다.
- 가상환경이 생성될 디렉토리 이름을 입력할 때, 앞에 점의 유무에 따라 의미가 다르다.
점이 있으면 숨김폴더, 점이 없으면 일반폴더. - 디렉토리 이름은 보통 .venv 라는 이름으로 만드는게 관례지만 내 마음대로 작명해도 상관없다고 해서, 나는 fastapi 라고 만들었다. 이렇게 가상환경을 만들면 해당 폴더 하위에 bin, lib, include 등 디렉토리가 생성되고 여기에 가상환경에서 사용되는 실행 파일들과 패키지들이 들어있다.
가상환경 활성화
# 가상환경 활성화
$ source fastapi/bin/activate
- 다음 순서는 만든 가상환경 활성화하기.
이 과정은 매번 프로젝트 작업을 할 때마다 진행해야 한다.
나는 이 과정이 React 프로젝트에서 npm start로 화면을 켜두는 것과 같은 개념이라고 이해했다. - Python 가상환경과 관련된 모든 명령어는 서버의 운영체제를 기반으로 작성한다.
내가 사용할 서버는 리눅스 기반이니까 리눅스 기준 명령어를 사용했다. - bin 디렉토리는 binary의 줄임말로, 실행 가능한 프로그램이나 스크립트 파일이 있는 폴더를 의미한다.
가상환경을 만들면 bin 디렉토리에 Python 인터프리터와 패키지의 실행 파일이 들어간다.
bin 디렉토리의 실행 파일들은 가상환경에서만 사용할 수 있어서, 전역에 있는 다른 패키지랑 충돌하지 않고 해당 가상환경에서 필요한 버전만 사용할 수 있다. 나는 bin 디렉토리를 React 프로젝트의 package.json 이나 node_modules 디렉토리와 비슷한 개념이라고 이해했다.
Fast API, Uvicorn 설치
# Fast API 설치
$ pip install fastapi
# Uvicorn 설치
$ pip install uvicorn
- 가상환경에서 Fast API로 데이터와 API를 만드는게 주요 목적이기 때문에 pip 명령어를 통해 설치했다.
- pip는 Python의 패키지 관리 도구로서, 필요한 외부 패키지(라이브러리)를 설치/관리하는 프로그램이다.
나는 React 프로젝트에서 자주 사용했던 Node.js의 npm 같은 역할이라고 이해했다. - Uvicorn은 Fast API 같은 비동기 웹 프레임워크를 실행하는데 필요한 'ASGI 서버'이다.
- ASGI(Application Server Gateway Interface)는 웹 애플리케이션과 서버가 서로 데이터를 주고받을 수 있도록 해주는 규칙이다. 비동기 프로그래밍을 지원하여 여러 요청을 동시에 처리할 수 있기 때문에, 실시간 애플리케이션에서 유용하다. HTTP 외에 WebSocket 같은 다른 프로토콜도 지원하고, Django나 FastAPI 등 다양한 웹 프레임워크와 함께 사용할 수 있으며, 필요에 따라 커스터마이징이 가능하다.
JSON 형식으로 데이터 만들기
업무이자 공부지만 이왕 하는거 내가 좋아하는걸 녹여보면 즐거울 것 같아서, 개인적으로 응원하는 프로배구팀의 이번 시즌 선수 명단을 만들었다. 선수 명단이니까 배번, 이름, 포지션 정도만 넣었고 특정 개체를 추출하기 편하라고 ID를 추가했다.
(올해는 제발 포스트시즌 가보자..🙏)
API 만들기 위해 py 파일에 코드 작성
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import json
# Fast API 애플리케이션 생성
app = FastAPI()
# CORS 설정
app.add_middleware(
CORSMiddleware, ## CORS 설정 적용
allow_origins=["*"], ## 허용할 도메인 리스트
allow_credentials=True, ## 인증 정보 요청 허용
allow_methods=["*"], ## 허용할 HTTP 메서드 리스트
allow_headers=["*"], ## 허용할 헤더 리스트
)
- 이 py 파일의 코드를 해석하는데 시간이 약간 소요되었다.
우선 React 프로젝트 때처럼 기능들을 제대로 사용하기 위해서 import하면서 작성 시작. - app 이라는 변수에 FastAPI()를 할당하면서 애플리케이션을 생성한다.
- API를 실행하는 서버의 포트와 React 프로젝트를 진행하는 포트의 번호가 달라서 CORS 에러가 발생할 수 있기 때문에, API 만들면서 CORS 미들웨어를 설정했다. 이걸 설정하지 않으면 프론트엔드에서 API를 가져와도 데이터가 뜨지 않는다.
("Network Error"라고 에러 메시지 출력함!)
※ CORS 관련 내용은 여기 참고 → https://hjinn0813.tistory.com/129
CORS 개념 정리
CORS란? Cross-Origin Resource Sharing. 영어를 직역하자면, 출처가 다른 리소스를 공유하는 정책.
hjinn0813.tistory.com
# JSON 파일에서 데이터 읽기
def load_data():
with open("player.json", "r", encoding="utf-8") as f:
return json.load(f)
# GET 요청으로 /players 주소에 접근할 때 작동하는 API 정의
@app.get("/players")
def get_players():
data = load_data()
return data["players"]
# GET 요청으로 /players/{player_id} 주소에 접근할 때 작동하는 API 정의
@app.get("/players/{player_id}")
def get_player(player_id: int):
data = load_data()
player = next((player for player in data["players"] if player["id"] == player_id), None)
return player
- 그 다음으로는 load_data()를 만들어서 데이터를 불러오는 함수를 작성했다.
player.json 파일을 UTF-8 형식으로 열어서 읽고, JSON 데이터를 Python 객체로 변환한 후 내보낸다.
def는 Python에서 함수를 정의하는 키워드. JS의 Function 키워드와 같은 역할이라고 이해하면 된다.
그리고 json.load()에서 load() 메서드는 JSON 파일을 Python으로 변환해주는 기능이 있다. - 두번째 코드에서는 프론트엔드에서 GET 요청으로 /players 에 접근할 때 API가 어떻게 작동할 것인지 설정했다.
load_data() 함수를 통해 선수들의 정보를 불러오고, 불러온 정보들을 players라는 배열로 반환한다. - 세번째 코드는 프론트엔드에서 GET 요청으로 /players/{player_id}에 접근하는 경우에 대한 API 설정이다.
아까 첫번째 코드에서 가져온 data["players"] 배열에서 선수의 id가 정수일 때에 player_id와 일치하는 선수를 찾는다.
next()는 이터레이터에서 다음 값을 꺼내려고 사용하는 함수이고 next(.. , none)의 형식으로 사용한다. 여기의 첫번째 매개변수가 이터레이터이다. 이터레이터는 Python에서 데이터를 하나씩 꺼낼 수 있는 객체로, 순차적으로 데이터에 접근 가능한 자료형 데이터 타입에서 사용된다. 그래서 next() 함수를 해석하자면, JSON에서 선수들을 id 순서대로 하나씩 꺼내다가 마지막 선수를 꺼낸 후에 none을 반환한다.
Uvicorn 명령어로 API 실행
# 가상환경 활성화
$ source fastapi/bin/activate
# 위치 이동
$ cd fastapi/app
# 포트 열고 API 실행
$ uvicorn player_api:app --reload --port 8001
- 드디어 API 만들기의 마지막 단계이다. 만든 API를 실행해야 프론트엔드에서 불러와서 사용할 수 있다.
- API를 실행하려면 가상환경이 활성화된 상태에서, API를 만들어놓은 py 파일이 있는 위치로 이동한 후에 API 실행 명령어를 입력해서 포트를 열면 된다. 기본적으로 uvicorn의 서버 포트는 8000을 사용하는데, 나는 명령어를 입력했더니 자꾸 해당 포트가 사용 중이라서 쓸 수 없다고 에러가 발생해서 8001로 열었다.
- 주의할 점은 이렇게 만든 API를 프론트엔드에서 불러와서 사용하려면 포트가 열려있는 상태여야 한다. 나는 해당 API를 원격접속해서 가상환경에서 만들었기 때문에 프론트엔드에서 사용하려면 원격접속해서 가상환경에서 포트를 열어야 제대로 사용할 수 있다.
아무튼 이렇게 하여, 햇병아리 프론트엔드 개발자의 백엔드 맛보기 끝!
내가 만든 API가 실행되어 화면에서 보여지는걸 확인하니까 재미는 있었지만, 역시 백엔드는 쉽지 않다..😂
참고했던 글
https://fastapi.tiangolo.com/ko/virtual-environments/
Virtual Environments - FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production
fastapi.tiangolo.com
Visual Studio Code 원격 개발 기능으로 서버 접속해서 파이썬 파일 실행, 디버깅 하는 방법
taptorestart.tistory.com