Python BackEnd: 첫 API 개발

0

BackEnd with Python

목록 보기
3/9
post-thumbnail

프레임워크와 라이브러리의 차이점

  • 라이브러리: 개발자의 코드 안에서 라이브러리가 실행된다

  • 프레임워크: 프레임워크가 개발자의 코드를 실행한다


가상환경을 위한 miniconda 설치

일단 설치할 때부터 '맥에 유해하다', '맥에 악영향을 줄 수 있다'
이렇게 겁주는 멘트가 나와서 겁났다.

일단 설치를 하기는 했다.

그런데 설치 후 $ conda list로 설치를 확인해보니
'conda command not found' 이러고 있다.

$ export PATH="/root/anaconda3/bin:$PATH"
경로를 잡아주는 것으로 해결했다.

하여간 뭔가 설치하는 건 방심할 수가 없다.
대체가 좀 깔끔하게 되는 게 많지 않은 것 같다.


API 만들어보기

가상환경 생성

$ conda create --name api python=3.7
일단 python=3.7은 입력하지 않았다.
python 버전을 선택한다는 게 나한텐 너무 무서운 일이다.

아무튼 입력하기만 하면 가상환경을 만들어주긴 만들어준다.

그리고 생성된 가상환경을 사용하기 위해서는 활성화 코드를 입력해야 한다
다음의 명령어를 사용한다
$ source activate api

희한하게 이게 또 그냥 된다.
Virtualenv를 사용할 때는 해당 디렉터리에 들어가서 가상 환경을 실행해줘야 했는데

conda의 경우엔 그냥 $ source activate api를 입력하는 것만으로 실행이 되었다.

비활성화는 $ source deactivate를 입력한다.

conda 가상환경 상태를 지속적으로 확인해주기 위해서
$ conda env list를 사용한다.

Flask 설치

일단 커맨드라인 가장 앞에 (api)가 떠 있는 걸 확인한다.
이게 진짜 개중요함.

무조건 가상환경 안에서 개발하는 걸로 약속임.

커맨드라인 가장 앞에 (api)를 확인했다면
$ pip install flask

하니까 안 된다 ㅋㅋ
혹시나해서
$ pip3 install flask

됨 ㅋㅋ
그냥 Virtualenv 쓸걸 그랬나? 이런 생각이 벌써 든다.
뭔가 불안하다.

일단 이게 설치가 제대로 됐는지부터 확인해봐야겠다.

from flask import Flask
app = Flask("test")

터미널에 한 줄씩 넣어볼 것임.

>> 로 계속 이어진다는 건 문제없다는 이야기네.
다행이다.


Ping 엔드포인트 구현하기

엔드포인트란?

  • API 서버가 제공하는 통신 채널 혹은 접점
  • 프론트엔드 서버 등의 클라이언트가 백엔드 API 서버와 통신할 때 엔드포인트에 접속한다
  • 각 엔드포인트는 고유의 URL주소를 가지고 이를 통해 해당 엔드포인트에 접속할 수 있다

각 엔드포인트는 고유의 기능을 담당하고 있다. 이러한 기능들을 가진 엔드포인트가 모여서 하나의 API를 구성하게 된다.

GraphQL의 경우 단 하나의 엔드포인트로 모든 기능을 제공한다

'ping' 엔드포인트를 호출하면 'pong'으로 응답이 돌아오게 만들 거임.

그렇게 단순한 걸 어디 써먹음?
헬스체크 기능에 사용한다.

헬스체크 엔드포인트?

해당 API서버가 현재 운행되고 있는지 아닌지를 간단하게 확인할 때 사용하는 기능이다.


API 코드 작성과 실행

이제부터 진짜로 만들어볼 것임.
일단 디렉터리 아무거나 하나 판다.

그리고 코드를 하나 짤 건데 파일의 이름은 app.py로 할 것임.

# Flask를 사용하기 위해 import
from flask import Flask

# import한 Flask 클래스를 객체화(instantiate)하고 변수에 할당
# app변수가 바로 API 어플리케이션이 된다(Flask 웹 어플리케이션)
# app 변수에 API의 설정과 엔드포인트를 추가하면 API가 완성된다
app = Flask(__name__)

# Flask의 route 데코레이터를 사용하여 엔드포인트 등록
# 고유 주소는 /ping HTTP메소드의 종류는 GET
@app.route("/ping", methods=['GET']

# "pong"만을 리턴하는 함수 구현
# Flask가 알아서 HTTP Response로 변환하여 클라이언트에게 전송
def ping():
    return "pong"

이 코드에서 주목할 점은 '어떻게 엔드포인트를 지정하는가'이다.

  • Flask에서는 일반적으로 route 데코레이터를 사용하여
    함수들을 엔드포인트로 등록한다
  • Flask에서 엔드포인트를 구현한다는 것은
    결국 일반 함수를 구현하는 것과 큰 차이가 없다

API 코드의 전체적인 구조가 일단 잡히면 그 다음부터는 엔드포인트들, 즉 함수들을 구현하는 것이 개발의 대부분이 된다.

작성한 코드 파일을 실행하려면 해당 디렉터리에 들어간 상태여야 한다.

$ FLASK_APP=app.py FLASK_DEBUG=1 flask run

로컬호스트 http://127.0.0.1:5000/ 에서 실행되었다.

이제 실제로 엔드포인트가 잘 돌아가는지 API에 접속해서 테스트해볼 것이다. ping 엔드포인트에 HTTP Request를 보내면 된다.

HTTP 요청을 보내는 방법에는 여러 가지가 있는데, httpie라는 툴을 사용해볼 것이다.

$ brew install httpie

설치가 됐으면 다음 명령어를 통해 HTTP Request를 해본다.
$ http -v GET http://localhost:5000/ping

  • -v는 verbose옵션이다.

  • 해당 HTTP 요청과 응답에 관한 추가적인 정보를 제공한다.

  • GET은 HTTP메소드를 'GET'으로 지정한 것이다.

  • 마지막의 주소는
    127.0.0.1 ip주소의 5000번 포트에서 실행되고 있는 API의 /ping에 지정되어 있는 엔드포인트에 HTTP요청을 하는 것이다

터미널에 pong이라고 뜨는 걸 볼 수 있다.
오른쪽 터미널에서는 API가 실행되고 있다.
왼쪽에서는 오른쪽의 API에 요청을 보내고 있다.

API가 클라이언트의 요청과 서버의 응답을 매개하고 있는 것이다.

외에도 브라우저에서 해당 url을 입력하면

마찬가지로 pong 응답이 나옴을 볼 수 있다.

백엔드 API 개발 입문에서 중요한 것

  • API 개발의 기본적인 핵심 개념들을 이해
  • 그 후 API 코드 전체적인 구조에 대해서 이해하고 구현

HTTP는 중요하다

점점 더 자세히 배울 것이고 HTTP 외에 다른 프로토콜을 사용하는 API도 있을 수 있지만 지금 고려할 것은 아니다.

0개의 댓글