⚡ API 개발 with Flask - 1

codeamor·2020년 6월 29일
0

API Development

목록 보기
1/9

참고가 되는 도서에서는 Flask를 이용해 API를 개발한다.
Flask를 쓰는 회사도 많기 때문에 Django 와 더불어 알고 있으면 좋다.
(실제로 Django만 알고 갔는데 현업에서 Flask를 써서 따로 공부해야 하는 경우가 적지 않다고 한다.)
필자는 이미 한 번 이해하고 진행해 본 내용을 정리하는 것이므로 설명이 부실할 수 있다.
온전하게 이해하고 진행하고자 한다면 책을 사서 읽어보기를 권한다.



✔️ Flask 소개 및 설치

: 파이썬으로 웹 애플리케이션(web application)을 구현할 때 사용되는 프레임워크(framework)다.

  • micro web framework, 즉 가벼운 웹 프레임 워크이다.
  • 대규모 시스템에 사용되어도 손색이 없고, 실제 여러 시스템에 사용된다.

가상 환경 설정

여기에서는 파이썬 가상 환경 중 conda 를 사용하여 작업을 진행한다.
따라서 개인 OS에 맞는 conda를 설치한 뒤에 아래의 내용들을 따라와야 한다.
설치가 완료되었다면 아래의 코드를 터미널에 입력한다.

  • 가상 환경 생성
    conda create --name api python=3.7
    name 은 자유롭게 지정하면 된다.

  • 가상 환경 활성화
    source activate api

    • 가상 환경을 비활성화하려면 source deactivate 를 입력한다.
  • 현재 생성되어 있는 가상 환경들의 리스트 확인
    conda env list


Flask 설치

만약 파이썬 가상 환경이 실행되고 있지 않은 상태에서 패키지를 설치하면 해당 패키지는 시스템에 설치되어 있는 파이썬에 종속되어 설치된다.
가상 환경 없이 패키지를 설치하면
지역(local) 에서만 쓰일 패키지를 전역(global) 에 설치하는 것이다.
전역 변수, 지역 변수 개념처럼 지역에만 쓰일 패키지는 지역에만 따로 설치해주자.
앞으로의 모든 코드들은 파이썬 가상 환경 하에서 진행된다.

  • 아래 명령어를 실행해 Flask 를 설치한다.

pip install flask

  • 설치가 완료 되었다면 python 명령어를 실행하여 파이썬 interactive mode로 들어간다.

python

  • Flask 를 사용하기 위해 아래 코드를 작성한다.
from flask import Flask
app = Flask("test")

에러가 뜨지 않으면 정상적으로 된 것이다.

📌 가상 환경을 비활성화한 상태에서는 가상 환경에서 설치한 패키지를 찾을 수 없다는 에러가 떠야 정상이다.
(에러가 안 떴다면 Flask를 가상 환경 없이, global 에 설치한 것이다.)



✔️ Ping 엔드포인트 구현하기

첫 API 개발은 ping 엔드포인트(endpoint)를 구현하는 것부터 시작한다.
엔드포인트는 API 서버가 제공하는 통신 채널 or 접점이다.
프론트엔드 서버 등의 클라이언트가 백엔드 API 서버와 통신할 때 엔드포인트에 접속하는 형태로 통신하게 된다.

  • 각 엔드포인트는 고유의 URL 주소를 가지게 되고, 이를 통해 해당 엔드포인트에 접속할 수 있다.
  • 각 엔드포인트는 일반적으로 고유의 기능을 담당한다.
    이들이 모여서 하나의 API를 구성한다.

📌 최근의 기술인 GraphQL(Graph Query Language)은 여러 엔드포인트가 아닌 단 하나의 엔드포인트로 모든 기능을 제공하는 형태로 구성된다.

ping 엔드포인트는 단순히 "pong" 이라는 텍스트를 리턴(return)하는 엔드포인트다.
말그대로 탁구처럼 ping-pong 이다.
단순히 "pong"이라는 텍스트만 리턴하는 엔드포인트지만 이는 API 서버의 운행 여부를 간단하게 확인할 때 사용된다.
이러한 기능을 하는 엔드포인트를 헬스 체크(health check) 엔드포인트라고 한다.

이제 API 를 위한 기초 세팅을 하겠다.

앞으로 만들 API 코드가 위치할 디렉토리 생성

mkdir -p ~/Projects/api

  • mkdir: 새로운 디렉토리 생성
  • -p: 디렉토리의 중간 경로에 해당하는 디렉토리가 존재하지 않으면 자동으로 생성

📌 Linux 기반 운영체제의 커맨드에 익숙해질 필요도 있다.
필자는 아무 것도 모르는 상태로 혼자 고군분투하다가 커맨드에 조금 익숙해지게 되었는데 그냥 유튜브나 다른 강의에서 기초부터 배우는 걸 추천한다.
(나는 기초 지식 없이 stackoverflow 를 너무 맹신한 나머지 네트워크 연결과 터미널을 싹 다 날려먹었었고, Linux 의 nano 에디터로 어떻게든 살려보려했으나
이러다가 Windows도 건드릴 수 있다는 생각에 우분투를 포맷 했었다..
리눅스 잘못 건드리면 하루이틀쯤은 순삭이다..)

해당 디렉토리로 이동

cd ~/Projects/api

디렉토리 안에 "app.py" 라는 파일 생성

vim app.py

vim 말고도 다른 IDE를 사용해도 무방하다.

app.py 파일을 다음과 같이 수정한다.

from flask import Flask --- (1)

app = Flask(__name__) --- (2)

@app.route("/ping", methods=['GET']) --- (3)
def ping(): --- (4)
    return "pong"
  • (1): Flask를 사용하기 위해 Flask에서 Flask 클래스크를 임포트한다.
  • (2): 임포트한 Flask 클래스를 객체화(instantiate)시켜서
    app이라는 변수에 저장한다.
    • 이 app 변수가 API 애플리케이션이다.
      (정확히는 Flask 웹 애플리케이션이 된다.)
    • app 변수에 API의 설정과 엔드포인트들을 추가하면 API가 완성되는 것이다.
  • (3): Flask의 route 데코레이터를 사용하여 엔드포인트를 등록한다.
    • 이 경우에는 바로 다음 줄에 나오는 ping 함수를 엔드포인트 함수로 등록하였다.
    • 고유 주소는 "ping"이다.
    • HTTP 메소드는 GET으로 설정되어 등록되었다.

📌 @(var).route
: URL 규칙을 받아 해당하는 규칙의 URL로 요청이 들어온 경우 등록한 함수를 실행하게끔 설정한다.
route 데코레이터는 처음 들어봐서 따로 찾아봤다.
파이썬의 데코레이터 개념을 플라스크에서 이용했다.
데코레이터는 함수를 수정하지 않고 기능을 추가시키는 개념이다.
말그대로 route 데코레이터는 route(URL) 요청에 대한 기능을 함수에 추가시킨다.

  • (4): ping 함수를 정의하였다.
    • route 데코레이터를 통해서 엔드포인트로 등록된 함수이다.
    1. ping 엔드포인트는 단순히 "pong" 텍스트만을 리턴한다.
    2. ping 엔드포인트를 구현하는 ping 함수에서도 단순히 "pong" 스트링을 리턴한다.
    3. Flask 가 알아서 HTTP 응답으로 변환하여 해당 HTTP 요청을 보낸 클라이언트에게 전송한다.

"app.py" 파일의 코드에서 특히 집중해야 하는 부분은 어떻게 엔드포인트를 지정하는가 이다.
Flask에서는 일반적으로 route 데코레이터를 사용해서 함수들을 엔드포인트로 등록하는 방식이 사용된다.
즉, Flask에서 엔드포인트를 구현한다는 것은 결국은 일반 함수를 구현하는 것과 큰 차이가 없다.



✔️ API 실행하기

다음 명령어를 실행시킨다.

FLASK_APP=app.py FLASK_DEBUG=1 flask run

  • FLASK_APP 환경 변수에는 Flask 애플리케이션을 실행시키는 파일을 지정해준다.

  • 지정된 파일은 명령어를 실행시키는 디렉토리에서 찾을 수 있어야 한다.

    • 따라서 Flask를 실행시키는 명령어는 일반적으로 해당 API의 repository 디렉토리에서 실행되어야 한다.
  • FLASK_DEBUG 환경 변수를 1로 지정해 놓으면 디버그(debug) 모드가 활성화된다.

    • 이는 코드가 수정되었을 때 Flask 애플리케이션을 자동으로 재시작하여 자동으로 반영되도록 하는 모드이다.

    • 굉장히 편리하므로 개발 시에 주로 활성화시키는 것이 좋다.

출력을 시키면
Running on http://127.0.0.1:5000/ 라는 텍스트가 보인다.
방금 실행시킨 "app.py"가 위 주소에서 돌아가고 있다는 뜻이다.
127.0.0.1은 로컬 호스트의 IP 주소다.

📌 로컬 호스트는 시스템이 실행되고 있는 해당 컴퓨터이다.
컴퓨터 환경에서는 자기 자신을 접근하는 경우가 굉장히 자주 있기 때문에 OS에서 항상 고정된 호스트 이름과 IP 주소를 제공하는데, 그것이 127.0.0.1이다.
따라서 해당 IP 주소는 예약(reserved)된 주소이며 일반 IP로 쓰일 수 없다.

ping 엔드포인트가 잘 돌아가는지 실제로 API에 접속하여 테스트한다.

  • ping 엔드포인트에 접속하기 위해서는 ping 엔드포인트에 HTTP요청을 보내야 한다.
    • 여러 방법이 있지만, 여기서는 터미널 명령어 환경에서 HTTP 요청을 보낼 수 있게 해주는 httpie라는 툴을 주로 사용할 것이다.

httpie 설치 (Ubuntu)

sudo apt install httpie

http 명령어를 이용해 HTTP 요청을 보낸다.

http -v GET http://localhost:5000/ping
(1)  (2)(3)		(4)
  • (1): http 명령어를 사용하여 HTTP 요청을 터미널에서 보낼 수 있다.
  • (2): -v 옵션은 "verbose" 옵션으로 해당 HTTP 요청과 응답에 관한 추가적인 정보를 출력한다.
  • (3): 해당 HTTP 요청의 HTTP 메소드를 "GET"으로 지정한다.
  • (4): 해당 HTTP 요청이 전송되어야 할 엔드포인트의 고유 주소를 지정한다.
    • 127.0.0.1 IP 주소의 포트 5000번에서 실행되고 있는 API의 "/ping" 주소에 지정되어 있는 엔드포인트로 HTTP 요청을 보내라고 명령하는 것이다.

터미널 2개를 사용하여 한 쪽은
FLASK_APP=app.py FLASK_DEBUG=1 flask run 을 입력하여 API를 실행하고

다른 한 쪽은
http -v GET http://localhost:5000/ping 을 입력하여 테스트를 한다.

정확히 입력했다면 터미널에서 보낸 HTTP 요청에 "pong"이라는 텍스트가 응답으로 올 것이다.

첫 번째 터미널

두 번째 터미널

API는 기본적으로 HTTP 통신에 기반을 두고 있다.
HTTP의 구조와 핵심 요소에 대해 반드시 알아두어야 한다.



Reference

  • 깔끔한 파이썬 탄탄한 백엔드 / 저자: 송은우

한달 전쯤에 한 번 해봤던 구간이지만 휘발성이 강한 탓에
여전히 새롭다는 느낌을 받는다..
내 뇌는 왜 항상 모든 게 새로울까..

0개의 댓글