알아두면 좋은 파이썬 개념 - 5. API & Web Application

4 minute read

‘알아두면 좋은 파이썬 개념’ 시리즈의 마지막 글로 파이썬을 활용한 API, Web Application 개발에 대해 알아보겠다.

API, Web Application

머신러닝 모델 등을 이용해 분석 모듈을 만들면 모듈을 사용할 방법이나 UI가 필요하다. 프로그래밍에서는 일반적으로 API를 통해 만든 기능을 사용할 수 있는 방법을 제공하고 웹페이지를 통해 사용할 UI를 제공한다. 파이썬은 Django와 Flask라는 웹프레임워크로 API 개발과 웹 어플리케이션 개발을 지원한다.

Application Programming Interface (API)

API는 GET, POST, PUT, DELETE 등의 method로 url을 통해 요청과 응답을 주고 받는다. 간단히 생각하면 GET은 조회, POST는 데이터를 올려 특정 결과를 응답 받기, PUT은 수정, DELETE는 삭제로 이해할 수 있다. 머신러닝 모델은 주로 POST를 이용해 데이터를 넘기고 예측값을 받아오는 방식이나 GET을 통해 배치성으로 생성된 값을 받아오는 방식으로 API를 설계하게 된다.

아래 코드는 http://127.0.0.1:8080/price/api/predict로 설계된 url에 POST로 데이터를 전달 받아 암호 화폐 가격 예측 모델을 실행시키는 Django API 구현 예시이다.

price/views.py

from rest_framework import views
from rest_framework import status
from rest_framework.response import Response
import json
from logic.prediction import predict_crpyto_price

class PredictPriceView(views.APIView):
    def post(request):
        try:
            request_body = json.loads(request.body)
            target = request_body['type']
            result = predict_crypto_price(target)

        except Exception as err:
            return Response(str(err), status=status.HTTP_400_BAD_REQUEST)
        return Response(result, status=status.HTTP_200_OK)

price/urls.py

from django.urls import path
from api.views import PredictPriceView


urlpatterns = [
    path('api/predict/', PricePredictView.as_view(), name="predict-price")
]

Django API 개발은 django-rest-framework 라이브러리의 클래스와 함수들을 활용해 이루어진다. 실제 로직이 포함되어 있는 PrdeictPriceView 클래스는 rest-framework의 views.APIView를 상속받고 그 안에 post() 함수를 정의해 구현한다. 정의된 클래스는 post request를 통해 온 json 데이터를 predict_crypto_price() 모델 함수에 넘겨주어 response로 예측값을 리턴하게 된다. urls.py에서는 정의된 클래스를 불러올 수 있는 url을 맵핑해 사용자나 개발자가 이를 호출할 수 있도록 한다.

Web Application

웹 어플리케이션은 우리가 쉽게 볼 수 있는 UI 환경이다. 현재 많은 분석 서비스들은 웹 환경에서 제공되고 있다. 파이썬은 API와 마찬가지로 Django와 Flask Web Framework를 통해 실제 작동하는 웹 어플리케이션을 만들 수 있다.

아래 예시는 Django로 만든 웹 어플리케이션 프로젝트의 디렉토리 구조이다.

Django 웹 프로젝트 구조 예시

.
├── README.md
├── __pycache__
│   └── cal.cpython-37.pyc
├── airbnb-clone-venv
│   ├── bin
│   ├── lib
│   └── pyvenv.cfg
├── assets
│   └── scss
├── config
│   ├── __init__.py
│   ├── __pycache__
│   ├── custom_storages.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── core
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── managers.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── gulpfile.js
├── manage.py
├── node_modules
│   ├── @fullhuman
│   ├── @nodelib
│   ├── abbrev
│   └── ...
├── package-lock.json
├── package.json
├── requirements.txt
├── reviews
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── management
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── rooms
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── management
│   ├── migrations
│   ├── models.py
│   ├── templatetags
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── secrets.json
├── static
│   ├── css
│   └── img
├── tailwind.config.js
├── templates
│   ├── 404.html
│   ├── base.html
│   ├── emails
│   ├── mixins
│   ├── partials
│   ├── rooms
│   └── users
└── users
    ├── __init__.py
    ├── __pycache__
    ├── admin.py
    ├── apps.py
    ├── forms.py
    ├── management
    ├── migrations
    ├── mixins.py
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py

Django는 MTV(Model-Template-View) 패턴을 활용해 웹을 개발한다. Model에서 데이터베이스와 연동해 데이터를 처리하는 객체를 만들고 View는 Model을 활용해 웹에서 작동하기 위한 로직을 작성한다. 마지막으로 Template에서는 View에 작성된 로직이 화면에 렌더링 될 때 HTML을 조작해 사용자가 보는 사이트의 화면을 구성하게 된다. 위 디렉토리 구조에서 models.py, views.py, templates/base.html 파일들로 이런 패턴의 적용을 확인할 수 있다.

Django vs Flask

Django와 Flask는 둘 다 훌륭한 파이썬 웹프레임워크지만 장단점이 존재한다.

Django는 많은 것이 이미 구현이 되어있는 웹프레임워크로 구현된 요소를 바탕으로 웹 사이트를 편리하게 만들기 좋은 프레임워크다. 하지만 Django는 정의되어 있는 구조에 대한 커스터마이즈 폭이 상대적으로 좁고 구현된 요소가 많기 때문에 처음 배우는 데 약간의 시간이 걸린다.

반면, Flask는 기본적인 기능들만 구현되어 있어 Django에 비해서는 많은 부분을 직접 개발해야 되는 프레임워크다. 또한, 정의되어 있는 기능이 많지 않아 프레임워크를 배우는데 걸리는 시간이 상대적으로 짧다.

일반적으로 파이썬으로 웹 개발을 하게 되면 Django를 쓰게 된다. 하지만, 정말 간단한 사이트나 테스트용 api를 만들거나 반대로 커스터마이즈가 많이 필요한 웹 사이트를 만들 때는 Flask의 사용도 고려해볼만 하다.

마치며

시리즈 글들 통해 파이썬의 여러가지 개념들에 대해 알아보았다. 조건문, 반복문, 함수 등의 기본적인 언어 사용법 외에 파이썬을 더 잘 사용하려는 과정에서 계속해서 검색하고 알아보았던 내용들에 대해 정리해보았다. 상세하게 작성하기보다는 ‘이런 것들이 있구나’라는 것을 알고 나중에 찾아서 쓸 수 있기를 바라는 마음으로 작성했다. 기회가 된다면 시리즈에 나온 개념들을 사용해서 실용적인 케이스를 만드는 별도 포스트를 작성해 볼 생각이다.

파이썬은 다양한 프로그래밍 패러다임을 지원하고 느리다고 하지만 속도를 개선할 방법도 있으며 API와 웹도 만들 수 있는 만능 언어처럼 보인다. 맞는 말이다. 다만, 파이썬을 더 공부하게 되면 특정 프로그래밍 목적에서는 더 좋은 다른 수단들(e.g. java 스프링 프레임워크, scala spark)이 있는 것을 알게 된다. 파이썬만으로 모든 것을 개발하려기보다 효율성과 프로그래밍 구조를 고려해 다른 언어들을 섞어 쓴다면 문제를 해결하기 위한 더 좋은 코드를 작성할 수 있을 것이라 생각한다.

References

Leave a comment