ChangHyeon Nam's Blog notes and thoughts

ping - pong api

Comments

깔끔한 파이썬 탄탄한 백엔드 (송은우 지음) chapter 3장을 참고했습니다.

3장에서는 Flask에 대한 간단한 소개와 Flask 기반으로 작동하는 API를 구현해 보았습니다.


Flask

파이선으로 웹 어플리케이션을 구현할 때 사용되는 프레임워크입니다. 공식 홈페이지에서 Flask를 micro web framework 라고 하면서, 아주 가벼운 프레임워크라고 설명하고 있습니다. 다른 웹 프레임워크에 비해 가볍고, 쉽게 배울수 있습니다. API 개발 입문용으로 입문하기 좋은 프레임워크인 동시에 실제 대규모 시스템에서도 사용된다고 합니다.

모든 웹 시스템은 소켓을 통해 네트워크와 연결하여 외부 시스템으로부터 통신을 주고받습니다. 이 기능은 규격화되어 시스템마다 따로 구현할 필요 없이, 이미 구현되어 있는 코드를 재사용하면 됩니다. Flask와 같은 웹 프레임워크를 사용함으로써 개발자는 웹시스템을 통해 제공하고자 하는 비즈니스 로직에만 집중할 수 있습니다.

(웹 프레임워크엔 소켓통신이 이미 내장되어있다는 의미!)


ping 엔드포인트 구현하기

엔드포인트는 api 서버가 제공하는 통신 채널 혹은 접점이라고 할 수 있다. 프론트엔드 서버 등의 클라이언트가 백엔드 api 서버와 통신할때 엔드포인트에 접속하는 형태로 통신하게 된다. 각 엔드 포인트는 고유의 url 주소를 가지게 되며, 고유의 url 주소를 통해 엔드포인트에 접속할 수 있다.

일반적으로 각 엔드 포인트는 고유의 기능을 담당하고 있다. 이러한 엔드포인트들이 모여서 하나의 api기능을 구성하는 것이다. 예를 들어 sns 서비스를 구현한다고 했을때, sign up end point, login end point 등의 엔드포인트로 구성됩니다.

(최근 나온 기술인 GraphQL(Graph Query Language)는 여러 엔드포인트로 구성되어 있지 않고 단 하나의 엔드포인트로 모든 기능을 제공하는 형태로 구성됩니다.0

ping 엔드 포인트는 단순히 “pong”이라는 텍스트를 리턴하는 엔드포인트 입니다. ping 엔드포인트는 주로 API 서버가 현재 운행되고 있는지 정지된 상태인지를 간단하게 확인될때 사용합니다. 이런 엔드포인트를 health check 엔드포인트라고도 합니다.

저는 pycharm 에디터를 이용하여 가상환경을 만들어 flask를 사용하였습니다.

from flask import Flask

app = Flask(__name__)

@app.route("/ping",methods=['GET'])
def ping():
    return "pong"

@app.route('/')
def hello_world():  
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

위의 코드에 대해 하나씩 살펴 봅시다.

  • Flask class를 객체화 시켜 app변수에 저장하였습니다. 이 app변수가 API application ( or Flask web application)이라고 할수 있습니다. app변수에 API설정과 엔드포인트를 추가하면 API가 완성됩니다.

      app = Flask(__name__)
    
  • Flask의 route decorator를 사용하여 ping함수를 엔드포인트 함수로 등록하였으며, 고유주소는 “ping”이고, HTTP 메서드 GET을 설정하였습니다. ping함수에서 “pong”을 리턴하면 flask가 HTTP응답으로 변환하여 해당 HTTP 요청을 보낸 클라이언트에게 전송합니다.

      @app.route("/ping",methods=['GET'])
      def ping():
          return "pong"
    

    HTTP 메서드에 대해서는 다음장에서 살펴보겠습니다.

  • 같은 방식으로 데코레이터를 이용하여 hello_world함수를 엔드포인트로 설정하였습니다. 고유주소는 “/”이며, 이 주소에 접근을 하면 ‘hello world’를 반환합니다.

      @app.route('/')
      def hello_world():  
          return 'Hello World!'
    
  • Flask에서 일반적으로 route decorator를 사용해서 함수들을 엔드포인트로 등록하는 방식으로 사용됩니다. 즉, Flask에서 엔드포인트를 구현한다는 것은 결국 일반 함수를 구현하는 것과 큰 차이가 없습니다.


API 실행하기

app.run() 에 ip주소를 명시하지 않으면 localhost(=127.0.0.1)에서만 접근가능하고, 포트번호 또한 적지 않으면 5000번으로 기본 설정됩니다.

terminal에서 다음 코드를 실행하면 api를 실행시킬 수 있습니다. (pycharm에서 run해도 실행됩니다.)

FLASK_APP=app.py FLASK_DEBUG=1 flask run

FLASK_DEBUG=1로 설정해주면 디버그 모드가 활성화 됩니다.

ping 엔드포인트가 제대로 돌아가는지 실제로 api에 접속해서 테스트 해보겠습니다. ping 엔드포인트에 접속하기 위해서 ping 엔드포인트에 HTTP 요청을 보내면 됩니다. hhtpie 툴을 이용하여 http 요청을 보냅니다. 다음 코드를 실행하면 ping 엔드포인트에 접속하여 get 요청을 보낼 수 있습니다.

http -v GET http://127.0.0.1:5000/ping

-v : verbose 옵션에 해당 http 요청과 응답에 관한 추가적인 정보를 출력됩니다. 다음과 같은 정보가 출력이 됩니다.

GET /ping HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: 127.0.0.1:5000
User-Agent: HTTPie/2.6.0

HTTP/1.0 200 OK
Content-Length: 4
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Nov 2021 08:07:17 GMT
Server: Werkzeug/2.0.2 Python/3.8.7

HTTP 요청에 “pong”이라는 텍스트가 응답으로 온것을 확인할 수 있습니다.