PYTHON - 파이썬으로 REST API 개발하기 및 API 사용법 (feat. Flask, Request Package)

API

Python으로 REST API를 개발해보기 전에 생소한 용어부터 파악해보자.

먼저 API란 무엇일까? API (Application Programming Interface)는 쉽게 말해 내가 개발한 프로그램을 다른 컴퓨터에서 접근해 사용할 수 있도록 만든 인터페이스다.

예를 들어 내가 챗봇 프로그램을 개발했다고 해보자. 사실 프로그램이 돌아가기위해서는 복잡한 코드가 필요한데 프로그램을 사용하는 클라이언트 입장에서는 복잡한 코드는 관심없다. 대신 내가 어떤 request를 보내야하고, 어떤 response가 오는지에 더 관심있다. 이런 상황에서 API를 사용하면 복잡한 코드는 숨길 수 있으며 (information hiding) 대신 클라이언트가 보내야하는 request와 프로그램이 내보내는 response만 정의하면 된다. 따라서 프로그램과 컴퓨터(API의 클라이언트를 “유저”라고 말하지 않는 이유는 보통 API는 개발자가 사용하기 때문이다.) 사이의 통신이 쉬워진다.

API의 예로는 Web API, Software Library/Framework API, OS API 등등 다양하다.


REST API

오늘 Python으로 개발할 API는 REST API다. 그럼 REST API는 무엇일까?

REST API (Representation State Transfer)는 API 아키텍처의 한 종류다. 아래 6가지 특징을 만족하는 웹 API를 REST API라고 한다. 아래 6가지 특징은 서버와 클라이언트가 어떤 식으로 통신해야 하는지 정의한다.

  1. Client-Server Architecutre (Model)
    • 클라이언트 (보통은 웹 브라우저)와 서버 (보통은 웹 서버) 구조임.
  2. Statelessness
    • 서버에 클라이언트의 세션 정보가 남지 않음. 불필요한 세션 정보가 남지 않아 서버에 부담을 덜어준다는 장점이 있음.
  3. Cacheability
    • 서버는 캐싱이 가능한 response를 제공해야 함. 클라이언트는 response를 캐싱할 수 있어 통신 성능이 향상됨.
  4. Layered System
    • 클라이언트와 서버 사이에 여러 레이어가 추가될 수 있음. 추가될 수 있는 레이어로는 proxy, load balancer 등이 있음. 레이어가 추가되어도 클라이언트와 서버의 통신에는 영향을 미치지 않음.
  5. Code on Demand
    • 서버는 클라이언트가 바로 실행할 수 있는(executable or compiled) 코드를 reponse로 제공해야 함.
  6. Uniform Interface
    • 서버는 클라이언트가 요청한 형식으로 데이터를 response 해야함. 예를 들어 클라이언트가 “json” 형식을 요청하면 서버는 db에서 가져온 데이터라고 할지라도 가공해 json 형식으로 response해야 함.

Web API 중 위 6가지 특징을 만족하는 것을 RESTful API라고 한다.

RESTful API는 웹 통신 프로토콜 중 하나인 HTTP의 method를 사용해 데이터를 주고 받는다.

⚠️ HTTP request & response 작성법 쉬운 설명 바로 가기

  1. GET : 데이터를 있는 그대로 가져옴
  2. POST : request에 기재한 데이터 처리 방식대로 데이터를 가공한 후 가져옴
  3. PUT : request에 기재한 데이터 처리 방식대로 데이터를 생성하거나 변경한 후 가져옴
  4. DELETE : 데이터를 삭제함

Flask

본격적으로 python에서 Web API를 개발해보자. 준비물은 Python Web Framework다.

파이썬의 Web Framework는 Django, Flask, Webpy 등등이 있다. Django는 MTV (Model-Template-View) 패턴을 제공하기 때문에 완성도 높은 웹 페이지를 개발할 수 있지만 다소 복잡하다. 따라서 오늘은 상대적으로 가벼운 프레임워크인 Flask를 사용한다.

  • templates

  • static

  • flask instance => WSGI application

  • default content type => HTML

  • flask 실행하는 방법

    • if __name__ == "__main__":
        app.run() # parameter : ip, port, debug
      
    • FLASK_APP=app.py
      flask run
      

Python Request 패키지

Reference

  1. wiki API
  2. wiki REST