📑
DRF
: Django REST Framework. RESTful API를 Django로 구축하기 위한 확장 프레임워크(패키지).
Http Message
- 요청과 응답은 구조가 비슷함.
- 시작(Start Line) - 실행되어야할 요청, 요청에 대한 성공 또는 실패
- HTTP Header - 요청에 대한 설명, 본문에 대한 설명
- 빈줄(Blank Line) - 메타 정보의 끝을 알림
- HTTP Body - 요청과 관련된 내용, 응답과 관련된 문서
예시
요청
Start Line - Method, Traget, HTTP Version
Headers - 요청에 필요한 여러가지 메타 정보
Body - 요청에 필요한 여러가지 데이터
응답
Start Line - HTTP Version, Status Code, Status Message
Headers - 응답에 대한 열가지 메타 정보
Body - 요청을 처리한 여러가지 데이터
• HTTP Request Methods 🔗
• HTTP Status Code 🔗
1XX | Informational Response |
2XX | Successful Response. 200(OK), 201(Created), 202(Accepted), 204(No content) |
3XX | Redirection Message |
4XX | Client Error Response. 400(Bad Request), 401(Unauthorized), 403(Forbidden 금지되거나 권한 없는 요청), 404(Not found. 요청한 자원을 찾을 수 없음) |
5XX | Server Error Response. 500(Internal Server Error), 503(Service Unavailable. 500과 달리 일시적) |
URL
¦----- URN
URI -------¦
¦----- URL
• URI : Uniform Resource Identifier. 통합 자원 식별자. 인터넷의 자원을 식별할 수 있는 유일한 문자열. URN과 URL은 URI의 하위 개념이다. 일반적으로 URN을 사용하는 비중이 낮기 때문에 URI = URL의 의미로 쓰이기도 한다.
• URN : Uniform Resource Locator. 통합 자원 위치. 웹상에 자원이 어디 있는지 나타내는 문자열. 어디에서 어떻게 리소스를 가져와야 하는지 나타낸다. 웹 주소, 링크.
• URL : Uniform Resource Name. 통합 자원 이름. 위치에 독립적인 자원을 위한 유일한 이름 역할. 리소스를 특정하는 이름.
• URI의 구조
https://www.aidenlim.dev:80/path/to/resource/?key=value#docs
Scheme(Protocol) | 브라우저가 사용하는 프로토콜. http, https, ftp, file, …
Host(Domain name) | 요청을 처리하는 웹 서버. IP 주소를 바로 사용할 수 있지만 도메인 이름을 받아서 사용하는 것이 일반적.
Port | 리소스에 접근할 때 사용되는 일종의 문(게이트). HTTP: 80 / HTTPS: 443이 표준 포트.
Path | 웹 서버에서의 리소스 경로. 웹 초기에는 실제 물리적인 위치를 나타냈으나 현재는 추상화된 형태를 표현함.
Query(Identifier) | 웹 서버에 제공하는 추가적인 변수. &로 구분되는 Key=Value 형태의 데이터.
Fragment(Anchor) | 해당 자원 안에서의 특정 위치 (북마크)를 나타냄. HTML 문서의 특정 부분을 보여주기 위한 방법.
RESTful API
API (Application Programming Interface) : 어플리케이션과 프로그래밍적으로 소통하는 방법. 소통에 필요한 서로 약속된 형식.
- CLI: 명령줄로 소통
- GUI: 그래픽으로 유저와 소통
- API: 프로그래밍으로 어플리케이션과 소통
Representational State Transfer
: 웹에 대한 소프트웨어 설계 방법론. 🔗
하나의 웹 페이지를 하나의 상태(State)로 본다면 유저가 링크를 입력하는 것은 상태 전이(State Transfer)가 일어나는 것이며 이때 유저가 받는 하나의 상태는 특정한 표현(Representational)에 의해 조작된다는 개념으로 이해할 수 있다.
RESTful API
: REST 원리를 따라 설계한 API . 결과를 보지 않고 요청 형식만 보더라도 추론이 가능.
POST /articles/ → 새로운 article 생성
GET /articles/ → article 목록 조회
GET /articles/1 → 1번 article 조회
DELETE /articles/1/ → 1번 article 삭제
• 일반적으로 GET(조회), POST(생성), PUT(전체 수정), DELETE(삭제) + PATCH(일부 수정)를 사용.
*핵심 규칙(따르지 않아도 오류가 생기는 것은 아님. 하지만 지키는 것이 좋다.)
1. 자원을 URI로 표현한다.
2. 행위는 HTTP Method로 표현한다.
3. 자원과 행위를 통해 표현되는 결과물로 일반적으로 JSON 형식을 사용한다.
4. URI는 동사가 아닌 명사의 나열로 사용한다. ex. POST/articles/create (X) POST/articles/ (O)
JSON
: JS 표기법을 따른 일종의 데이터를 담는 형식.
사람이 읽기 쉽고 프로그래밍으로 파싱(분석)하기 쉬움. 파이썬의 dict처럼 key-value 형식.
* XML, CSV, YAML 등의 형식도 있지만 일반적으로 JSON을 사용.
- .json 형식으로 사용
- 문자는 반드시 " "으로 묶기. true, false (반드시 소문자), 숫자 등을 사용할 수 있음.
["리스트", 1, true, "다양한 자료를 담을 수 있어요"] // list
{ key: value } // object
// example
{
"user1": {
"name": "aiden",
"age": 22,
"tags": ["python", "javascript", "django"]
},
"user2": {
...
},
...
}
*object 안에 또 object가 들어갈 수 있다(value자리에 또 key:value 쌍이 들어갈 수 있다).
✓ Django seed
: 모델에 정의된 필드를 보고 임의의 데이터를 자동으로 생성해 주는 패키지. 한번의 간단한 manage.py 명령으로 데이터베이스를 seed 할 수 있다.
pip install django-seed
pip freeze > requirements.txt
그 다음, settings.py에 넣어주기
이제 seeding을 해보자✨
python manage.py seed articles --number=30
# 30개의 랜덤데이터 생성(seeding)
이런 경우, pip install psycopg2 하고 다시 seeding해주면 된다~!
그러면 이렇게~~ 무작위 데이터 서른 개가 생성된다
JSON Response
JsonResponse는 HttpResponse의 subclass로, JSON-encoded response를 생성할수 있게 해준다. (import 필요)
✓ 근데 JsonResponse를 어디에 사용할까?
JsonResponse는 response를 커스터마이징 하여 전달하고 싶을 때 사용한다. http status code에 더하여 메세지를 입력해서 전달할 수 있다. 이 메세지를 프론트엔드 개발자가 보는데, 프론트엔드 개발자와 미리 약속한 메세지를 표시한다. 약속한 메세지가 딱히 없는 경우는 단순히 status code만 전달한다. 보안상 JsonResponse의 메세지 내용은 너무 자세하게 적지 않는 것이 좋다.
from django.shortcuts import render
from django.http import JsonResponse
from .models import Article
...
def json_01(request):
articles = Article.objects.all()
json_articles = []
for article in articles:
json_articles.append(
{
"title": article.title,
"content": article.content,
"created_at": article.created_at,
"updated_at": article.updated_at,
}
)
return JsonResponse(json_articles, safe=False)
*json_articles가 딕셔너리면 safe=False를 안 적어줘도 되는데 지금은 리스트이기 때문에 적어줌.
dict 타입이 아닌 객체는 직렬화(Serialization) 해야 하기 때문에 False로 설정해야 한다.
직렬화
Serialization.
객체 또는 데이터 구조를 저장하고 전송하기 위해 다른 포맷으로 변경하는 것.
데이터의 구조는 유지하면서 추후 재구성이 가능한 포맷으로 변환한다.
현재 python 객체 형태인 Queryset 또는 Model의 Instance를 전송 가능한 형태로 직렬화해, JSON, XML, YAML 등의 형태로 변환한다. Django도 내부적으로 다른 데이터 포맷으로 쉽게 직렬화 할 수 있는 기능을 제공한다
*공통적으로 데이터를 기술하는 데 사용할 수 되는 형식들 중 가장 널리 사용되는 것들이 XML JSON인데, XML보다 JSON이 좀 더 빨라서 요즘은 XML을 많이 사용하지 않는 추세.
from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
from .models import Article
from django.core import serializers
...
def json_02(request):
articles = Article.objects.all()
res_data = serializers.serialize("json", articles)
return HttpResponse(res_data, content_type="application/json")
Django가 제공하는 serializers를 사용해 직렬화함.
Django가 제공하는 serializers는 model 의존성이 크다(= 포맷을 유연하게 커스텀하기 어렵다).
직렬화하지 않고 반환할 때 ↴
from django.shortcuts import render
from django.http import JsonResponse
from .models import Article
def article_list_html(request):
articles = Article.objects.all()
context = {"articles": articles}
return render(request, "articles/article_list.html", context)
...