안녕하세요! 직전에 Ubuntu를 가상환경(UTM)에 설치하는 포스팅을 했습니다.
이 포스팅은 로컬에서 이 가상환경 서버에 접속하는 과정 중에 어떤 문제들이 있었고, 어떻게 해결했는지에 대한 기록입니다.
서버 관련은 초짜라 로컬에서 계속 127.0.0.1, localhost 입력하면서 왜 안되지?? 만 수도 없이 내뱉으며 삽질했습니다ㅠ
FastAPI란?
FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python의 API를 빌드하기 위한 웹 프레임워크입니다. - 공식 문서 -
FastAPI는 Django, Flask와 같은 파이썬 프레임워크입니다.
빠르고, 쉽고, API에 최적화 되어있기 때문에 급상승 중인 웹 애플리케이션 프레임워크라고 합니다.
FastAPI는 비동기 처리와 빠른 성능을 자랑합니다.
다른 Python 프레임워크에 비해 성능이 뛰어나며, Google의 gRPC나 Node.js와 같은 빠른 프레임워크와 비슷한 속도를 보여줍니다.
API를 자동으로 문서화해줍니다.
기본적으로 Swagger UI와 ReDoc을 제공하여 API를 쉽게 테스트하고 문서화할 수 있습니다.
OpenAPI 표준을 기반으로 한 문서화가 자동으로 생성됩니다.
타이핑 힌트를 통해 코드의 가독성과 안정성을 높이고, 자동으로 입력 값 검증을 할 수 있습니다.
예를 들어, 요청 파라미터나 바디의 데이터 타입을 명확하게 정의할 수 있습니다.
async/await 구문을 사용하여 비동기 요청을 처리할 수 있습니다.
이를 통해 더 많은 동시 요청을 처리할 수 있게 되어 성능이 높아집니다.
Pydantic을 사용하여 요청받은 데이터를 자동으로 검증합니다.
예를 들어, 클라이언트가 전송한 JSON 데이터를 Python 객체로 자동 변환하고, 타입 검사 및 유효성 검사도 수행됩니다.
코드 작성 시 바로 자동으로 문서화되고, 디버깅 시 오류 메시지와 타이핑 정보를 잘 제공합니다.
이로 인해 개발자가 오류를 빠르게 찾고 수정할 수 있습니다.
이 외에도, 공식 문서가 아주 잘 되어있다는 장점 또한 있습니다.
이 포스팅은 해당 공식 문서에서 설명하는 과정 중 서버를 여는 과정까지만 진행했습니다.
FastAPI가 파이썬 프레임워크이기 때문에, 파이썬을 먼저 리눅스에 설치해주어야 합니다.
한 줄이면 금방 끝납니다.
sudo apt install python3
venv는 Virtual Environment의 약자로, UTM과 같은 가상환경입니다.
venv를 통해 여러 개의 파이썬 패키지를 독립적으로 관리할 수 있는 것이죠.
즉, 로컬(맥) 위에 가상환경(리눅스 기반) 위에 가상환경(파이썬 패키지)처럼 실행되는 것입니다.
이것도 한 줄이면 금방 끝납니다.
sudo apt install python3-venv
파이썬 가상환경을 만들어줍니다.
가장 뒤에 있는 문자가 가상환경 이름입니다.
해당 명령어를 통해 venv라는 이름의 파이썬 가상환경을 생성하는 것이죠.
python3 -m venv venv
이후 ls를 입력하면 venv 라는 폴더가 새로 생겨있습니다.
생성할 때 정한 이름으로 폴더가 생성됩니다.
가장 앞의 venv는 생성한 가상환경 폴더입니다.
해당 명령어를 통해 활성화시켜줍니다.
source ./venv/bin/activate
활성화 시키면 다음 사진과 같이 입력 줄의 가장 앞에 가상환경의 이름이 붙습니다.
비활성화를 위해선 단어 하나만 입력해주면 됩니다.
deactivate
이제 파이썬 기반의 환경이므로, pip를 통해 나머지를 설치해주도록 합시다.
해당 과정 부터는 FastAPI 공식 사이트에서 그대로 따라하실 수 있습니다.
pip install fastapi
FastAPI에서 필수적으로 사용되는 uvicorn을 설치합니다.
uvicorn에 대한 내용은 해당 블로그에서 확인하실 수 있습니다.
그냥 pip install uvicorn을 해도 되지만, 최소한의 파일로 작동할 수 있게 하기 위해 다음과 같이 합니다.
pip install "uvicorn[standard]"
서버를 실행시키기 위한 파이썬 파일을 생성합니다.
해당 명령어를 통해 파일을 생성하시면 됩니다.
vi main.py
main.py에는 다음과 같은 내용을 입력하고 저장합니다.
from fastapi import FastAPI # fastapi 클래스를 불러옵니다.
app = FastAPI() # FastAPI 클래스를 바탕으로 app이란 인스턴스를 만듭니다.
@app.get("/") # GET 메소드로 가장 루트 url로 접속할 경우
async def root(): # root() 함수를 실행하고
return {"message": "Hello World"} # Hello World란 메시지를 반환합니다.
해당 명령어를 통해 서버를 실행합니다.
main: main.py 파일
app: main.py에서 생성한 FastAPI 객체
--reload: 코드가 변경된 후 서버 재시작(개발 환경에서만 사용)
uvicorn main:app --reload
해당 코드를 실행하면 다음과 같은 내용이 나옵니다.
그럼 이제 주소창에 127.0.0.1:8000
을 넣으면 {"message" :"Hello World"}
와 같은 내용이 출력되겠..
지 라는 생각을 하면 당연히 안됩니다!! (로컬-로컬, VM-VM(동일)은 일반적으로 됩니다.)
로컬호스트에 대한 개념을 몰라서 이거 해결하느라 몇시간 삽질한거였습니다..
(IP는 대충 예시로 다르다는 것을 표현하였습니다.)
로컬과 가상환경은 다른 IP 주소를 가지고 있기 때문에, localhost나 127.0.0.1로는 접속할 수 없습니다.
해당 과정을 해결하기 위해 해당 블로그와 GPT의 힘을 빌려 해결하였습니다.
결론은 가상환경의 IP와 로컬의 IP가 다르기 때문에 로컬호스트로는 접속이 불가능한 것이었고,
이를 위해 가상환경에서 네트워크 세팅을 하여 외부에서도 접속이 가능하도록 만들어 주어야 했습니다.
해당 블로그의 해결과정과 조금 다른 점은 yaml 파일의 이름이었습니다.
저는 50-cloud-init.yaml
이라는 파일이었어요.
ls /etc/netplan
명령어를 통해 파일 이름을 확인하고 수정해야 합니다!
변경 사항을 모두 적용했다면 다음과 같은 명령어로 서버를 열어주셔야 합니다.
0.0.0.0을 주소창에 치는 것이 아닌, 설정해준 고정 IP를 입력하셔야 합니다!!
(이것도 모르고 0.0.0.0:8000 입력하면서 또 삽질 계속했습니다.)
uvicorn main:app -reload --host 0.0.0.0 -- port 8000
결과적으로 다음과 같이 실행되며 정상적으로 로컬에서 가상환경의 서버로 접속이 성공했습니다!
로컬 웹페이지
가상환경 리눅스
생성된 API 문서(Swagger UI)
주소창 포트번호 뒤에 /docs
를 추가하면 나오는 페이지입니다.
정말 오랜만에 만져보는 리눅스였고, 서버 열기였습니다.
시간이 오래 지난 것도 있지만, 전공 수업을 열심히 듣고 기억했더라면 좀 더 빠르고 쉽게 하지 않았을까 싶네요..
과거를 반성하고 오늘의 삽질을 발판 삼아 열심히 공부해야겠습니다!!
https://typingdog.tistory.com/106
https://blog.iamwhatiam.co.kr/215
https://devocean.sk.com/blog/techBoardDetail.do?ID=165922&boardType=techBlog
https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS5997817104