Application Programming Interface 의 약자로 프로그램과 프로그램을 연결시켜주는 매개체
프로그램과 프로그램 사이에서 동작해서 사용하는 것으로 데이터가 되기도 하고 프로그램이 되기도 한다
프로그램 과 프로그램이 달라서 API가 필요
보안 때문에 구현
외부에서 내부의 데이터를 필요로 ㅎ나느 경우 내부의 데이터 저장소에 직접 접근하도록 하는 것은 위험하다
외부에서는 API Server 에게 요청을 하고 API Server는 그 요청을 받아서 내부의 저장소에 접근해서 필요한 데이터를 가져와 외부에 전달하는 형태로 구현
CSR (Client Side Rendering) 때문에 구현
클라이언트가 서버에게 데이터를 전송받아서 직접 화면을 구성하는 것을 CSR 이라고 한다
스마트폰의 경우는 무선 통신을 이용하는데 무선 통신은 언제든지 연결이 해제될 수 있다
만일 SSR(Server Side Rendering)을 이용하는 경우 서버와 네트워크가 끊어지면 스마트폰은 아무 일도 할 수가 없다
스마트폰이 서버에서 데이터를 받은 후 로컬에 저장한 후 출력을 하는 구조를 사용하면 네트워크가 끊어지더라도 로컬의 데이터를 이용해서 컨텐츠를 구현할 수 있음
서버가 요청을 받아서 처리한 후 뷰를 만들어서 클라이언트가 전달한다면 동일한 요청임에도 불구하고 클라이언트의 크기가 달라지거나 종류가 달라지면 요청 URL이 변경이 되어야 한다
서버는 클라이언트의 요청을 받아서 처리를 수행한 후 결과를 클라이언트에게 전송을 하고 클라이언트가 데이터를 해석해서 출력하는 구조로 만들면 동일한 URL로 여러 디바이스의 요청을 처리할 수 있다
Data Format
txt : csv(구분자가 있는 문자열) 형식의 문자열로 데이터를 전송하는 경우는 데이터가 절대로 변하지 않는 경우
xml(Extensible Markup Language) : 태그 형태로 데이터를 표현, HTML 보다 구조적이고 브라우저가 해석 하지 않음, 초창기에 자주 변경되는 데이터를 전송할 때 많이 사용
Json(Java script Object Notation) : 자바스크립트(파이썬)의 데이터 표현법의 문자열로 표현하는 방식, xml 보다 가볍고 자바스크립트 파싱 하는 것이 수월하기 때문에 현재 가장 많이 사용됨
{"속성": 데이터, "속성": 데이터..} : 하나의 객체 - dict (속성으로 구분)
[데이터 나열] : 배열 - list (인덱스로 구분)
Excel, pdf 는 뷰를 만들어 주는 것이지 데이터 포맷은 아님
Django 에서는 REST API 를 위한 프레임워크를 제공 : djangorestframework
pip install django
pip install djangorestframework
pip install mysql-client
pip install pymysql
<위에 패키지 import>
import pymysql
<db 부분>
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
django-admin startproject apiserver
cd apiserver
python manage.py startapp example
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'example',
]
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'restapidb',
'USER': 'euijoo',
'PASSWORD': 'euijoo',
'HOST': 'localhost',
'PORT' : '3306'
}
}
# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_TZ = True
$ python manage.py inspectdb
# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:hon3-config python3.10-config python3.9-config
# * Rearrange models' order
# * Make sure each model has one field with primary_key=True
# * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models
"""
from django.contrib import admin
from django.urls import path
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('example/', include('example.urls'))
]
from django.urls import path, include
from .views import helloAPI
urlpatterns = [
# example 에 오면 helloAPI를 불러라
path('hello',helloAPI),
]
from rest_framework.response import Response
from rest_framework.decorators import api_view
# @으로 시작하는 것은 decorator 라고 하는데
# 자주 사용하거나 만들기가 복잡한 코드가 있을 때
# 이 코드를 직접 작성하는 대신에 decorator 가 그 코드를 대신 작성!!
@api_view(['GET'])
def helloAPI(request):
return Response('전송될 데이터')
# Create your views here.
$ python manage.py runserver
응답 결과를 만들어내는 클래스
인스턴스를 생성할 때 첫번째 매개변수는 클라이언트에게 전송할 데이터이고 status는 상태
상태
100 번대 : 클라이언트가 서버로 보낸 요청이 문제가 없어서 다음 요청을 전송할 수 있다 라는 것을 의미
200 번대 : 정상처리
300 번대 : 리다이렉션 중 - 요청은 처리하고 다른 처리를 수행 중
400 번대 : 클라이언트 오류
500 번대 : 서버 오류 - 서버 프로그램이 잘못되었거나 처리 과정에 문제가 발생 <-> 개발자가 마주한다면 아마 알고리즘의 오류일 가능성이 높다
데이터를 다른 곳으로 전송할 수 있도록 변환하는 것
django 에서의 직렬화는 Model 데이터를 JSON으로 변환하는 것을 직렬화라고 한다
' 데이터를 문자열로 바꿔준다 ' 라고 쉽게 생각할 것
역직렬화 : 클라이언트가 전송한 JSON 문자열을 모델의 데이터로 변환하는 것
RESTAPI를 쓰게 되면 직렬화 작업이 필요하다
작업을 수행할 때 어떤 속성을 직렬화에 포함시키고 어떤 속성을 제외할 지를 결정해야 한다