NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Python FastAPI - 파이썬으로 웹서버 만들기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 매크로에 대한 이야기는 아니구요^^; 오늘은 파이썬으로 웹서버를 어떻게 만드는지 알아보려고 합니다. 일반적으로 웹서버는 IIS(Internet Information Service)나 아파치 톰캣(Apache Tomcat) 또는 제우스(JUES), Node.js, 장고(django)등등이 있습니다. 파이썬에서는 대부분 장고나 플라스크(Flask)를 사용하고 있습니다. 그런데, 새롭게 등장한 FastAPI가 점유율을 빠르게 올리고 있어서 한번 사용해보려고 합니다.

    UK8lAcU.png

     

     

    FastAPI는 django와 Flask보다 약 2배 빠릅니다. 코드도 간결하고, 배우기가 쉽다는 장점이 있습니다. 아래는 20개 쿼리를 요청하고 응답 받은 밴치마킹 자료입니다. FastAPI가 가장 성능이 좋다는걸 알 수 있습니다. Flask와 django는 중하위에 위치하고 있군요. 이렇다보니 FastAPI를 사용하고자 하는 회사들이 많아지는거 같습니다.

    xjsdjX5.png

     

     

    FastAPI가 약 2배 이상 빠른 이유는 기본적으로 비동기 처리를 지원하기 때문입니다. 엔지엠 매크로에도 서브 스크립트나 타이머, 예약, 스케줄러와 같은 기능들은 비동기를 지원하고 있습니다. 비동기는 특정 코드 또는 동작이 오래 걸리면 알아서 동작하도록 놔두고 그 다음 코드를 실행하도록 해줍니다. 좀 더 쉬운 예를 들어보면, 윈도우 프로그램을 사용할 때 어떤 버튼 또는 동작을 수행했을 때 해당 동작이 완료될 때까지 프로그램이 멈춘것과 같은 현상을 본적이 있을겁니다. 이런 경우가 동기 방식입니다. 버튼을 누른 후 동작이 완료될 때까지 다른 어떤 작업도 할 수 없는게 동기(Synchronous) 방식입니다. 비동기(Asynchronous)는 이와 반대겠죠^^? 아래 그림을 보면 좀 더 이해하기 쉬울겁니다.

    Vmtr1Qs.png

     

     

    이제 비동기로 동작하면 왜 더 빠른지 이해했겠죠? Http 웹서버가 갖춰야할 기능을 모두 가지고 있습니다. Restful API, 데이타베이스 연동, 회원 인증, 데이타 검사, 웹소켓, async/await, type, API 문서 자동 생성도 가능합니다. Java Spring에서 스웨거(Swagger)와 같다고 생각하시면 될거 같아요. 웹프레임워크도 러닝 커브가 낮은 곳으로 이동하고 있습니다. Angular에서 React로~ 그리고, 현재는 Vue를 많이 쓰는거 같습니다. 실제로 성능이 사용 편의성 때문에 FastAPI로 넘어가는건 아닙니다. 기존 django나 Flask의 아키텍쳐에서 처리하기 어려운 마이크로 서비스(Micro Service)를 쉽게 구현할 수 있기 때문입니다.

    TyfvJmX.png

     

     

    마이크로 서비스가 요즘 대세이긴 하죠~ C#이나 Java에서도 마이크로 서비스를 구현하기 위한 여러가지 아키텍쳐나 방법론들이 쏟아지고 있으니까요. FastAPI에 대한 소개는 이정도로 해두고요. 실제로 얼마나 쉽게 코딩이 가능한지 테스트를 해보도록 하겠습니다. 이 예제를 학습하려면 파이썬과 Visual Studio Code가 설치되어 있어야 합니다. 파이썬 개발환경을 만드는 방법은 아래 글을 참고하세요.

    [ 파이썬 설치 방법 ]

    [ 파이썬 개발 환경 및 예제들 ]

     

    Visual Studio Code를 실행한 후 워크 스페이스(Work Space)폴더를 열어줍니다. 그리고, 새 파일을 추가하세요. 저는 main.py로 저장했습니다.

    tFywtHL.png

     

     

    개발하기 위한 준비는 완료가 되었습니다. FastAPI 패키지를 설치해야 하는데요. 아래와 같이 하단의 터미널에서 "pip install fastapi"를 입력 후 엔터를 쳐보세요. 제가 이 글을 작성하는 시점에 FastAPI의 최신 버전은 3.6.1인가 봅니다.

    8G0gJRq.png

     

     

    그리고, 실시간 미리보기를 하고 싶으시면 유비콘 패키지도 같이 설치해주시면 됩니다.

    pip install "uvicorn[standard]"

    yyUmfWw.png

     

     

    이렇게해서 환경 구성은 마무리가 되었습니다. 다시 main.py로 돌아와서 서버를 만들기 위해 아래 2줄 코딩을 추가하세요.

    from fastapi import FastAPI
    app = FastAPI()

     

    서버에 실제 기능을 추가 해볼께요. 기본적으로 API를 만들기 위한 기본적인 템플릿이 존재합니다. 아래와 같이 3줄을 추가하세요. 기본적으로 이렇게 추가해야 합니다. 개발자분들이 아래 코드를 보면~ 어디를 어떻게 바꾸면 어떻게 동작하겠구나가 머리속에 그려질겁니다. 왜냐하면 API나 함수의 사용 방법은 어떤 언어든지 비슷하기 때문입니다.

    @app.get("/")
    def ngmsoftware():
        return "Hello ngmsoftware!"

     

    이 3줄은 비즈니스 로직이 들어가 있지는 않지만, API를 제공하기 위한 템플릿으로 이해하면 됩니다. 그래서, 필요한 서비스가 있을 때마다 아래와 같이 코드를 추가해주면 됩니다.

    from fastapi import FastAPI
    app = FastAPI()
    
    @app.get("/")
    def ngmsoftware():
        return "Hello ngmsoftware!"
    
    @app.get("/")
    def 엔지엠매크로():
        return "안녕하세요! 반갑습니다."

     

     

    @app.get 또는 @app.post를 사용할 수 있습니다. get은 주소로 인자를 넘겨주고 post는 form으로 인자를 넘겨줍니다. 이 부분은 나중에 기회가 되면 좀 더 자세하게 설명하도록 할께요. 우선, get 뒤에 "/"는 루트를 말합니다. 그래서, google.com, naver.com, kakao.com과 같이 처음에 보여질 화면을 말합니다. 그 다음 ngmsoftware는 접근하는 경로이므로 용도에 맞게 자유롭게 작명하시면 됩니다. 함수명 만들듯이요^^; 이름 짓는게 가장 어렵지만요~ 이제 잘 동작하는지 테스트 해볼까요? 터미널에서 "uvicorn main:app --reload"를 입력한 후 엔터를 쳐보세요.

    T1ODqyM.png

     

     

    콘트롤키를 누른 상태에서 링크를 클릭하세요.

    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

     

    아래와 같이 사이트가 열립니다. 그리고, 서버로부터 메세지도 정상적으로 가져온걸 알 수 있습니다.

    PwF1lbQ.png

     

     

    두번째 데이타를 받기 위해 함수를 아래와 같이 수정 해보세요. 자바스크립트 오브젝트 형식도 사용이 가능합니다. Json 포멧으로 입력하면 그대로 클라이언트에 전달 해줍니다. 물론, 문자니까요.

    @app.get("/hello")
    def 엔지엠매크로():
        return {"NGM":"안녕하세요! 반갑습니다."}

    yzYRP6P.png

     

     

    URL 뒤에 docs를 입력하고, 엔터를 쳐보면 아래와 같이 API 목록을 보여줍니다. 스웨거를 사용 해보신 분들은 쉽게 이용할 수 있을겁니다.

    ti2fcmI.png

     

     

    실제 운영 환경에서 매인 페이지에서 문자를 보여줄수는 없잖아요? 그래서, 페이지를 쉽게 표시할 수 있는 기능도 존재합니다. 일반적으로 웹프로그래밍을 할 때 HTML, CSS, Javascript를 같이 사용하게 됩니다. FastAPI는 웹서버를 쉽게 사용할 수 있도록 해주는 도구이므로 실제 비즈니스 로직이나 보안, 디자인과 같은 것들은 별도 어플리케이션 서버나 프로세스를 만들어줘야 합니다. 일단, HTML 파일을 표시하려면 아래와 같이 FileResponse 클래스를 추가해야 합니다.

    from fastapi.responses import FileResponse

     

    일반적으로 Java, php등등... 리눅스쪽은 기본 페이지를 index.html, index.jsp, index.php와 같이 인덱스를 사용합니다. 그래서 대부분의 서버들이 기본 페이지를 설정하지 않으면 자동으로 index 파일을 처음에 읽어들이죠. 그런데, 윈도우 계열은 default.html, default, asp, default.aspx와 같이 디폴트를 사용합니다. 그러나~ 서버 설정에서 기본 페이지는 변경할 수 있으므로 문제가 되는건 아닙니다. 아무튼, 저는 index.html 파일이 이미 존재해서 default.html로 새 파일을 만들었습니다. 그리고, 엔지엠소프트웨어 매인 페이지의 소스를 긁어다가 붙여넣었습니다. 여러분들은 간단한 코드라도 작성 해보세요^^

    jkZCRgm.png

     

     

    코드를 아래와 같이 변경하세요. FileResponse에 html 파일의 경로를 적어주면 됩니다.

    @app.get("/")
    def ngmsoftware():
        return FileResponse('default.html')

     

    웹서버를 다시 실행 해보면, 아래와 같이 엔지엠소프트웨어 홈페이지가 잘 보여지는걸 알 수 있습니다. 물론, 여러분들은 코딩한 내용이 보이겠지만요~

    wp14qLQ.png

     

     

    이외에도 사용자로부터 여러가지 정보를 받아서(일반적으로 아이디, 패스워드와 같은...) 로그인 처리를 한다거나 어떤 데이타를 내려준다거나 하는것도 쉽게 구현할 수 있습니다. 프론트엔드에서 요청한 input 콘트롤에 대응하는 모델을 만든 후 모델을 바인딩하여 데이타를 처리할 수 있기 때문입니다. 다음 시간에는 간단하게 데이타베이스를 만들어서 실제 서버에 있는 데이타를 검색하고, 사용자에게 알려주는 기능을 만들어 보도록 하겠습니다^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.